codexmate 0.0.20 → 0.0.22

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 (96) hide show
  1. package/README.md +289 -152
  2. package/README.zh.md +321 -0
  3. package/cli/agents-files.js +224 -0
  4. package/cli/archive-helpers.js +446 -0
  5. package/cli/auth-profiles.js +359 -0
  6. package/cli/builtin-proxy.js +1044 -0
  7. package/cli/claude-proxy.js +998 -0
  8. package/cli/config-bootstrap.js +384 -0
  9. package/cli/openai-bridge.js +950 -0
  10. package/cli/openclaw-config.js +629 -0
  11. package/cli/session-usage.concurrent.js +28 -0
  12. package/cli/session-usage.js +112 -0
  13. package/cli/session-usage.models.js +176 -0
  14. package/cli/skills.js +1141 -0
  15. package/cli/zip-commands.js +510 -0
  16. package/cli.js +9408 -9719
  17. package/lib/cli-models-utils.js +109 -1
  18. package/lib/cli-path-utils.js +69 -0
  19. package/lib/cli-sessions.js +386 -0
  20. package/lib/download-artifacts.js +77 -0
  21. package/lib/task-orchestrator.js +869 -0
  22. package/package.json +14 -10
  23. package/res/logo.png +0 -0
  24. package/res/vue.global.prod.js +13 -0
  25. package/web-ui/app.js +193 -15
  26. package/web-ui/index.html +5 -1
  27. package/web-ui/logic.agents-diff.mjs +1 -1
  28. package/web-ui/logic.claude.mjs +60 -0
  29. package/web-ui/logic.runtime.mjs +11 -7
  30. package/web-ui/logic.sessions.mjs +372 -21
  31. package/web-ui/modules/api.mjs +22 -1
  32. package/web-ui/modules/app.computed.dashboard.mjs +23 -10
  33. package/web-ui/modules/app.computed.index.mjs +4 -0
  34. package/web-ui/modules/app.computed.main-tabs.mjs +198 -0
  35. package/web-ui/modules/app.computed.session.mjs +521 -9
  36. package/web-ui/modules/app.methods.agents.mjs +62 -11
  37. package/web-ui/modules/app.methods.codex-config.mjs +189 -34
  38. package/web-ui/modules/app.methods.index.mjs +7 -1
  39. package/web-ui/modules/app.methods.install.mjs +24 -20
  40. package/web-ui/modules/app.methods.navigation.mjs +142 -1
  41. package/web-ui/modules/app.methods.openclaw-core.mjs +339 -39
  42. package/web-ui/modules/app.methods.openclaw-editing.mjs +39 -4
  43. package/web-ui/modules/app.methods.openclaw-persist.mjs +122 -4
  44. package/web-ui/modules/app.methods.providers.mjs +192 -53
  45. package/web-ui/modules/app.methods.session-actions.mjs +99 -19
  46. package/web-ui/modules/app.methods.session-browser.mjs +196 -5
  47. package/web-ui/modules/app.methods.session-timeline.mjs +22 -15
  48. package/web-ui/modules/app.methods.session-trash.mjs +3 -0
  49. package/web-ui/modules/app.methods.startup-claude.mjs +70 -71
  50. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -0
  51. package/web-ui/modules/config-mode.computed.mjs +2 -0
  52. package/web-ui/modules/config-template-confirm-pref.mjs +33 -0
  53. package/web-ui/modules/i18n.mjs +1609 -0
  54. package/web-ui/modules/plugins.computed.mjs +220 -0
  55. package/web-ui/modules/plugins.methods.mjs +620 -0
  56. package/web-ui/modules/plugins.storage.mjs +37 -0
  57. package/web-ui/partials/index/layout-footer.html +1 -57
  58. package/web-ui/partials/index/layout-header.html +299 -175
  59. package/web-ui/partials/index/modal-config-template-agents.html +79 -29
  60. package/web-ui/partials/index/modal-confirm-toast.html +1 -1
  61. package/web-ui/partials/index/modal-health-check.html +14 -14
  62. package/web-ui/partials/index/modal-openclaw-config.html +47 -42
  63. package/web-ui/partials/index/modal-skills.html +130 -114
  64. package/web-ui/partials/index/modals-basic.html +71 -102
  65. package/web-ui/partials/index/panel-config-claude.html +50 -12
  66. package/web-ui/partials/index/panel-config-codex.html +34 -37
  67. package/web-ui/partials/index/panel-config-openclaw.html +10 -16
  68. package/web-ui/partials/index/panel-docs.html +147 -0
  69. package/web-ui/partials/index/panel-market.html +38 -38
  70. package/web-ui/partials/index/panel-orchestration.html +397 -0
  71. package/web-ui/partials/index/panel-plugins.html +243 -0
  72. package/web-ui/partials/index/panel-sessions.html +51 -146
  73. package/web-ui/partials/index/panel-settings.html +188 -96
  74. package/web-ui/partials/index/panel-usage.html +353 -0
  75. package/web-ui/session-helpers.mjs +221 -10
  76. package/web-ui/styles/base-theme.css +120 -229
  77. package/web-ui/styles/controls-forms.css +59 -51
  78. package/web-ui/styles/docs-panel.css +247 -0
  79. package/web-ui/styles/layout-shell.css +394 -128
  80. package/web-ui/styles/modals-core.css +18 -3
  81. package/web-ui/styles/navigation-panels.css +184 -183
  82. package/web-ui/styles/plugins-panel.css +518 -0
  83. package/web-ui/styles/responsive.css +102 -62
  84. package/web-ui/styles/sessions-list.css +13 -27
  85. package/web-ui/styles/sessions-preview.css +13 -7
  86. package/web-ui/styles/sessions-toolbar-trash.css +25 -0
  87. package/web-ui/styles/sessions-usage.css +581 -6
  88. package/web-ui/styles/settings-panel.css +166 -0
  89. package/web-ui/styles/skills-list.css +16 -11
  90. package/web-ui/styles/skills-market.css +63 -2
  91. package/web-ui/styles/task-orchestration.css +776 -0
  92. package/web-ui/styles/titles-cards.css +67 -66
  93. package/web-ui/styles.css +4 -0
  94. package/README.en.md +0 -259
  95. package/res/screenshot.png +0 -0
  96. package/res/vue.global.js +0 -18552
@@ -0,0 +1,243 @@
1
+ <div
2
+ v-show="mainTab === 'plugins'"
3
+ class="mode-content"
4
+ id="panel-plugins"
5
+ role="tabpanel"
6
+ aria-labelledby="tab-plugins">
7
+ <div class="plugins-layout">
8
+ <aside class="plugins-sidebar" :aria-label="t('plugins.sidebar.ariaList')">
9
+ <div class="selector-header plugins-sidebar-header">
10
+ <div>
11
+ <span class="selector-title">{{ t('plugins.sidebar.title') }}</span>
12
+ <div class="plugins-panel-note">{{ t('plugins.sidebar.note') }}</div>
13
+ </div>
14
+ <div class="settings-tab-actions">
15
+ <button type="button" class="btn-tool btn-tool-compact" @click="loadPluginsOverview({ forceRefresh: true, silent: false })" :disabled="loading || !!initError || pluginsLoading">
16
+ {{ pluginsLoading ? t('plugins.refreshing') : t('plugins.refresh') }}
17
+ </button>
18
+ </div>
19
+ </div>
20
+
21
+ <div class="plugins-list" role="list">
22
+ <button
23
+ v-for="plugin in pluginsCatalog"
24
+ :key="'plugin-' + plugin.id"
25
+ type="button"
26
+ :class="['plugins-item', { active: pluginsActiveId === plugin.id }]"
27
+ :aria-current="pluginsActiveId === plugin.id ? 'page' : null"
28
+ :disabled="loading || !!initError || pluginsLoading"
29
+ @click="selectPlugin(plugin.id)">
30
+ <div class="plugins-item-main">
31
+ <div class="plugins-item-title">{{ plugin.title }}</div>
32
+ <div class="plugins-item-meta">{{ plugin.description }}</div>
33
+ </div>
34
+ <span :class="['pill', plugin.tone]">{{ plugin.statusLabel }}</span>
35
+ </button>
36
+ </div>
37
+ </aside>
38
+
39
+ <section class="plugins-main" :aria-label="t('plugins.main.ariaWorkspace')">
40
+ <div v-if="pluginsActiveId === 'prompt-templates'" class="plugins-panel">
41
+ <div class="plugins-panel-head">
42
+ <div class="plugins-panel-title">{{ t('plugins.promptTemplates.title') }}</div>
43
+ <div class="plugins-panel-subtitle">{{ t('plugins.promptTemplates.subtitle') }}</div>
44
+ </div>
45
+
46
+ <div class="prompt-templates-modebar" role="tablist" :aria-label="t('plugins.promptTemplates.mode.aria')">
47
+ <button
48
+ type="button"
49
+ role="tab"
50
+ :aria-selected="promptTemplatesMode === 'compose'"
51
+ :class="['mode-pill', { active: promptTemplatesMode === 'compose' }]"
52
+ @click="promptTemplatesMode = 'compose'">{{ t('plugins.promptTemplates.mode.compose') }}</button>
53
+ <button
54
+ type="button"
55
+ role="tab"
56
+ :aria-selected="promptTemplatesMode !== 'compose'"
57
+ :class="['mode-pill', { active: promptTemplatesMode !== 'compose' }]"
58
+ @click="promptTemplatesMode = 'manage'">{{ t('plugins.promptTemplates.mode.manage') }}</button>
59
+ </div>
60
+
61
+ <div v-if="promptTemplatesMode === 'compose'" class="prompt-compose">
62
+ <div class="prompt-compose-workspace">
63
+ <div class="prompt-compose-selected">
64
+ <div class="prompt-compose-selected-title">{{ (promptComposerActiveTemplate && promptComposerActiveTemplate.name) ? promptComposerActiveTemplate.name : t('plugins.promptTemplates.compose.chooseTemplate') }}</div>
65
+ <div class="prompt-compose-selected-meta">{{ (promptComposerActiveTemplate && promptComposerActiveTemplate.description) ? promptComposerActiveTemplate.description : t('plugins.promptTemplates.compose.chooseTemplateHint') }}</div>
66
+ </div>
67
+
68
+ <div class="prompt-compose-form">
69
+ <label class="form-label">{{ t('plugins.promptTemplates.compose.selectTemplate') }}</label>
70
+ <select
71
+ class="form-select prompt-compose-template-select"
72
+ :value="promptComposerSelectedTemplateId"
73
+ @change="selectPromptComposerTemplate($event.target.value)"
74
+ :disabled="pluginsLoading || !promptTemplatesList.length">
75
+ <option v-for="tpl in promptTemplatesList" :key="'compose-tpl-' + tpl.id" :value="tpl.id">
76
+ {{ tpl.name }}{{ tpl.isBuiltin ? '(内置)' : '' }}
77
+ </option>
78
+ </select>
79
+
80
+ <div v-if="!promptComposerActiveTemplate" class="plugins-panel-note">{{ t('plugins.promptTemplates.compose.empty') }}</div>
81
+ <div v-else class="plugins-panel-note">{{ t('plugins.promptTemplates.compose.varsHint') }}</div>
82
+ <div class="prompt-compose-actions">
83
+ <button
84
+ type="button"
85
+ class="btn-mini"
86
+ @click="selectPromptTemplate(promptComposerSelectedTemplateId)"
87
+ :disabled="pluginsLoading || !promptComposerSelectedTemplateId">{{ t('plugins.promptTemplates.compose.goManage') }}</button>
88
+ </div>
89
+ </div>
90
+
91
+ <div class="prompt-preview-block prompt-compose-preview">
92
+ <div class="prompt-vars-head">
93
+ <div>
94
+ <div class="prompt-vars-title">{{ t('plugins.promptTemplates.compose.outputTitle') }}</div>
95
+ <div class="plugins-panel-note">{{ t('plugins.promptTemplates.compose.outputHint') }}</div>
96
+ </div>
97
+ <button type="button" class="btn-mini" @click="copyPromptComposerRendered" :disabled="pluginsLoading || !promptComposerRendered">{{ t('plugins.promptTemplates.compose.copy') }}</button>
98
+ </div>
99
+ <textarea class="form-input prompt-preview-textarea" :value="promptComposerRendered" rows="10" readonly spellcheck="false" aria-label="Rendered prompt (composer)"></textarea>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+ <div v-else class="prompt-templates-grid">
105
+ <div class="prompt-templates-pane prompt-templates-pane-list">
106
+ <div class="prompt-templates-toolbar">
107
+ <input
108
+ class="form-input"
109
+ type="text"
110
+ v-model.trim="promptTemplatesKeyword"
111
+ aria-label="Search templates"
112
+ :placeholder="t('plugins.promptTemplates.manage.searchPlaceholder')">
113
+ <button type="button" class="btn-mini" @click="createPromptTemplate" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.manage.create') }}</button>
114
+ <button type="button" class="btn-mini" @click="exportPromptTemplates" :disabled="pluginsLoading || !promptTemplatesList.length">{{ t('plugins.promptTemplates.manage.export') }}</button>
115
+ <button type="button" class="btn-mini" @click="triggerPromptTemplatesImport" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.manage.import') }}</button>
116
+ </div>
117
+
118
+ <div v-if="pluginsLoading && !promptTemplatesLoadedOnce" class="skills-empty-state">{{ t('plugins.promptTemplates.manage.loading') }}</div>
119
+ <div v-else-if="!filteredPromptTemplates.length" class="skills-empty-state">{{ t('plugins.promptTemplates.manage.empty') }}</div>
120
+ <div v-else class="prompt-templates-list" role="list">
121
+ <button
122
+ v-for="tpl in filteredPromptTemplates"
123
+ :key="'prompt-template-' + tpl.id"
124
+ type="button"
125
+ :class="['prompt-template-item', { active: promptTemplateSelectedId === tpl.id }]"
126
+ :aria-current="promptTemplateSelectedId === tpl.id ? 'page' : null"
127
+ @click="selectPromptTemplate(tpl.id)">
128
+ <div class="prompt-template-item-main">
129
+ <div class="prompt-template-item-title">{{ tpl.name }}</div>
130
+ <div class="prompt-template-item-meta">
131
+ <span class="mono">{{ t('plugins.promptTemplates.manage.vars', { count: tpl.varCount }) }}</span>
132
+ <span>·</span>
133
+ <span class="mono">{{ tpl.updatedLabel }}</span>
134
+ </div>
135
+ </div>
136
+ <span :class="['pill', tpl.isBuiltin ? 'configured' : 'source']">{{ tpl.isBuiltin ? t('plugins.promptTemplates.manage.builtin') : t('plugins.promptTemplates.manage.custom') }}</span>
137
+ </button>
138
+ </div>
139
+ </div>
140
+
141
+ <div class="prompt-templates-pane prompt-templates-pane-editor">
142
+ <div v-if="!promptTemplateDraft" class="skills-empty-state">{{ t('plugins.promptTemplates.editor.selectHint') }}</div>
143
+ <template v-else>
144
+ <div class="prompt-editor-head">
145
+ <div class="prompt-editor-title-row">
146
+ <input class="form-input prompt-editor-name" type="text" v-model.trim="promptTemplateDraft.name" :disabled="promptTemplateDraft.isBuiltin" :placeholder="t('plugins.promptTemplates.editor.namePlaceholder')" aria-label="Template name">
147
+ <div v-if="!promptTemplateDraft.isBuiltin" class="prompt-editor-actions">
148
+ <button type="button" class="btn-mini" @click="duplicatePromptTemplate" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.editor.duplicate') }}</button>
149
+ <button type="button" class="btn-mini delete" @click="deletePromptTemplate" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.editor.delete') }}</button>
150
+ <button type="button" class="btn-mini" @click="savePromptTemplate" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.editor.save') }}</button>
151
+ </div>
152
+ </div>
153
+ <div v-if="promptTemplateDraft.isBuiltin" class="plugins-panel-note">
154
+ {{ t('plugins.promptTemplates.editor.builtinReadOnly') }}
155
+ </div>
156
+ <input class="form-input" type="text" v-model.trim="promptTemplateDraft.description" :disabled="promptTemplateDraft.isBuiltin" :placeholder="t('plugins.promptTemplates.editor.descPlaceholder')" aria-label="Template description">
157
+ </div>
158
+
159
+ <div class="prompt-editor-body">
160
+ <label class="form-label">{{ t('plugins.promptTemplates.editor.templateLabel') }}</label>
161
+ <textarea
162
+ class="form-input prompt-editor-textarea"
163
+ v-model="promptTemplateDraft.template"
164
+ :disabled="promptTemplateDraft.isBuiltin"
165
+ rows="10"
166
+ spellcheck="false"
167
+ aria-label="Template body"
168
+ :placeholder="t('plugins.promptTemplates.editor.templatePlaceholder')"></textarea>
169
+
170
+ <div class="prompt-vars-block">
171
+ <div class="prompt-vars-head">
172
+ <div>
173
+ <div class="prompt-vars-title">{{ t('plugins.promptTemplates.vars.title') }}</div>
174
+ <div class="plugins-panel-note">{{ t('plugins.promptTemplates.vars.hint') }}</div>
175
+ </div>
176
+ <div v-if="!promptTemplateDraft.isBuiltin" class="prompt-editor-actions">
177
+ <button type="button" class="btn-mini" @click="addPromptTemplateVariable" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.vars.add') }}</button>
178
+ <button type="button" class="btn-mini" @click="resetPromptVariableValues" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.vars.reset') }}</button>
179
+ </div>
180
+ </div>
181
+
182
+ <div v-if="!promptTemplateVars.length" class="prompt-vars-empty">{{ t('plugins.promptTemplates.vars.empty') }}</div>
183
+ <div v-else class="prompt-vars-grid">
184
+ <label v-for="name in promptTemplateVars" :key="'prompt-var-' + name" class="prompt-var-row">
185
+ <span class="prompt-var-label mono">{{ name }}</span>
186
+ <input class="form-input prompt-var-input" type="text" :disabled="promptTemplateDraft.isBuiltin" :value="promptTemplateVarValues[name] || ''" @input="setPromptVariableValue(name, $event.target.value)" :placeholder="t('plugins.promptTemplates.vars.valuePlaceholder', { name })">
187
+ </label>
188
+ </div>
189
+ </div>
190
+
191
+ <div class="prompt-preview-block">
192
+ <div class="prompt-vars-head">
193
+ <div>
194
+ <div class="prompt-vars-title">{{ t('plugins.promptTemplates.preview.title') }}</div>
195
+ <div class="plugins-panel-note">{{ t('plugins.promptTemplates.preview.hint') }}</div>
196
+ </div>
197
+ <button type="button" class="btn-mini" @click="copyRenderedPrompt" :disabled="pluginsLoading">{{ t('plugins.promptTemplates.preview.copy') }}</button>
198
+ </div>
199
+ <textarea class="form-input prompt-preview-textarea" :value="renderedPrompt" rows="10" readonly spellcheck="false" aria-label="Rendered prompt"></textarea>
200
+ </div>
201
+ </div>
202
+ </template>
203
+ </div>
204
+ </div>
205
+ </div>
206
+
207
+ <div v-else class="skills-empty-state">{{ t('plugins.promptTemplates.noPluginSelected') }}</div>
208
+ </section>
209
+ </div>
210
+ </div>
211
+
212
+ <input
213
+ ref="promptTemplatesImportInput"
214
+ type="file"
215
+ accept=".json,application/json"
216
+ style="display:none"
217
+ @change="handlePromptTemplatesImportChange">
218
+
219
+ <!-- 新增变量(Prompt Templates) -->
220
+ <div v-if="showPromptTemplateVarModal" class="modal-overlay" @click.self="closePromptTemplateVarModal">
221
+ <div class="modal" role="dialog" aria-modal="true" aria-labelledby="add-prompt-var-modal-title">
222
+ <div class="modal-title" id="add-prompt-var-modal-title">{{ t('plugins.promptTemplates.varModal.title') }}</div>
223
+
224
+ <div class="form-group">
225
+ <label class="form-label">{{ t('plugins.promptTemplates.varModal.nameLabel') }}</label>
226
+ <input
227
+ ref="promptTemplateVarNameInput"
228
+ v-model.trim="promptTemplateVarDraftName"
229
+ :class="['form-input', { invalid: !!promptTemplateVarDraftError }]"
230
+ :placeholder="t('placeholder.varNameExample')"
231
+ autocomplete="off"
232
+ spellcheck="false"
233
+ @keydown.enter.prevent="confirmAddPromptTemplateVariable">
234
+ <div v-if="promptTemplateVarDraftError" class="form-hint form-error">{{ promptTemplateVarDraftError }}</div>
235
+ <div v-else class="form-hint">{{ t('hint.varNameRules') }}</div>
236
+ </div>
237
+
238
+ <div class="btn-group">
239
+ <button class="btn btn-cancel" @click="closePromptTemplateVarModal">{{ t('plugins.promptTemplates.varModal.cancel') }}</button>
240
+ <button class="btn btn-confirm" @click="confirmAddPromptTemplateVariable">{{ t('plugins.promptTemplates.varModal.add') }}</button>
241
+ </div>
242
+ </div>
243
+ </div>