codexmate 0.1.28 → 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 (41) 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/session-usage.js +2 -2
  5. package/cli.js +369 -15
  6. package/package.json +1 -1
  7. package/web-ui/app.js +3 -0
  8. package/web-ui/index.html +3 -2
  9. package/web-ui/logic.sessions.mjs +6 -4
  10. package/web-ui/modules/app.computed.session.mjs +52 -33
  11. package/web-ui/modules/app.methods.agents.mjs +36 -0
  12. package/web-ui/modules/app.methods.codex-config.mjs +3 -1
  13. package/web-ui/modules/app.methods.providers.mjs +12 -4
  14. package/web-ui/modules/app.methods.session-actions.mjs +10 -8
  15. package/web-ui/modules/app.methods.session-browser.mjs +3 -1
  16. package/web-ui/modules/app.methods.session-trash.mjs +16 -16
  17. package/web-ui/modules/app.methods.theme.mjs +5 -4
  18. package/web-ui/modules/i18n/locales/en.mjs +74 -1
  19. package/web-ui/modules/i18n/locales/ja.mjs +74 -1
  20. package/web-ui/modules/i18n/locales/vi.mjs +74 -1
  21. package/web-ui/modules/i18n/locales/zh-tw.mjs +74 -1
  22. package/web-ui/modules/i18n/locales/zh.mjs +74 -1
  23. package/web-ui/modules/i18n.mjs +7 -0
  24. package/web-ui/partials/index/modal-config-template-agents.html +1 -1
  25. package/web-ui/partials/index/modal-health-check.html +1 -1
  26. package/web-ui/partials/index/modal-openclaw-config.html +50 -50
  27. package/web-ui/partials/index/panel-dashboard.html +1 -1
  28. package/web-ui/partials/index/panel-prompts.html +2 -2
  29. package/web-ui/partials/index/panel-sessions.html +45 -28
  30. package/web-ui/partials/index/panel-settings.html +6 -0
  31. package/web-ui/res/web-ui-render.precompiled.js +219 -156
  32. package/web-ui/session-helpers.mjs +3 -0
  33. package/web-ui/styles/base-theme.css +2 -2
  34. package/web-ui/styles/bridge-pool.css +1 -1
  35. package/web-ui/styles/layout-shell.css +0 -1
  36. package/web-ui/styles/sessions-preview.css +77 -0
  37. package/web-ui/styles/theme-dark-tokens.css +2 -2
  38. package/web-ui/styles/theme-dark.css +2 -2
  39. package/web-ui/styles/theme-ocean-tokens.css +88 -0
  40. package/web-ui/styles/theme-ocean.css +920 -0
  41. package/web-ui/styles.css +1 -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'
@@ -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,
@@ -5553,7 +5611,12 @@ return function render(_ctx, _cache) {
5553
5611
  type: "button",
5554
5612
  class: _normalizeClass(['toggle-btn', { active: _ctx.theme === 'dark' }]),
5555
5613
  onClick: $event => (_ctx.setTheme('dark'))
5556
- }, _toDisplayString(_ctx.t('settings.theme.dark')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
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"])
5557
5620
  ]),
5558
5621
  _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.theme.hint')), 1 /* TEXT */)
5559
5622
  ])
@@ -7091,7 +7154,7 @@ return function render(_ctx, _cache) {
7091
7154
  _createElementVNode("div", { class: "form-hint" }, [
7092
7155
  _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
7093
7156
  (_ctx.agentsPath)
7094
- ? (_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 */))
7095
7158
  : _createCommentVNode("v-if", true),
7096
7159
  (_ctx.agentsPath)
7097
7160
  ? (_openBlock(), _createElementBlock("span", {
@@ -7643,7 +7706,7 @@ return function render(_ctx, _cache) {
7643
7706
  _createElementVNode("div", { class: "form-hint" }, [
7644
7707
  _createTextVNode(_toDisplayString(_ctx.sysPromptPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
7645
7708
  (_ctx.sysPromptPath)
7646
- ? (_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 */))
7647
7710
  : _createCommentVNode("v-if", true),
7648
7711
  (_ctx.sysPromptPath)
7649
7712
  ? (_openBlock(), _createElementBlock("span", {
@@ -9353,7 +9416,7 @@ return function render(_ctx, _cache) {
9353
9416
  _createElementVNode("div", { class: "form-hint" }, [
9354
9417
  _createTextVNode(_toDisplayString(_ctx.openclawConfigPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
9355
9418
  (_ctx.openclawConfigPath)
9356
- ? (_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 */))
9357
9420
  : _createCommentVNode("v-if", true)
9358
9421
  ]),
9359
9422
  _createElementVNode("div", {
@@ -9427,9 +9490,9 @@ return function render(_ctx, _cache) {
9427
9490
  _withDirectives(_createElementVNode("input", {
9428
9491
  "onUpdate:modelValue": $event => ((_ctx.openclawQuick.providerName) = $event),
9429
9492
  class: "form-input",
9430
- placeholder: "例如: custom-myapi",
9493
+ placeholder: _ctx.t('modal.openclaw.quick.providerNamePlaceholder'),
9431
9494
  onInput: _ctx.validateProviderName
9432
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onInput"]), [
9495
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onInput"]), [
9433
9496
  [_vModelText, _ctx.openclawQuick.providerName]
9434
9497
  ]),
9435
9498
  _createElementVNode("div", {
@@ -9515,7 +9578,7 @@ return function render(_ctx, _cache) {
9515
9578
  class: "btn btn-confirm btn-sm",
9516
9579
  onClick: _ctx.nextAccordionStep,
9517
9580
  disabled: !_ctx.openclawQuick.providerName
9518
- }, " 下一步 → ", 8 /* PROPS */, ["onClick", "disabled"])
9581
+ }, _toDisplayString(_ctx.t('modal.openclaw.next')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
9519
9582
  ])
9520
9583
  ], 512 /* NEED_PATCH */), [
9521
9584
  [_vShow, _ctx.openclawAccordionStep === 1]
@@ -9569,7 +9632,7 @@ return function render(_ctx, _cache) {
9569
9632
  ]),
9570
9633
  _createElementVNode("div", {
9571
9634
  class: _normalizeClass(["form-hint", { 'hint-error': !_ctx.openclawValidation.modelId.valid }])
9572
- }, _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 */)
9573
9636
  ]),
9574
9637
  _createElementVNode("div", { class: "form-group" }, [
9575
9638
  _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.displayName')), 1 /* TEXT */),
@@ -9580,7 +9643,7 @@ return function render(_ctx, _cache) {
9580
9643
  }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9581
9644
  [_vModelText, _ctx.openclawQuick.modelName]
9582
9645
  ]),
9583
- _createElementVNode("div", { class: "form-hint" }, "可选,用于显示")
9646
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.quick.modelNameHint')), 1 /* TEXT */)
9584
9647
  ]),
9585
9648
  _createElementVNode("div", { class: "form-group" }, [
9586
9649
  _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.contextAndMaxOutput')), 1 /* TEXT */),
@@ -9606,12 +9669,12 @@ return function render(_ctx, _cache) {
9606
9669
  _createElementVNode("button", {
9607
9670
  class: "btn btn-cancel btn-sm",
9608
9671
  onClick: _ctx.prevAccordionStep
9609
- }, " ← 上一步 ", 8 /* PROPS */, ["onClick"]),
9672
+ }, _toDisplayString(_ctx.t('modal.openclaw.prev')), 9 /* TEXT, PROPS */, ["onClick"]),
9610
9673
  _createElementVNode("button", {
9611
9674
  class: "btn btn-confirm btn-sm",
9612
9675
  onClick: _ctx.nextAccordionStep,
9613
9676
  disabled: !_ctx.openclawQuick.modelId
9614
- }, " 下一步 → ", 8 /* PROPS */, ["onClick", "disabled"])
9677
+ }, _toDisplayString(_ctx.t('modal.openclaw.next')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
9615
9678
  ])
9616
9679
  ], 512 /* NEED_PATCH */), [
9617
9680
  [_vShow, _ctx.openclawAccordionStep === 2]
@@ -9636,7 +9699,7 @@ return function render(_ctx, _cache) {
9636
9699
  ], 64 /* STABLE_FRAGMENT */))
9637
9700
  ]),
9638
9701
  _createElementVNode("span", { class: "accordion-title" }, _toDisplayString(_ctx.t('modal.openclaw.quick.optionsTitle')), 1 /* TEXT */),
9639
- _createElementVNode("span", { class: "accordion-status" }, "高级选项"),
9702
+ _createElementVNode("span", { class: "accordion-status" }, _toDisplayString(_ctx.t('modal.openclaw.quick.advancedOptions')), 1 /* TEXT */),
9640
9703
  (_openBlock(), _createElementBlock("svg", {
9641
9704
  class: "accordion-chevron",
9642
9705
  viewBox: "0 0 24 24",
@@ -9680,11 +9743,11 @@ return function render(_ctx, _cache) {
9680
9743
  _createElementVNode("button", {
9681
9744
  class: "btn btn-cancel btn-sm",
9682
9745
  onClick: _ctx.prevAccordionStep
9683
- }, " ← 上一步 ", 8 /* PROPS */, ["onClick"]),
9746
+ }, _toDisplayString(_ctx.t('modal.openclaw.prev')), 9 /* TEXT, PROPS */, ["onClick"]),
9684
9747
  _createElementVNode("button", {
9685
9748
  class: "btn btn-confirm btn-sm",
9686
9749
  onClick: _ctx.finishAccordionStep
9687
- }, " 完成 ✓ ", 8 /* PROPS */, ["onClick"])
9750
+ }, _toDisplayString(_ctx.t('modal.openclaw.finish')), 9 /* TEXT, PROPS */, ["onClick"])
9688
9751
  ])
9689
9752
  ], 512 /* NEED_PATCH */), [
9690
9753
  [_vShow, _ctx.openclawAccordionStep === 3]
@@ -9700,24 +9763,24 @@ return function render(_ctx, _cache) {
9700
9763
  ]),
9701
9764
  _createElementVNode("div", { class: "structured-section" }, [
9702
9765
  _createElementVNode("div", { class: "structured-header" }, [
9703
- _createElementVNode("span", { class: "structured-title" }, "结构化配置(高级)"),
9766
+ _createElementVNode("span", { class: "structured-title" }, _toDisplayString(_ctx.t('modal.openclaw.structured.title')), 1 /* TEXT */),
9704
9767
  _createElementVNode("span", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.structured.writeHint')), 1 /* TEXT */)
9705
9768
  ]),
9706
9769
  _createElementVNode("div", { class: "structured-grid" }, [
9707
9770
  _createElementVNode("div", { class: "structured-card" }, [
9708
9771
  _createElementVNode("div", { class: "structured-card-title" }, "Agents Defaults"),
9709
9772
  _createElementVNode("div", { class: "form-group" }, [
9710
- _createElementVNode("label", { class: "form-label" }, "主模型"),
9773
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.structured.primaryModel')), 1 /* TEXT */),
9711
9774
  _withDirectives(_createElementVNode("input", {
9712
9775
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.agentPrimary) = $event),
9713
9776
  class: "form-input",
9714
- placeholder: "例如: provider/model"
9715
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9777
+ placeholder: _ctx.t('modal.openclaw.structured.providerModelPlaceholder')
9778
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9716
9779
  [_vModelText, _ctx.openclawStructured.agentPrimary]
9717
9780
  ])
9718
9781
  ]),
9719
9782
  _createElementVNode("div", { class: "form-group" }, [
9720
- _createElementVNode("label", { class: "form-label" }, "备选模型"),
9783
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.structured.fallbackModels')), 1 /* TEXT */),
9721
9784
  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.agentFallbacks, (item, index) => {
9722
9785
  return (_openBlock(), _createElementBlock("div", {
9723
9786
  class: "list-row",
@@ -9726,28 +9789,28 @@ return function render(_ctx, _cache) {
9726
9789
  _withDirectives(_createElementVNode("input", {
9727
9790
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.agentFallbacks[index]) = $event),
9728
9791
  class: "form-input",
9729
- placeholder: "例如: provider/model"
9730
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9792
+ placeholder: _ctx.t('modal.openclaw.structured.providerModelPlaceholder')
9793
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9731
9794
  [_vModelText, _ctx.openclawStructured.agentFallbacks[index]]
9732
9795
  ]),
9733
9796
  _createElementVNode("button", {
9734
9797
  class: "btn-mini delete",
9735
9798
  onClick: $event => (_ctx.removeOpenclawFallback(index))
9736
- }, "删除", 8 /* PROPS */, ["onClick"])
9799
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9737
9800
  ]))
9738
9801
  }), 128 /* KEYED_FRAGMENT */)),
9739
9802
  _createElementVNode("button", {
9740
9803
  class: "btn-mini",
9741
9804
  onClick: _ctx.addOpenclawFallback
9742
- }, "添加备选", 8 /* PROPS */, ["onClick"])
9805
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addFallback')), 9 /* TEXT, PROPS */, ["onClick"])
9743
9806
  ]),
9744
9807
  _createElementVNode("div", { class: "form-group" }, [
9745
9808
  _createElementVNode("label", { class: "form-label" }, "Workspace"),
9746
9809
  _withDirectives(_createElementVNode("input", {
9747
9810
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.workspace) = $event),
9748
9811
  class: "form-input",
9749
- placeholder: "例如: ~/.openclaw/workspace"
9750
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9812
+ placeholder: _ctx.t('modal.openclaw.structured.workspacePlaceholder')
9813
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9751
9814
  [_vModelText, _ctx.openclawStructured.workspace]
9752
9815
  ])
9753
9816
  ]),
@@ -9756,8 +9819,8 @@ return function render(_ctx, _cache) {
9756
9819
  _withDirectives(_createElementVNode("input", {
9757
9820
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.timeout) = $event),
9758
9821
  class: "form-input",
9759
- placeholder: "例如: 600"
9760
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9822
+ placeholder: _ctx.t('modal.openclaw.structured.timeoutPlaceholder')
9823
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9761
9824
  [_vModelText, _ctx.openclawStructured.timeout]
9762
9825
  ])
9763
9826
  ]),
@@ -9766,8 +9829,8 @@ return function render(_ctx, _cache) {
9766
9829
  _withDirectives(_createElementVNode("input", {
9767
9830
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.contextTokens) = $event),
9768
9831
  class: "form-input",
9769
- placeholder: "例如: 4096"
9770
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9832
+ placeholder: _ctx.t('modal.openclaw.structured.contextTokensPlaceholder')
9833
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9771
9834
  [_vModelText, _ctx.openclawStructured.contextTokens]
9772
9835
  ])
9773
9836
  ]),
@@ -9776,8 +9839,8 @@ return function render(_ctx, _cache) {
9776
9839
  _withDirectives(_createElementVNode("input", {
9777
9840
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.maxConcurrent) = $event),
9778
9841
  class: "form-input",
9779
- placeholder: "例如: 2"
9780
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9842
+ placeholder: _ctx.t('modal.openclaw.structured.maxConcurrentPlaceholder')
9843
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9781
9844
  [_vModelText, _ctx.openclawStructured.maxConcurrent]
9782
9845
  ])
9783
9846
  ])
@@ -9785,7 +9848,7 @@ return function render(_ctx, _cache) {
9785
9848
  _createElementVNode("div", { class: "structured-card" }, [
9786
9849
  _createElementVNode("div", { class: "structured-card-title" }, "Env"),
9787
9850
  _createElementVNode("div", { class: "form-group" }, [
9788
- _createElementVNode("label", { class: "form-label" }, "环境变量"),
9851
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.structured.envVars')), 1 /* TEXT */),
9789
9852
  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.envItems, (item, index) => {
9790
9853
  return (_openBlock(), _createElementBlock("div", {
9791
9854
  class: "list-row",
@@ -9809,17 +9872,17 @@ return function render(_ctx, _cache) {
9809
9872
  _createElementVNode("button", {
9810
9873
  class: "btn-mini",
9811
9874
  onClick: $event => (_ctx.toggleOpenclawEnvItem(index))
9812
- }, _toDisplayString(item.show ? '隐藏' : '显示'), 9 /* TEXT, PROPS */, ["onClick"]),
9875
+ }, _toDisplayString(item.show ? _ctx.t('common.hide') : _ctx.t('common.show')), 9 /* TEXT, PROPS */, ["onClick"]),
9813
9876
  _createElementVNode("button", {
9814
9877
  class: "btn-mini delete",
9815
9878
  onClick: $event => (_ctx.removeOpenclawEnvItem(index))
9816
- }, "删除", 8 /* PROPS */, ["onClick"])
9879
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9817
9880
  ]))
9818
9881
  }), 128 /* KEYED_FRAGMENT */)),
9819
9882
  _createElementVNode("button", {
9820
9883
  class: "btn-mini",
9821
9884
  onClick: _ctx.addOpenclawEnvItem
9822
- }, "添加变量", 8 /* PROPS */, ["onClick"])
9885
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addEnvVar')), 9 /* TEXT, PROPS */, ["onClick"])
9823
9886
  ])
9824
9887
  ]),
9825
9888
  _createElementVNode("div", { class: "structured-card" }, [
@@ -9848,20 +9911,20 @@ return function render(_ctx, _cache) {
9848
9911
  _withDirectives(_createElementVNode("input", {
9849
9912
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.toolsAllow[index]) = $event),
9850
9913
  class: "form-input",
9851
- placeholder: "例如: fs.read*"
9852
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9914
+ placeholder: _ctx.t('modal.openclaw.structured.allowPlaceholder')
9915
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9853
9916
  [_vModelText, _ctx.openclawStructured.toolsAllow[index]]
9854
9917
  ]),
9855
9918
  _createElementVNode("button", {
9856
9919
  class: "btn-mini delete",
9857
9920
  onClick: $event => (_ctx.removeOpenclawToolsAllow(index))
9858
- }, "删除", 8 /* PROPS */, ["onClick"])
9921
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9859
9922
  ]))
9860
9923
  }), 128 /* KEYED_FRAGMENT */)),
9861
9924
  _createElementVNode("button", {
9862
9925
  class: "btn-mini",
9863
9926
  onClick: _ctx.addOpenclawToolsAllow
9864
- }, "添加 allow", 8 /* PROPS */, ["onClick"])
9927
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addAllow')), 9 /* TEXT, PROPS */, ["onClick"])
9865
9928
  ]),
9866
9929
  _createElementVNode("div", { class: "form-group" }, [
9867
9930
  _createElementVNode("label", { class: "form-label" }, "Deny"),
@@ -9873,29 +9936,29 @@ return function render(_ctx, _cache) {
9873
9936
  _withDirectives(_createElementVNode("input", {
9874
9937
  "onUpdate:modelValue": $event => ((_ctx.openclawStructured.toolsDeny[index]) = $event),
9875
9938
  class: "form-input",
9876
- placeholder: "例如: net.*"
9877
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
9939
+ placeholder: _ctx.t('modal.openclaw.structured.denyPlaceholder')
9940
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
9878
9941
  [_vModelText, _ctx.openclawStructured.toolsDeny[index]]
9879
9942
  ]),
9880
9943
  _createElementVNode("button", {
9881
9944
  class: "btn-mini delete",
9882
9945
  onClick: $event => (_ctx.removeOpenclawToolsDeny(index))
9883
- }, "删除", 8 /* PROPS */, ["onClick"])
9946
+ }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"])
9884
9947
  ]))
9885
9948
  }), 128 /* KEYED_FRAGMENT */)),
9886
9949
  _createElementVNode("button", {
9887
9950
  class: "btn-mini",
9888
9951
  onClick: _ctx.addOpenclawToolsDeny
9889
- }, "添加 deny", 8 /* PROPS */, ["onClick"])
9952
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.addDeny')), 9 /* TEXT, PROPS */, ["onClick"])
9890
9953
  ])
9891
9954
  ]),
9892
9955
  _createElementVNode("div", { class: "structured-card" }, [
9893
- _createElementVNode("div", { class: "structured-card-title" }, "Providers(只读)"),
9956
+ _createElementVNode("div", { class: "structured-card-title" }, _toDisplayString(_ctx.t('modal.openclaw.structured.providersTitle')), 1 /* TEXT */),
9894
9957
  (_ctx.openclawProviders.length === 0)
9895
9958
  ? (_openBlock(), _createElementBlock("div", {
9896
9959
  key: 0,
9897
9960
  class: "form-hint"
9898
- }, " 未发现 providers 配置(可能使用环境变量或外部配置)。 "))
9961
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.noProviders')), 1 /* TEXT */))
9899
9962
  : (_openBlock(), _createElementBlock("div", {
9900
9963
  key: 1,
9901
9964
  class: "provider-list"
@@ -9907,19 +9970,19 @@ return function render(_ctx, _cache) {
9907
9970
  }, [
9908
9971
  _createElementVNode("div", { class: "provider-header" }, [
9909
9972
  _createElementVNode("span", { class: "provider-name" }, _toDisplayString(provider.key), 1 /* TEXT */),
9910
- _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 */),
9911
9974
  (provider.isActive)
9912
9975
  ? (_openBlock(), _createElementBlock("span", {
9913
9976
  key: 0,
9914
9977
  class: "pill configured"
9915
- }, "使用中"))
9978
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.active')), 1 /* TEXT */))
9916
9979
  : _createCommentVNode("v-if", true)
9917
9980
  ]),
9918
9981
  (provider.fields.length === 0)
9919
9982
  ? (_openBlock(), _createElementBlock("div", {
9920
9983
  key: 0,
9921
9984
  class: "form-hint"
9922
- }, "未配置字段"))
9985
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.noFields')), 1 /* TEXT */))
9923
9986
  : (_openBlock(), _createElementBlock("div", {
9924
9987
  key: 1,
9925
9988
  class: "provider-fields"
@@ -9941,16 +10004,16 @@ return function render(_ctx, _cache) {
9941
10004
  ? (_openBlock(), _createElementBlock("div", {
9942
10005
  key: 2,
9943
10006
  class: "form-hint"
9944
- }, " 使用中的 provider 未在配置中显示:" + _toDisplayString(_ctx.openclawMissingProviders.join(', ')) + "。 ", 1 /* TEXT */))
10007
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.missingProviders', { list: _ctx.openclawMissingProviders.join(', ') })), 1 /* TEXT */))
9945
10008
  : _createCommentVNode("v-if", true)
9946
10009
  ]),
9947
10010
  _createElementVNode("div", { class: "structured-card" }, [
9948
- _createElementVNode("div", { class: "structured-card-title" }, "Agents(只读)"),
10011
+ _createElementVNode("div", { class: "structured-card-title" }, _toDisplayString(_ctx.t('modal.openclaw.structured.agentsTitle')), 1 /* TEXT */),
9949
10012
  (_ctx.openclawAgentsList.length === 0)
9950
10013
  ? (_openBlock(), _createElementBlock("div", {
9951
10014
  key: 0,
9952
10015
  class: "form-hint"
9953
- }, " 未发现 agents.list 配置。 "))
10016
+ }, _toDisplayString(_ctx.t('modal.openclaw.structured.noAgents')), 1 /* TEXT */))
9954
10017
  : (_openBlock(), _createElementBlock("div", {
9955
10018
  key: 1,
9956
10019
  class: "agent-list"
@@ -9970,13 +10033,13 @@ return function render(_ctx, _cache) {
9970
10033
  class: "agent-meta"
9971
10034
  }, [
9972
10035
  (agent.theme)
9973
- ? (_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 */))
9974
10037
  : _createCommentVNode("v-if", true),
9975
10038
  (agent.emoji)
9976
- ? (_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 */))
9977
10040
  : _createCommentVNode("v-if", true),
9978
10041
  (agent.avatar)
9979
- ? (_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 */))
9980
10043
  : _createCommentVNode("v-if", true)
9981
10044
  ]))
9982
10045
  : _createCommentVNode("v-if", true)
@@ -9989,7 +10052,7 @@ return function render(_ctx, _cache) {
9989
10052
  _createElementVNode("button", {
9990
10053
  class: "btn btn-confirm secondary",
9991
10054
  onClick: _ctx.syncOpenclawStructuredFromText
9992
- }, "从文本刷新", 8 /* PROPS */, ["onClick"]),
10055
+ }, _toDisplayString(_ctx.t('common.refreshFromText')), 9 /* TEXT, PROPS */, ["onClick"]),
9993
10056
  _createElementVNode("button", {
9994
10057
  class: "btn btn-confirm",
9995
10058
  onClick: _ctx.applyOpenclawStructuredToText
@@ -9997,20 +10060,20 @@ return function render(_ctx, _cache) {
9997
10060
  ])
9998
10061
  ]),
9999
10062
  _createElementVNode("div", { class: "form-group" }, [
10000
- _createElementVNode("label", { class: "form-label" }, "OpenClaw 配置(JSON5)"),
10063
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.openclaw.editorLabel')), 1 /* TEXT */),
10001
10064
  _withDirectives(_createElementVNode("textarea", {
10002
10065
  "onUpdate:modelValue": $event => ((_ctx.openclawEditing.content) = $event),
10003
10066
  class: "form-input template-editor",
10004
10067
  spellcheck: "false",
10005
10068
  readonly: _ctx.openclawSaving || _ctx.openclawApplying,
10006
- placeholder: "在这里编辑 OpenClaw 配置(JSON5)"
10007
- }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly"]), [
10069
+ placeholder: _ctx.t('modal.openclaw.editorPlaceholder')
10070
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly", "placeholder"]), [
10008
10071
  [_vModelText, _ctx.openclawEditing.content]
10009
10072
  ]),
10010
10073
  _createElementVNode("div", { class: "template-editor-warning" }, [
10011
10074
  (_ctx.openclawEditing.lockName && _ctx.isDefaultOpenclawConfig(_ctx.openclawEditing.name))
10012
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, "默认配置始终映射当前 openclaw.json,请直接使用“保存并应用”。"))
10013
- : (_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 */))
10014
10077
  ])
10015
10078
  ]),
10016
10079
  _createElementVNode("div", { class: "btn-group" }, [
@@ -10018,17 +10081,17 @@ return function render(_ctx, _cache) {
10018
10081
  class: "btn btn-cancel",
10019
10082
  onClick: _ctx.closeOpenclawConfigModal,
10020
10083
  disabled: _ctx.openclawSaving || _ctx.openclawApplying
10021
- }, "取消", 8 /* PROPS */, ["onClick", "disabled"]),
10084
+ }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
10022
10085
  _createElementVNode("button", {
10023
10086
  class: "btn btn-confirm",
10024
10087
  onClick: _ctx.saveOpenclawConfig,
10025
10088
  disabled: _ctx.openclawSaving || _ctx.openclawApplying || (_ctx.openclawEditing.lockName && _ctx.isDefaultOpenclawConfig(_ctx.openclawEditing.name))
10026
- }, _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"]),
10027
10090
  _createElementVNode("button", {
10028
10091
  class: "btn btn-confirm secondary",
10029
10092
  onClick: _ctx.saveAndApplyOpenclawConfig,
10030
10093
  disabled: _ctx.openclawSaving || _ctx.openclawApplying
10031
- }, _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"])
10032
10095
  ])
10033
10096
  ])
10034
10097
  ], 8 /* PROPS */, ["onClick"]))
@@ -10240,7 +10303,7 @@ return function render(_ctx, _cache) {
10240
10303
  _createElementVNode("div", { class: "form-hint" }, [
10241
10304
  _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
10242
10305
  (_ctx.agentsPath)
10243
- ? (_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 */))
10244
10307
  : _createCommentVNode("v-if", true)
10245
10308
  ])
10246
10309
  ]),
@@ -10680,7 +10743,7 @@ return function render(_ctx, _cache) {
10680
10743
  _createElementVNode("div", { class: "form-hint" }, [
10681
10744
  _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('config.health.ok') : _ctx.t('config.health.fail')) + " ", 1 /* TEXT */),
10682
10745
  (_ctx.healthCheckResult.issues)
10683
- ? (_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 */))
10684
10747
  : _createCommentVNode("v-if", true)
10685
10748
  ]),
10686
10749
  (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.type === 'remote-health-check')