codexmate 0.0.37 → 0.0.39
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.
- package/cli/analytics-export-args.js +68 -0
- package/cli/builtin-proxy.js +626 -207
- package/cli/openai-bridge.js +541 -210
- package/cli/session-usage.js +187 -1
- package/cli.js +84 -2
- package/package.json +1 -1
- package/web-ui/app.js +12 -3
- package/web-ui/modules/app.computed.main-tabs.mjs +37 -30
- package/web-ui/modules/app.methods.claude-config.mjs +111 -9
- package/web-ui/modules/app.methods.openclaw-editing.mjs +48 -0
- package/web-ui/modules/app.methods.openclaw-persist.mjs +13 -7
- package/web-ui/modules/app.methods.providers.mjs +36 -10
- package/web-ui/modules/app.methods.runtime.mjs +76 -1
- package/web-ui/modules/app.methods.startup-claude.mjs +1 -0
- package/web-ui/modules/config-mode.computed.mjs +3 -3
- package/web-ui/modules/i18n.dict.mjs +13 -0
- package/web-ui/modules/i18n.mjs +65 -16
- package/web-ui/modules/skills.methods.mjs +1 -1
- package/web-ui/partials/index/layout-header.html +16 -46
- package/web-ui/partials/index/modal-openclaw-config.html +135 -71
- package/web-ui/partials/index/modal-webhook.html +8 -8
- package/web-ui/partials/index/modals-basic.html +56 -16
- package/web-ui/partials/index/panel-config-claude.html +20 -20
- package/web-ui/partials/index/panel-config-codex.html +5 -5
- package/web-ui/partials/index/panel-config-openclaw.html +70 -64
- package/web-ui/partials/index/panel-dashboard.html +62 -77
- package/web-ui/partials/index/panel-settings.html +28 -7
- package/web-ui/partials/index/panel-trash.html +14 -14
- package/web-ui/res/web-ui-render.precompiled.js +846 -539
- package/web-ui/styles/controls-forms.css +6 -0
- package/web-ui/styles/dashboard.css +46 -14
- package/web-ui/styles/layout-shell.css +45 -0
- package/web-ui/styles/navigation-panels.css +3 -3
- package/web-ui/styles/openclaw-structured.css +383 -33
- package/web-ui/styles/responsive.css +68 -0
- package/web-ui/styles/sessions-usage.css +105 -9
- package/web-ui/styles/settings-panel.css +4 -0
- package/web-ui/partials/index/panel-config-codex.html.bak +0 -337
|
@@ -40,6 +40,27 @@
|
|
|
40
40
|
role="tabpanel"
|
|
41
41
|
aria-labelledby="settings-tab-general">
|
|
42
42
|
<div class="settings-grid">
|
|
43
|
+
<section id="settings-language" class="settings-card" :aria-label="t('settings.language.title')">
|
|
44
|
+
<div class="settings-card-main">
|
|
45
|
+
<div class="settings-card-content">
|
|
46
|
+
<div class="settings-card-title">{{ t('settings.language.title') }}</div>
|
|
47
|
+
<p class="settings-card-desc">{{ t('settings.language.meta') }}</p>
|
|
48
|
+
<label class="selector-label" for="settings-language-select">{{ t('settings.language.label') }}</label>
|
|
49
|
+
<select
|
|
50
|
+
id="settings-language-select"
|
|
51
|
+
class="model-select settings-language-select"
|
|
52
|
+
:value="lang"
|
|
53
|
+
@change="setLang($event.target.value)">
|
|
54
|
+
<option
|
|
55
|
+
v-for="option in languageOptions()"
|
|
56
|
+
:key="option.code"
|
|
57
|
+
:value="option.code">{{ option.nativeName }} · {{ option.englishName }}</option>
|
|
58
|
+
</select>
|
|
59
|
+
<p class="settings-card-hint">{{ t('settings.language.hint') }}</p>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</section>
|
|
63
|
+
|
|
43
64
|
<section class="settings-card" :aria-label="t('settings.sharePrefix.title')">
|
|
44
65
|
<div class="settings-card-main">
|
|
45
66
|
<div class="settings-card-content">
|
|
@@ -76,21 +97,21 @@
|
|
|
76
97
|
</div>
|
|
77
98
|
</section>
|
|
78
99
|
|
|
79
|
-
<section class="settings-card" :aria-label="'
|
|
100
|
+
<section class="settings-card" :aria-label="t('settings.webhook.title')">
|
|
80
101
|
<div class="settings-card-main">
|
|
81
102
|
<div class="settings-card-content">
|
|
82
|
-
<div class="settings-card-title">
|
|
83
|
-
<p class="settings-card-desc"
|
|
103
|
+
<div class="settings-card-title">{{ t('settings.webhook.title') }}</div>
|
|
104
|
+
<p class="settings-card-desc">{{ t('settings.webhook.meta') }}</p>
|
|
84
105
|
<div class="webhook-status">
|
|
85
106
|
<span class="webhook-status-dot" :class="{ active: webhookConfig.enabled }"></span>
|
|
86
|
-
<span class="webhook-status-label">{{ webhookConfig.enabled ? '
|
|
107
|
+
<span class="webhook-status-label">{{ webhookConfig.enabled ? t('settings.webhook.enabled') : t('settings.webhook.disabled') }}</span>
|
|
87
108
|
<code v-if="webhookConfig.url" class="webhook-url">{{ webhookConfig.url }}</code>
|
|
88
109
|
</div>
|
|
89
110
|
</div>
|
|
90
111
|
</div>
|
|
91
112
|
<button class="settings-card-action" @click="openWebhookModal" :class="{ 'settings-card-action--active': webhookConfig.enabled }">
|
|
92
|
-
<span v-if="webhookConfig.enabled">{{ webhookConfig.url ? '
|
|
93
|
-
<span v-else
|
|
113
|
+
<span v-if="webhookConfig.enabled">{{ webhookConfig.url ? t('settings.webhook.edit') : t('settings.webhook.configure') }}</span>
|
|
114
|
+
<span v-else>{{ t('settings.webhook.enable') }}</span>
|
|
94
115
|
</button>
|
|
95
116
|
</section>
|
|
96
117
|
</div>
|
|
@@ -136,7 +157,7 @@
|
|
|
136
157
|
<div class="settings-retention">
|
|
137
158
|
<label for="settings-trash-retention-days">{{ t('settings.trash.retentionLabel') }}</label>
|
|
138
159
|
<input id="settings-trash-retention-days" type="number" min="1" max="365" :value="sessionTrashRetentionDays" @change="setSessionTrashRetentionDays(Number($event.target.value))" class="settings-retention-input" />
|
|
139
|
-
<span
|
|
160
|
+
<span>{{ t('settings.trash.retentionUnit') }}</span>
|
|
140
161
|
</div>
|
|
141
162
|
<p class="settings-card-hint">{{ t('settings.trash.retentionHint') }}</p>
|
|
142
163
|
</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!--
|
|
1
|
+
<!-- Trash panel -->
|
|
2
2
|
<div
|
|
3
3
|
v-show="mainTab === 'trash'"
|
|
4
4
|
class="mode-content"
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
role="tabpanel"
|
|
7
7
|
aria-labelledby="tab-trash">
|
|
8
8
|
<div v-if="!loading" class="trash-panel-shell">
|
|
9
|
-
<!--
|
|
9
|
+
<!-- Empty state -->
|
|
10
10
|
<div v-if="getSessionTrashViewState() === 'empty'" class="trash-empty-state">
|
|
11
11
|
<svg class="trash-empty-svg" viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="1.2">
|
|
12
12
|
<path d="M20 22l4 32h16l4-32"/>
|
|
@@ -15,38 +15,38 @@
|
|
|
15
15
|
<path d="M28 30v16M36 30v16" stroke-width="1.6" stroke-linecap="round"/>
|
|
16
16
|
</svg>
|
|
17
17
|
<div class="trash-empty-title">{{ t('settings.trash.empty') }}</div>
|
|
18
|
-
<div class="trash-empty-hint"
|
|
18
|
+
<div class="trash-empty-hint">{{ t('settings.trash.emptyHint', { days: sessionTrashRetentionDays }) }}</div>
|
|
19
19
|
</div>
|
|
20
20
|
|
|
21
|
-
<!--
|
|
21
|
+
<!-- Loading state -->
|
|
22
22
|
<div v-else-if="getSessionTrashViewState() === 'loading'" class="trash-empty-state">
|
|
23
23
|
<div class="trash-spinner"></div>
|
|
24
24
|
<div class="trash-empty-title">{{ t('settings.trash.loading') }}</div>
|
|
25
25
|
</div>
|
|
26
26
|
|
|
27
|
-
<!--
|
|
27
|
+
<!-- Error state -->
|
|
28
28
|
<div v-else-if="getSessionTrashViewState() === 'retry'" class="trash-empty-state">
|
|
29
29
|
<svg class="trash-empty-svg" viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="1.2">
|
|
30
30
|
<circle cx="32" cy="32" r="22"/>
|
|
31
31
|
<path d="M32 20v16M32 44v2" stroke-width="2" stroke-linecap="round"/>
|
|
32
32
|
</svg>
|
|
33
33
|
<div class="trash-empty-title">{{ t('settings.trash.retry') }}</div>
|
|
34
|
-
<button class="btn-tool" @click="loadSessionTrash({ forceRefresh: true })"
|
|
34
|
+
<button class="btn-tool" @click="loadSessionTrash({ forceRefresh: true })">{{ t('common.retry') }}</button>
|
|
35
35
|
</div>
|
|
36
36
|
|
|
37
|
-
<!--
|
|
37
|
+
<!-- List state -->
|
|
38
38
|
<template v-else>
|
|
39
39
|
<div class="trash-toolbar">
|
|
40
40
|
<div class="trash-toolbar-left">
|
|
41
|
-
<span class="trash-toolbar-count">{{ sessionTrashCount }}
|
|
42
|
-
<span class="trash-toolbar-retention">{{ sessionTrashRetentionDays }}
|
|
41
|
+
<span class="trash-toolbar-count">{{ t('settings.trash.count', { count: sessionTrashCount }) }}</span>
|
|
42
|
+
<span class="trash-toolbar-retention">{{ t('settings.trash.retentionShort', { days: sessionTrashRetentionDays }) }}</span>
|
|
43
43
|
</div>
|
|
44
44
|
<div class="trash-toolbar-right">
|
|
45
|
-
<button class="btn-mini" @click="loadSessionTrash({ forceRefresh: true })" :disabled="sessionTrashLoading" :title="t('sessions.refresh')">
|
|
45
|
+
<button class="btn-mini" @click="loadSessionTrash({ forceRefresh: true })" :disabled="sessionTrashLoading" :aria-label="t('sessions.refresh')" :title="t('sessions.refresh')">
|
|
46
46
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="btn-icon-sm"><path d="M21 2v6h-6M3 12a9 9 0 0115-6.7L21 8M3 22v-6h6M21 12a9 9 0 01-15 6.7L3 16"/></svg>
|
|
47
47
|
</button>
|
|
48
48
|
<button class="btn-mini delete" @click="clearSessionTrash" :disabled="sessionTrashClearing || sessionTrashLoading || !(Number(sessionTrashCount) > 0)">
|
|
49
|
-
{{ sessionTrashClearing ? '
|
|
49
|
+
{{ sessionTrashClearing ? t('settings.trash.clearing') : t('settings.trash.clearShort') }}
|
|
50
50
|
</button>
|
|
51
51
|
</div>
|
|
52
52
|
</div>
|
|
@@ -63,10 +63,10 @@
|
|
|
63
63
|
</div>
|
|
64
64
|
</div>
|
|
65
65
|
<div class="trash-item-actions">
|
|
66
|
-
<button class="trash-action-btn restore" @click="restoreSessionTrash(item)" :disabled="sessionTrashLoading || sessionTrashClearing || isSessionTrashActionBusy(item)" :title="sessionTrashRestoring[getSessionTrashActionKey(item)] ? '
|
|
66
|
+
<button class="trash-action-btn restore" @click="restoreSessionTrash(item)" :disabled="sessionTrashLoading || sessionTrashClearing || isSessionTrashActionBusy(item)" :aria-label="sessionTrashRestoring[getSessionTrashActionKey(item)] ? t('settings.trash.restoring') : t('settings.trash.restore')" :title="sessionTrashRestoring[getSessionTrashActionKey(item)] ? t('settings.trash.restoring') : t('settings.trash.restore')">
|
|
67
67
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 12a9 9 0 119 9"/><path d="M3 4v6h6"/></svg>
|
|
68
68
|
</button>
|
|
69
|
-
<button class="trash-action-btn delete" @click="purgeSessionTrash(item)" :disabled="sessionTrashLoading || sessionTrashClearing || isSessionTrashActionBusy(item)" :title="sessionTrashPurging[getSessionTrashActionKey(item)] ? '
|
|
69
|
+
<button class="trash-action-btn delete" @click="purgeSessionTrash(item)" :disabled="sessionTrashLoading || sessionTrashClearing || isSessionTrashActionBusy(item)" :aria-label="sessionTrashPurging[getSessionTrashActionKey(item)] ? t('settings.trash.purging') : t('settings.trash.purge')" :title="sessionTrashPurging[getSessionTrashActionKey(item)] ? t('settings.trash.purging') : t('settings.trash.purge')">
|
|
70
70
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6M10 11v6M14 11v6"/></svg>
|
|
71
71
|
</button>
|
|
72
72
|
</div>
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
</div>
|
|
75
75
|
<div v-if="sessionTrashHasMoreItems" class="trash-list-footer">
|
|
76
76
|
<button class="btn-tool btn-tool-compact" @click="loadMoreSessionTrashItems" :disabled="sessionTrashLoading || sessionTrashClearing">
|
|
77
|
-
|
|
77
|
+
{{ t('settings.trash.loadMoreItems', { count: sessionTrashHiddenCount }) }}
|
|
78
78
|
</button>
|
|
79
79
|
</div>
|
|
80
80
|
</div>
|