codexmate 0.1.1 → 0.1.2

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.
@@ -11,6 +11,27 @@
11
11
  <button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
12
12
  </div>
13
13
  <div class="openclaw-layout">
14
+ <section class="settings-card settings-card--wide openclaw-summary-card" aria-label="OpenClaw 当前摘要">
15
+ <div class="settings-card-body">
16
+ <div class="openclaw-summary-header">
17
+ <div>
18
+ <div class="summary-eyebrow">OPENCLAW</div>
19
+ <div class="summary-title">配置与本地诊断</div>
20
+ </div>
21
+ <div class="summary-note">配置摘要</div>
22
+ </div>
23
+ <div class="openclaw-summary-grid">
24
+ <div v-for="item in getOpenclawStatusSummaryItems()" :key="item.key" :class="['openclaw-summary-item', item.tone || '']">
25
+ <div class="summary-item-label">{{ item.label }}</div>
26
+ <div class="summary-item-value">{{ item.value }}</div>
27
+ </div>
28
+ </div>
29
+ <div class="openclaw-diagnostic-note">
30
+ 本页仅管理配置与工作区文件。
31
+ </div>
32
+ </div>
33
+ </section>
34
+
14
35
  <section class="settings-card settings-card--wide openclaw-workspace-card">
15
36
  <div class="settings-card-body">
16
37
  <div class="openclaw-tools-grid">
@@ -18,27 +39,29 @@
18
39
  <div class="tool-icon">📄</div>
19
40
  <div class="tool-content">
20
41
  <div class="tool-title">AGENTS.md</div>
21
- <div class="tool-meta">{{ agentsLoading ? t('config.modelLoading') : t('openclaw.agents.hint') }}</div>
42
+ <div class="tool-meta">{{ agentsLoading ? t('config.modelLoading') : 'Workspace file' }}</div>
22
43
  </div>
23
44
  <svg class="tool-chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
24
45
  <path d="M9 18l6-6-6-6"/>
25
46
  </svg>
26
47
  </button>
27
48
 
28
- <div class="openclaw-workspace-card">
29
- <label class="workspace-label" for="openclaw-workspace-file">{{ t('openclaw.workspaceFile') }}</label>
30
- <div class="workspace-input-group">
31
- <input
32
- id="openclaw-workspace-file"
33
- class="form-input"
34
- v-model="openclawWorkspaceFileName"
35
- :placeholder="t('openclaw.workspace.placeholder')">
36
- <button class="btn-tool" @click="openOpenclawWorkspaceEditor" :disabled="loading || !!initError || agentsLoading">
37
- {{ agentsLoading ? t('config.modelLoading') : t('openclaw.workspace.open') }}
38
- </button>
49
+ <button
50
+ v-for="fileName in getOpenclawQuickWorkspaceFiles()"
51
+ :key="fileName"
52
+ type="button"
53
+ class="openclaw-tool-btn"
54
+ @click="openOpenclawQuickWorkspaceFile(fileName)"
55
+ :disabled="loading || !!initError || agentsLoading">
56
+ <div class="tool-icon">📄</div>
57
+ <div class="tool-content">
58
+ <div class="tool-title">{{ fileName }}</div>
59
+ <div class="tool-meta">Workspace file</div>
39
60
  </div>
40
- <div class="workspace-meta">{{ t('openclaw.workspace.hint') }}</div>
41
- </div>
61
+ <svg class="tool-chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
62
+ <path d="M9 18l6-6-6-6"/>
63
+ </svg>
64
+ </button>
42
65
  </div>
43
66
  </div>
44
67
  </section>
@@ -60,6 +83,11 @@
60
83
  <div class="card-content">
61
84
  <div class="card-title">{{ name }}</div>
62
85
  <div class="card-subtitle">{{ openclawSubtitle(config) }}</div>
86
+ <div v-if="openclawHasContent(config)" class="openclaw-config-summary-mini">
87
+ <span v-for="item in getOpenclawConfigSummary(config).slice(0, 3)" :key="item.key">
88
+ {{ item.label }}: {{ item.value }}
89
+ </span>
90
+ </div>
63
91
  </div>
64
92
  </div>
65
93
  <div class="card-trailing">
@@ -2243,6 +2243,32 @@ return function render(_ctx, _cache) {
2243
2243
  ]))
2244
2244
  : _createCommentVNode("v-if", true),
2245
2245
  _createElementVNode("div", { class: "openclaw-layout" }, [
2246
+ _createElementVNode("section", {
2247
+ class: "settings-card settings-card--wide openclaw-summary-card",
2248
+ "aria-label": "OpenClaw 当前摘要"
2249
+ }, [
2250
+ _createElementVNode("div", { class: "settings-card-body" }, [
2251
+ _createElementVNode("div", { class: "openclaw-summary-header" }, [
2252
+ _createElementVNode("div", null, [
2253
+ _createElementVNode("div", { class: "summary-eyebrow" }, "OPENCLAW"),
2254
+ _createElementVNode("div", { class: "summary-title" }, "配置与本地诊断")
2255
+ ]),
2256
+ _createElementVNode("div", { class: "summary-note" }, "配置摘要")
2257
+ ]),
2258
+ _createElementVNode("div", { class: "openclaw-summary-grid" }, [
2259
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getOpenclawStatusSummaryItems(), (item) => {
2260
+ return (_openBlock(), _createElementBlock("div", {
2261
+ key: item.key,
2262
+ class: _normalizeClass(['openclaw-summary-item', item.tone || ''])
2263
+ }, [
2264
+ _createElementVNode("div", { class: "summary-item-label" }, _toDisplayString(item.label), 1 /* TEXT */),
2265
+ _createElementVNode("div", { class: "summary-item-value" }, _toDisplayString(item.value), 1 /* TEXT */)
2266
+ ], 2 /* CLASS */))
2267
+ }), 128 /* KEYED_FRAGMENT */))
2268
+ ]),
2269
+ _createElementVNode("div", { class: "openclaw-diagnostic-note" }, " 本页仅管理配置与工作区文件。 ")
2270
+ ])
2271
+ ]),
2246
2272
  _createElementVNode("section", { class: "settings-card settings-card--wide openclaw-workspace-card" }, [
2247
2273
  _createElementVNode("div", { class: "settings-card-body" }, [
2248
2274
  _createElementVNode("div", { class: "openclaw-tools-grid" }, [
@@ -2254,7 +2280,7 @@ return function render(_ctx, _cache) {
2254
2280
  _createElementVNode("div", { class: "tool-icon" }, "📄"),
2255
2281
  _createElementVNode("div", { class: "tool-content" }, [
2256
2282
  _createElementVNode("div", { class: "tool-title" }, "AGENTS.md"),
2257
- _createElementVNode("div", { class: "tool-meta" }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('openclaw.agents.hint')), 1 /* TEXT */)
2283
+ _createElementVNode("div", { class: "tool-meta" }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : 'Workspace file'), 1 /* TEXT */)
2258
2284
  ]),
2259
2285
  (_openBlock(), _createElementBlock("svg", {
2260
2286
  class: "tool-chevron",
@@ -2266,28 +2292,30 @@ return function render(_ctx, _cache) {
2266
2292
  _createElementVNode("path", { d: "M9 18l6-6-6-6" })
2267
2293
  ]))
2268
2294
  ], 8 /* PROPS */, ["onClick", "disabled"]),
2269
- _createElementVNode("div", { class: "openclaw-workspace-card" }, [
2270
- _createElementVNode("label", {
2271
- class: "workspace-label",
2272
- for: "openclaw-workspace-file"
2273
- }, _toDisplayString(_ctx.t('openclaw.workspaceFile')), 1 /* TEXT */),
2274
- _createElementVNode("div", { class: "workspace-input-group" }, [
2275
- _withDirectives(_createElementVNode("input", {
2276
- id: "openclaw-workspace-file",
2277
- class: "form-input",
2278
- "onUpdate:modelValue": $event => ((_ctx.openclawWorkspaceFileName) = $event),
2279
- placeholder: _ctx.t('openclaw.workspace.placeholder')
2280
- }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
2281
- [_vModelText, _ctx.openclawWorkspaceFileName]
2295
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getOpenclawQuickWorkspaceFiles(), (fileName) => {
2296
+ return (_openBlock(), _createElementBlock("button", {
2297
+ key: fileName,
2298
+ type: "button",
2299
+ class: "openclaw-tool-btn",
2300
+ onClick: $event => (_ctx.openOpenclawQuickWorkspaceFile(fileName)),
2301
+ disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
2302
+ }, [
2303
+ _createElementVNode("div", { class: "tool-icon" }, "📄"),
2304
+ _createElementVNode("div", { class: "tool-content" }, [
2305
+ _createElementVNode("div", { class: "tool-title" }, _toDisplayString(fileName), 1 /* TEXT */),
2306
+ _createElementVNode("div", { class: "tool-meta" }, "Workspace file")
2282
2307
  ]),
2283
- _createElementVNode("button", {
2284
- class: "btn-tool",
2285
- onClick: _ctx.openOpenclawWorkspaceEditor,
2286
- disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
2287
- }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('openclaw.workspace.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2288
- ]),
2289
- _createElementVNode("div", { class: "workspace-meta" }, _toDisplayString(_ctx.t('openclaw.workspace.hint')), 1 /* TEXT */)
2290
- ])
2308
+ (_openBlock(), _createElementBlock("svg", {
2309
+ class: "tool-chevron",
2310
+ viewBox: "0 0 24 24",
2311
+ fill: "none",
2312
+ stroke: "currentColor",
2313
+ "stroke-width": "2"
2314
+ }, [
2315
+ _createElementVNode("path", { d: "M9 18l6-6-6-6" })
2316
+ ]))
2317
+ ], 8 /* PROPS */, ["onClick", "disabled"]))
2318
+ }), 128 /* KEYED_FRAGMENT */))
2291
2319
  ])
2292
2320
  ])
2293
2321
  ]),
@@ -2315,7 +2343,19 @@ return function render(_ctx, _cache) {
2315
2343
  _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
2316
2344
  _createElementVNode("div", { class: "card-content" }, [
2317
2345
  _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */),
2318
- _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(_ctx.openclawSubtitle(config)), 1 /* TEXT */)
2346
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(_ctx.openclawSubtitle(config)), 1 /* TEXT */),
2347
+ (_ctx.openclawHasContent(config))
2348
+ ? (_openBlock(), _createElementBlock("div", {
2349
+ key: 0,
2350
+ class: "openclaw-config-summary-mini"
2351
+ }, [
2352
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getOpenclawConfigSummary(config).slice(0, 3), (item) => {
2353
+ return (_openBlock(), _createElementBlock("span", {
2354
+ key: item.key
2355
+ }, _toDisplayString(item.label) + ": " + _toDisplayString(item.value), 1 /* TEXT */))
2356
+ }), 128 /* KEYED_FRAGMENT */))
2357
+ ]))
2358
+ : _createCommentVNode("v-if", true)
2319
2359
  ])
2320
2360
  ]),
2321
2361
  _createElementVNode("div", { class: "card-trailing" }, [
@@ -7171,37 +7211,6 @@ return function render(_ctx, _cache) {
7171
7211
  _createTextVNode(" " + _toDisplayString(_ctx.t('field.useBuiltinTransform')), 1 /* TEXT */)
7172
7212
  ])
7173
7213
  ]),
7174
- (_ctx.newProvider.useTransform)
7175
- ? (_openBlock(), _createElementBlock("div", {
7176
- key: 0,
7177
- class: "form-group"
7178
- }, [
7179
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.transformMaxRetries')), 1 /* TEXT */),
7180
- _withDirectives(_createElementVNode("input", {
7181
- "onUpdate:modelValue": $event => ((_ctx.newProvider.openaiBridgeMaxRetries) = $event),
7182
- type: "number",
7183
- min: "2",
7184
- max: "10",
7185
- step: "1",
7186
- class: _normalizeClass(['form-input', { invalid: !!_ctx.providerFieldError('add', 'openaiBridgeMaxRetries') }]),
7187
- onBlur: $event => (_ctx.normalizeProviderDraft('add'))
7188
- }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur"]), [
7189
- [
7190
- _vModelText,
7191
- _ctx.newProvider.openaiBridgeMaxRetries,
7192
- void 0,
7193
- { number: true }
7194
- ]
7195
- ]),
7196
- _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('hint.transformMaxRetries')), 1 /* TEXT */),
7197
- (_ctx.providerFieldError('add', 'openaiBridgeMaxRetries'))
7198
- ? (_openBlock(), _createElementBlock("div", {
7199
- key: 0,
7200
- class: "form-hint form-error"
7201
- }, _toDisplayString(_ctx.providerFieldError('add', 'openaiBridgeMaxRetries')), 1 /* TEXT */))
7202
- : _createCommentVNode("v-if", true)
7203
- ]))
7204
- : _createCommentVNode("v-if", true),
7205
7214
  _createElementVNode("div", { class: "btn-group" }, [
7206
7215
  _createElementVNode("button", {
7207
7216
  class: "btn btn-cancel",
@@ -7314,37 +7323,6 @@ return function render(_ctx, _cache) {
7314
7323
  ], 8 /* PROPS */, ["onClick", "title", "aria-label"])
7315
7324
  ])
7316
7325
  ]),
7317
- (_ctx.editingProvider.useTransform)
7318
- ? (_openBlock(), _createElementBlock("div", {
7319
- key: 0,
7320
- class: "form-group"
7321
- }, [
7322
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.transformMaxRetries')), 1 /* TEXT */),
7323
- _withDirectives(_createElementVNode("input", {
7324
- "onUpdate:modelValue": $event => ((_ctx.editingProvider.openaiBridgeMaxRetries) = $event),
7325
- type: "number",
7326
- min: "2",
7327
- max: "10",
7328
- step: "1",
7329
- class: _normalizeClass(['form-input', { invalid: !!_ctx.providerFieldError('edit', 'openaiBridgeMaxRetries') }]),
7330
- onBlur: $event => (_ctx.normalizeProviderDraft('edit'))
7331
- }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur"]), [
7332
- [
7333
- _vModelText,
7334
- _ctx.editingProvider.openaiBridgeMaxRetries,
7335
- void 0,
7336
- { number: true }
7337
- ]
7338
- ]),
7339
- _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('hint.transformMaxRetries')), 1 /* TEXT */),
7340
- (_ctx.providerFieldError('edit', 'openaiBridgeMaxRetries'))
7341
- ? (_openBlock(), _createElementBlock("div", {
7342
- key: 0,
7343
- class: "form-hint form-error"
7344
- }, _toDisplayString(_ctx.providerFieldError('edit', 'openaiBridgeMaxRetries')), 1 /* TEXT */))
7345
- : _createCommentVNode("v-if", true)
7346
- ]))
7347
- : _createCommentVNode("v-if", true),
7348
7326
  _createElementVNode("div", { class: "btn-group" }, [
7349
7327
  _createElementVNode("button", {
7350
7328
  class: "btn btn-cancel",
@@ -9234,8 +9212,10 @@ return function render(_ctx, _cache) {
9234
9212
  }, _toDisplayString(_ctx.agentsSaving ? (_ctx.agentsDiffVisible ? _ctx.t('common.saving') : _ctx.t('common.previewing')) : (_ctx.agentsDiffVisible ? _ctx.t('common.save') : _ctx.t('common.preview'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
9235
9213
  ])
9236
9214
  ]),
9237
- _createElementVNode("div", { class: "modal-editor-body" }, [
9238
- _createElementVNode("div", { class: "form-group" }, [
9215
+ _createElementVNode("div", {
9216
+ class: _normalizeClass(["modal-editor-body", { 'modal-editor-body--openclaw-workspace': _ctx.agentsContext === 'openclaw-workspace' }])
9217
+ }, [
9218
+ _createElementVNode("div", { class: "form-group agents-target-file-group" }, [
9239
9219
  _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.agents.targetFile')), 1 /* TEXT */),
9240
9220
  _createElementVNode("div", { class: "form-hint" }, [
9241
9221
  _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
@@ -9244,8 +9224,10 @@ return function render(_ctx, _cache) {
9244
9224
  : _createCommentVNode("v-if", true)
9245
9225
  ])
9246
9226
  ]),
9247
- _createElementVNode("div", { class: "form-group" }, [
9248
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t(_ctx.agentsContext === 'claude-project' ? 'modal.agents.contentLabel.claudeProject' : 'modal.agents.contentLabel')), 1 /* TEXT */),
9227
+ _createElementVNode("div", { class: "form-group agents-content-group" }, [
9228
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.agentsContext === 'openclaw-workspace'
9229
+ ? `${_ctx.agentsWorkspaceFileName || '工作区文件'} 内容`
9230
+ : _ctx.t(_ctx.agentsContext === 'claude-project' ? 'modal.agents.contentLabel.claudeProject' : 'modal.agents.contentLabel')), 1 /* TEXT */),
9249
9231
  (!_ctx.agentsLoading && (_ctx.hasAgentsContentChanged() || _ctx.agentsDiffVisible))
9250
9232
  ? (_openBlock(), _createElementBlock("div", {
9251
9233
  key: 0,
@@ -9343,7 +9325,7 @@ return function render(_ctx, _cache) {
9343
9325
  }, _toDisplayString(_ctx.t('diff.viewHint.preview')), 1 /* TEXT */))
9344
9326
  ])
9345
9327
  ])
9346
- ])
9328
+ ], 2 /* CLASS */)
9347
9329
  ])
9348
9330
  ], 8 /* PROPS */, ["onClick"]))
9349
9331
  : _createCommentVNode("v-if", true),
@@ -40,6 +40,7 @@ body::after {
40
40
 
41
41
  .app-shell.sidebar-collapsed {
42
42
  --side-rail-width: var(--side-rail-collapsed-width, 136px);
43
+ grid-template-columns: var(--side-rail-collapsed-width, 136px) minmax(0, 1fr);
43
44
  }
44
45
 
45
46
  .app-shell.standalone {
@@ -61,6 +61,85 @@
61
61
  max-height: calc(100vh - 56px);
62
62
  }
63
63
 
64
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) {
65
+ width: min(94vw, 1040px);
66
+ max-height: calc(100vh - 40px);
67
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.98) 0%, rgba(250, 246, 241, 0.96) 100%);
68
+ }
69
+
70
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .modal-editor-header {
71
+ padding: 18px 20px 12px;
72
+ border-bottom: 1px solid rgba(137, 111, 94, 0.10);
73
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.92), rgba(249, 244, 239, 0.82));
74
+ }
75
+
76
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .modal-title {
77
+ margin-bottom: 0;
78
+ font-size: 18px;
79
+ letter-spacing: -0.02em;
80
+ }
81
+
82
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .modal-header-actions {
83
+ gap: 6px;
84
+ }
85
+
86
+ .agents-modal .modal-editor-body--openclaw-workspace {
87
+ display: grid;
88
+ grid-template-columns: minmax(220px, 280px) minmax(0, 1fr);
89
+ gap: 14px;
90
+ padding: 16px 20px 20px;
91
+ overflow: hidden;
92
+ }
93
+
94
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .agents-target-file-group {
95
+ align-self: start;
96
+ margin-bottom: 0;
97
+ padding: 14px;
98
+ border: 1px solid rgba(137, 111, 94, 0.12);
99
+ border-radius: var(--radius-lg);
100
+ background: rgba(255, 255, 255, 0.72);
101
+ }
102
+
103
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .agents-target-file-group .form-hint {
104
+ margin-top: 8px;
105
+ font-family: var(--font-family-mono);
106
+ font-size: 12px;
107
+ line-height: 1.55;
108
+ overflow-wrap: anywhere;
109
+ }
110
+
111
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .agents-content-group {
112
+ min-width: 0;
113
+ margin-bottom: 0;
114
+ }
115
+
116
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .agents-content-group > .form-label {
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: space-between;
120
+ margin-bottom: 8px;
121
+ font-size: 13px;
122
+ font-weight: 600;
123
+ }
124
+
125
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .template-editor,
126
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .agents-diff-editor {
127
+ min-height: min(64vh, 620px);
128
+ max-height: min(68vh, 680px);
129
+ border-radius: var(--radius-lg);
130
+ border-color: rgba(137, 111, 94, 0.14);
131
+ background: rgba(255, 255, 255, 0.88);
132
+ font-size: 13px;
133
+ line-height: 1.62;
134
+ }
135
+
136
+ .agents-modal:has(.modal-editor-body--openclaw-workspace) .template-editor-warning {
137
+ margin-top: 8px;
138
+ padding: 10px 12px;
139
+ border-radius: var(--radius-md);
140
+ background: rgba(137, 111, 94, 0.06);
141
+ }
142
+
64
143
  .modal-editor-header {
65
144
  margin-bottom: 0;
66
145
  padding: var(--spacing-md) var(--spacing-md) 0;