codexmate 0.0.55 → 0.0.57
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/README.md +2 -0
- package/README.vi.md +2 -0
- package/README.zh.md +2 -0
- package/cli/local-bridge.js +221 -22
- package/cli.js +797 -134
- package/lib/task-orchestrator.js +90 -21
- package/lib/task-workspace-chat.js +292 -0
- package/package.json +2 -2
- package/web-ui/app.js +57 -129
- package/web-ui/modules/app.computed.main-tabs.mjs +304 -7
- package/web-ui/modules/app.computed.session.mjs +210 -0
- package/web-ui/modules/app.methods.agents.mjs +3 -0
- package/web-ui/modules/app.methods.claude-config.mjs +178 -22
- package/web-ui/modules/app.methods.codex-config.mjs +294 -65
- package/web-ui/modules/app.methods.navigation.mjs +71 -84
- package/web-ui/modules/app.methods.openclaw-editing.mjs +3 -6
- package/web-ui/modules/app.methods.providers.mjs +15 -1
- package/web-ui/modules/app.methods.runtime.mjs +7 -2
- package/web-ui/modules/app.methods.session-actions.mjs +25 -12
- package/web-ui/modules/app.methods.session-browser.mjs +23 -54
- package/web-ui/modules/app.methods.session-trash.mjs +0 -1
- package/web-ui/modules/app.methods.startup-claude.mjs +35 -17
- package/web-ui/modules/app.methods.task-orchestration.mjs +347 -8
- package/web-ui/modules/app.methods.tool-config-permissions.mjs +0 -3
- package/web-ui/modules/app.methods.web-ui-preferences.mjs +415 -68
- package/web-ui/modules/config-template-confirm-pref.mjs +2 -3
- package/web-ui/modules/i18n/locales/en.mjs +187 -28
- package/web-ui/modules/i18n/locales/ja.mjs +184 -25
- package/web-ui/modules/i18n/locales/vi.mjs +186 -33
- package/web-ui/modules/i18n/locales/zh-tw.mjs +187 -28
- package/web-ui/modules/i18n/locales/zh.mjs +189 -30
- package/web-ui/modules/i18n.mjs +5 -12
- package/web-ui/modules/provider-default-names.mjs +25 -0
- package/web-ui/modules/sessions-filters-url.mjs +1 -2
- package/web-ui/partials/index/layout-header.html +37 -14
- package/web-ui/partials/index/modal-health-check.html +69 -5
- package/web-ui/partials/index/panel-config-codex.html +2 -2
- package/web-ui/partials/index/panel-orchestration.html +489 -282
- package/web-ui/partials/index/panel-sessions.html +97 -17
- package/web-ui/res/web-ui-render.precompiled.js +1423 -732
- package/web-ui/session-helpers.mjs +4 -1
- package/web-ui/styles/layout-shell.css +157 -1
- package/web-ui/styles/navigation-panels.css +11 -0
- package/web-ui/styles/responsive.css +98 -0
- package/web-ui/styles/sessions-preview.css +212 -2
- package/web-ui/styles/sessions-toolbar-trash.css +61 -18
- package/web-ui/styles/skills-list.css +122 -0
- package/web-ui/styles/task-orchestration.css +2161 -4
- package/web-ui/styles/titles-cards.css +52 -0
|
@@ -21,28 +21,29 @@
|
|
|
21
21
|
</div>
|
|
22
22
|
</div>
|
|
23
23
|
<div v-else>
|
|
24
|
-
<div class="selector-section">
|
|
24
|
+
<div class="selector-section session-selector-section">
|
|
25
25
|
<div class="selector-header" style="display:none">
|
|
26
26
|
<span class="selector-title">{{ t('sessions.sourceTitle') }}</span>
|
|
27
27
|
<div class="selector-actions sessions-header-actions"></div>
|
|
28
28
|
</div>
|
|
29
|
+
<div class="session-source-tabs-row">
|
|
30
|
+
<div class="session-source-pills" role="group" :aria-label="t('sessions.sourceTitle')">
|
|
31
|
+
<button
|
|
32
|
+
v-for="src in sessionSourceOptions"
|
|
33
|
+
:key="src.value"
|
|
34
|
+
:class="['session-source-pill', { active: sessionFilterSource === src.value }]"
|
|
35
|
+
:data-source="src.value"
|
|
36
|
+
@click="setSessionSource(src.value)"
|
|
37
|
+
:disabled="sessionsLoading"
|
|
38
|
+
:aria-pressed="sessionFilterSource === src.value"
|
|
39
|
+
type="button">
|
|
40
|
+
<span class="session-source-pill-dot"></span>
|
|
41
|
+
<span class="session-source-pill-label">{{ src.label }}</span>
|
|
42
|
+
</button>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
29
45
|
<div class="session-toolbar">
|
|
30
46
|
<div class="session-toolbar-group session-toolbar-primary">
|
|
31
|
-
<div class="session-source-pills" role="radiogroup" aria-label="Session source">
|
|
32
|
-
<button
|
|
33
|
-
v-for="src in sessionSourceOptions"
|
|
34
|
-
:key="src.value"
|
|
35
|
-
:class="['session-source-pill', { active: sessionFilterSource === src.value }]"
|
|
36
|
-
:data-source="src.value"
|
|
37
|
-
@click="setSessionSource(src.value)"
|
|
38
|
-
:disabled="sessionsLoading"
|
|
39
|
-
:aria-pressed="sessionFilterSource === src.value"
|
|
40
|
-
role="radio"
|
|
41
|
-
type="button">
|
|
42
|
-
<span class="session-source-pill-dot"></span>
|
|
43
|
-
<span class="session-source-pill-label">{{ src.label }}</span>
|
|
44
|
-
</button>
|
|
45
|
-
</div>
|
|
46
47
|
<select
|
|
47
48
|
class="session-path-select"
|
|
48
49
|
v-model="sessionPathFilter"
|
|
@@ -241,6 +242,14 @@
|
|
|
241
242
|
:aria-label="(activeSession && sessionExporting[getSessionExportKey(activeSession)]) ? t('sessions.preview.exporting') : t('sessions.preview.export')">
|
|
242
243
|
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2v8"/><polyline points="4 7 8 10.5 12 7"/><path d="M2.5 12v1.5a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1V12"/></svg>
|
|
243
244
|
</button>
|
|
245
|
+
<button
|
|
246
|
+
class="btn-session-open session-brief-copy"
|
|
247
|
+
@click="copySessionWorkspaceBrief"
|
|
248
|
+
:disabled="!activeSessionWorkspaceSummary.available"
|
|
249
|
+
:title="t('sessions.workspace.copy')"
|
|
250
|
+
:aria-label="t('sessions.workspace.copy')">
|
|
251
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 2.5h6.5L13 5v8.5H4z"/><path d="M10.5 2.5V5H13"/><path d="M6 8h5"/><path d="M6 10.5h5"/></svg>
|
|
252
|
+
</button>
|
|
244
253
|
<div class="session-link-group">
|
|
245
254
|
<button
|
|
246
255
|
class="btn-session-open"
|
|
@@ -294,12 +303,77 @@
|
|
|
294
303
|
</div>
|
|
295
304
|
|
|
296
305
|
<div v-else class="session-preview-body">
|
|
306
|
+
<section v-if="activeSessionWorkspaceSummary.available" class="session-workspace" :aria-label="t('sessions.workspace.title')">
|
|
307
|
+
<div class="session-workspace-header">
|
|
308
|
+
<div>
|
|
309
|
+
<div class="session-workspace-kicker">{{ t('sessions.workspace.kicker') }}</div>
|
|
310
|
+
<h3 class="session-workspace-title">{{ t('sessions.workspace.title') }}</h3>
|
|
311
|
+
<p class="session-workspace-subtitle">
|
|
312
|
+
{{ t('sessions.workspace.subtitle', { count: activeSessionWorkspaceSummary.messageCount }) }}
|
|
313
|
+
</p>
|
|
314
|
+
</div>
|
|
315
|
+
<button class="btn-mini" type="button" @click="copySessionWorkspaceBrief">
|
|
316
|
+
{{ t('sessions.workspace.copy') }}
|
|
317
|
+
</button>
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
<div class="session-workspace-metrics">
|
|
321
|
+
<div v-for="metric in activeSessionWorkspaceSummary.metrics" :key="metric.key" class="session-workspace-metric">
|
|
322
|
+
<span class="session-workspace-metric-value">{{ metric.value }}</span>
|
|
323
|
+
<span class="session-workspace-metric-label">{{ metric.label }}</span>
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
|
+
|
|
327
|
+
<div class="session-workspace-grid">
|
|
328
|
+
<div class="session-workspace-card session-workspace-card-wide">
|
|
329
|
+
<div class="session-workspace-card-title">{{ t('sessions.workspace.signals') }}</div>
|
|
330
|
+
<ul v-if="activeSessionWorkspaceSummary.signals.length" class="session-workspace-list">
|
|
331
|
+
<li v-for="(item, index) in activeSessionWorkspaceSummary.signals" :key="'signal-' + index">{{ item }}</li>
|
|
332
|
+
</ul>
|
|
333
|
+
<div v-else class="session-workspace-empty">{{ t('sessions.workspace.empty') }}</div>
|
|
334
|
+
</div>
|
|
335
|
+
|
|
336
|
+
<div class="session-workspace-card">
|
|
337
|
+
<div class="session-workspace-card-title">{{ t('sessions.workspace.commands') }}</div>
|
|
338
|
+
<ul v-if="activeSessionWorkspaceSummary.commands.length" class="session-workspace-list session-workspace-code-list">
|
|
339
|
+
<li v-for="(item, index) in activeSessionWorkspaceSummary.commands" :key="'command-' + index"><code>{{ item }}</code></li>
|
|
340
|
+
</ul>
|
|
341
|
+
<div v-else class="session-workspace-empty">{{ t('sessions.workspace.noneCommands') }}</div>
|
|
342
|
+
</div>
|
|
343
|
+
|
|
344
|
+
<div class="session-workspace-card">
|
|
345
|
+
<div class="session-workspace-card-title">{{ t('sessions.workspace.files') }}</div>
|
|
346
|
+
<ul v-if="activeSessionWorkspaceSummary.files.length" class="session-workspace-list session-workspace-code-list">
|
|
347
|
+
<li v-for="(item, index) in activeSessionWorkspaceSummary.files" :key="'file-' + index"><code>{{ item }}</code></li>
|
|
348
|
+
</ul>
|
|
349
|
+
<div v-else class="session-workspace-empty">{{ t('sessions.workspace.noneFiles') }}</div>
|
|
350
|
+
</div>
|
|
351
|
+
|
|
352
|
+
<div class="session-workspace-card">
|
|
353
|
+
<div class="session-workspace-card-title">{{ t('sessions.workspace.links') }}</div>
|
|
354
|
+
<ul v-if="activeSessionWorkspaceSummary.links.length" class="session-workspace-list">
|
|
355
|
+
<li v-for="(item, index) in activeSessionWorkspaceSummary.links" :key="'link-' + index">{{ item }}</li>
|
|
356
|
+
</ul>
|
|
357
|
+
<div v-else class="session-workspace-empty">{{ t('sessions.workspace.noneLinks') }}</div>
|
|
358
|
+
</div>
|
|
359
|
+
|
|
360
|
+
<div class="session-workspace-card" :class="{ 'session-workspace-card-alert': activeSessionWorkspaceSummary.risks.length || activeSessionWorkspaceSummary.nextSteps.length }">
|
|
361
|
+
<div class="session-workspace-card-title">{{ t('sessions.workspace.risks') }}</div>
|
|
362
|
+
<ul v-if="activeSessionWorkspaceSummary.risks.length || activeSessionWorkspaceSummary.nextSteps.length" class="session-workspace-list">
|
|
363
|
+
<li v-for="(item, index) in activeSessionWorkspaceSummary.risks" :key="'risk-' + index">{{ item }}</li>
|
|
364
|
+
<li v-for="(item, index) in activeSessionWorkspaceSummary.nextSteps" :key="'next-' + index">{{ item }}</li>
|
|
365
|
+
</ul>
|
|
366
|
+
<div v-else class="session-workspace-empty">{{ t('sessions.workspace.noneRisks') }}</div>
|
|
367
|
+
</div>
|
|
368
|
+
</div>
|
|
369
|
+
</section>
|
|
370
|
+
|
|
297
371
|
<div class="session-preview-messages">
|
|
298
372
|
<div v-if="activeSessionDetailClipped" class="session-item-sub session-item-wrap">
|
|
299
373
|
{{ t('sessions.preview.clipped', { count: activeSessionMessages.length }) }}
|
|
300
374
|
</div>
|
|
301
375
|
<div
|
|
302
|
-
v-for="(msg, idx) in
|
|
376
|
+
v-for="(msg, idx) in activeSessionVisibleMessages"
|
|
303
377
|
:key="getRecordRenderKey(msg, idx)"
|
|
304
378
|
v-memo="[msg.text, msg.timestamp, msg.roleLabel, msg.normalizedRole]"
|
|
305
379
|
:data-message-key="getRecordRenderKey(msg, idx)"
|
|
@@ -313,6 +387,12 @@
|
|
|
313
387
|
</div>
|
|
314
388
|
<div class="session-msg-content" v-html="highlightQueryText(msg.text) || ''"></div>
|
|
315
389
|
</div>
|
|
390
|
+
<div v-if="canLoadMoreSessionMessages" class="session-preview-load-more">
|
|
391
|
+
<span>{{ t('sessions.preview.shownCount', { shown: activeSessionVisibleMessages.length, total: activeSessionMessages.length }) }}</span>
|
|
392
|
+
<button class="btn-mini" type="button" @click="loadMoreSessionMessages" :disabled="sessionPreviewLoadingMore">
|
|
393
|
+
{{ sessionPreviewLoadingMore ? t('sessions.preview.loadingMore') : t('sessions.preview.loadMore', { remain: sessionPreviewRemainingCount }) }}
|
|
394
|
+
</button>
|
|
395
|
+
</div>
|
|
316
396
|
</div>
|
|
317
397
|
</div>
|
|
318
398
|
</div>
|