codexmate 0.1.5 → 0.1.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codexmate",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Codex/Claude Code/OpenClaw 配置、会话与任务编排 CLI + Web 工具",
5
5
  "main": "cli.js",
6
6
  "bin": {
@@ -225,7 +225,7 @@ export function createSessionActionMethods(options = {}) {
225
225
  isDeleteAvailable(session) {
226
226
  if (!session) return false;
227
227
  const source = String(session.source || '').trim().toLowerCase();
228
- if (source !== 'codex' && source !== 'claude') return false;
228
+ if (source !== 'codex' && source !== 'claude' && source !== 'pi') return false;
229
229
  const sessionId = typeof session.sessionId === 'string' ? session.sessionId.trim() : '';
230
230
  const filePath = typeof session.filePath === 'string' ? session.filePath.trim() : '';
231
231
  return !!sessionId || !!filePath;
@@ -220,35 +220,30 @@
220
220
  </div>
221
221
  </div>
222
222
  <div class="session-actions">
223
- <button class="btn-session-refresh" @click="loadActiveSessionDetail" :disabled="sessionDetailLoading || !activeSession"
223
+ <button class="btn-session-refresh has-label" @click="loadActiveSessionDetail" :disabled="sessionDetailLoading || !activeSession"
224
224
  :title="sessionDetailLoading ? t('sessions.preview.loading') : t('sessions.preview.refresh')"
225
225
  :aria-label="sessionDetailLoading ? t('sessions.preview.loading') : t('sessions.preview.refresh')">
226
226
  <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 8a5.5 5.5 0 0 1 9.4-3.8"/><path d="M13.5 8a5.5 5.5 0 0 1-9.4 3.8"/><polyline points="2.5 2 2.5 5 5.5 5"/><polyline points="13.5 14 13.5 11 10.5 11"/></svg>
227
+ <span class="session-action-label">{{ t('sessions.preview.refresh') }}</span>
227
228
  </button>
228
229
  <button
229
230
  v-if="isDeleteAvailable(activeSession)"
230
- class="btn-session-delete"
231
+ class="btn-session-delete has-label"
231
232
  @click="deleteSession(activeSession)"
232
233
  :disabled="!activeSession || sessionsLoading || sessionDeleting[getSessionExportKey(activeSession)]"
233
234
  :title="(activeSession && sessionDeleting[getSessionExportKey(activeSession)]) ? (sessionTrashEnabled === false ? t('sessions.preview.deleting') : t('sessions.preview.moving')) : (sessionTrashEnabled === false ? t('sessions.preview.deleteHard') : t('sessions.preview.moveToTrash'))"
234
235
  :aria-label="(activeSession && sessionDeleting[getSessionExportKey(activeSession)]) ? (sessionTrashEnabled === false ? t('sessions.preview.deleting') : t('sessions.preview.moving')) : (sessionTrashEnabled === false ? t('sessions.preview.deleteHard') : t('sessions.preview.moveToTrash'))">
235
236
  <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 4 4 4 13 4"/><path d="M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4"/><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"/></svg>
237
+ <span class="session-action-label">{{ (activeSession && sessionDeleting[getSessionExportKey(activeSession)]) ? (sessionTrashEnabled === false ? t('sessions.preview.deleting') : t('sessions.preview.moving')) : (sessionTrashEnabled === false ? t('sessions.preview.deleteHard') : t('sessions.preview.moveToTrash')) }}</span>
236
238
  </button>
237
239
  <button
238
- class="btn-session-export"
240
+ class="btn-session-export has-label"
239
241
  @click="exportSession(activeSession)"
240
242
  :disabled="!activeSession || sessionExporting[getSessionExportKey(activeSession)]"
241
243
  :title="(activeSession && sessionExporting[getSessionExportKey(activeSession)]) ? t('sessions.preview.exporting') : t('sessions.preview.export')"
242
244
  :aria-label="(activeSession && sessionExporting[getSessionExportKey(activeSession)]) ? t('sessions.preview.exporting') : t('sessions.preview.export')">
243
245
  <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>
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>
246
+ <span class="session-action-label">{{ (activeSession && sessionExporting[getSessionExportKey(activeSession)]) ? t('sessions.preview.exporting') : t('sessions.preview.export') }}</span>
252
247
  </button>
253
248
  <div class="session-link-group">
254
249
  <button
@@ -269,12 +264,13 @@
269
264
  </button>
270
265
  </div>
271
266
  <button
272
- class="btn-session-open"
267
+ class="btn-session-open has-label"
273
268
  @click="copySessionPath(activeSession)"
274
269
  :disabled="!activeSession || !getSessionFilePath(activeSession)"
275
270
  :title="t('sessions.preview.copyPath')"
276
271
  :aria-label="t('sessions.preview.copyPath')">
277
272
  <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><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"/></svg>
273
+ <span class="session-action-label">{{ t('sessions.preview.copyPath') }}</span>
278
274
  </button>
279
275
  </div>
280
276
  </div>
@@ -3512,7 +3512,7 @@ return function render(_ctx, _cache) {
3512
3512
  ]),
3513
3513
  _createElementVNode("div", { class: "session-actions" }, [
3514
3514
  _createElementVNode("button", {
3515
- class: "btn-session-refresh",
3515
+ class: "btn-session-refresh has-label",
3516
3516
  onClick: _ctx.loadActiveSessionDetail,
3517
3517
  disabled: _ctx.sessionDetailLoading || !_ctx.activeSession,
3518
3518
  title: _ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh'),
@@ -3530,12 +3530,13 @@ return function render(_ctx, _cache) {
3530
3530
  _createElementVNode("path", { d: "M13.5 8a5.5 5.5 0 0 1-9.4 3.8" }),
3531
3531
  _createElementVNode("polyline", { points: "2.5 2 2.5 5 5.5 5" }),
3532
3532
  _createElementVNode("polyline", { points: "13.5 14 13.5 11 10.5 11" })
3533
- ]))
3533
+ ])),
3534
+ _createElementVNode("span", { class: "session-action-label" }, _toDisplayString(_ctx.t('sessions.preview.refresh')), 1 /* TEXT */)
3534
3535
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
3535
3536
  (_ctx.isDeleteAvailable(_ctx.activeSession))
3536
3537
  ? (_openBlock(), _createElementBlock("button", {
3537
3538
  key: 0,
3538
- class: "btn-session-delete",
3539
+ class: "btn-session-delete has-label",
3539
3540
  onClick: $event => (_ctx.deleteSession(_ctx.activeSession)),
3540
3541
  disabled: !_ctx.activeSession || _ctx.sessionsLoading || _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)],
3541
3542
  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')),
@@ -3552,11 +3553,12 @@ return function render(_ctx, _cache) {
3552
3553
  _createElementVNode("polyline", { points: "3 4 4 4 13 4" }),
3553
3554
  _createElementVNode("path", { d: "M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4" }),
3554
3555
  _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" })
3555
- ]))
3556
+ ])),
3557
+ _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 */)
3556
3558
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]))
3557
3559
  : _createCommentVNode("v-if", true),
3558
3560
  _createElementVNode("button", {
3559
- class: "btn-session-export",
3561
+ class: "btn-session-export has-label",
3560
3562
  onClick: $event => (_ctx.exportSession(_ctx.activeSession)),
3561
3563
  disabled: !_ctx.activeSession || _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)],
3562
3564
  title: (_ctx.activeSession && _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? _ctx.t('sessions.preview.exporting') : _ctx.t('sessions.preview.export'),
@@ -3573,28 +3575,8 @@ return function render(_ctx, _cache) {
3573
3575
  _createElementVNode("path", { d: "M8 2v8" }),
3574
3576
  _createElementVNode("polyline", { points: "4 7 8 10.5 12 7" }),
3575
3577
  _createElementVNode("path", { d: "M2.5 12v1.5a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1V12" })
3576
- ]))
3577
- ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
3578
- _createElementVNode("button", {
3579
- class: "btn-session-open session-brief-copy",
3580
- onClick: _ctx.copySessionWorkspaceBrief,
3581
- disabled: !_ctx.activeSessionWorkspaceSummary.available,
3582
- title: _ctx.t('sessions.workspace.copy'),
3583
- "aria-label": _ctx.t('sessions.workspace.copy')
3584
- }, [
3585
- (_openBlock(), _createElementBlock("svg", {
3586
- viewBox: "0 0 16 16",
3587
- fill: "none",
3588
- stroke: "currentColor",
3589
- "stroke-width": "1.8",
3590
- "stroke-linecap": "round",
3591
- "stroke-linejoin": "round"
3592
- }, [
3593
- _createElementVNode("path", { d: "M4 2.5h6.5L13 5v8.5H4z" }),
3594
- _createElementVNode("path", { d: "M10.5 2.5V5H13" }),
3595
- _createElementVNode("path", { d: "M6 8h5" }),
3596
- _createElementVNode("path", { d: "M6 10.5h5" })
3597
- ]))
3578
+ ])),
3579
+ _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 */)
3598
3580
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
3599
3581
  _createElementVNode("div", { class: "session-link-group" }, [
3600
3582
  _createElementVNode("button", {
@@ -3638,7 +3620,7 @@ return function render(_ctx, _cache) {
3638
3620
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
3639
3621
  ]),
3640
3622
  _createElementVNode("button", {
3641
- class: "btn-session-open",
3623
+ class: "btn-session-open has-label",
3642
3624
  onClick: $event => (_ctx.copySessionPath(_ctx.activeSession)),
3643
3625
  disabled: !_ctx.activeSession || !_ctx.getSessionFilePath(_ctx.activeSession),
3644
3626
  title: _ctx.t('sessions.preview.copyPath'),
@@ -3653,7 +3635,8 @@ return function render(_ctx, _cache) {
3653
3635
  "stroke-linejoin": "round"
3654
3636
  }, [
3655
3637
  _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" })
3656
- ]))
3638
+ ])),
3639
+ _createElementVNode("span", { class: "session-action-label" }, _toDisplayString(_ctx.t('sessions.preview.copyPath')), 1 /* TEXT */)
3657
3640
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
3658
3641
  ])
3659
3642
  ], 512 /* NEED_PATCH */),
@@ -366,6 +366,14 @@ textarea:focus-visible {
366
366
  height: 44px;
367
367
  }
368
368
 
369
+ .btn-session-export.has-label,
370
+ .btn-session-open.has-label,
371
+ .btn-session-refresh.has-label,
372
+ .btn-session-delete.has-label {
373
+ width: auto;
374
+ height: 44px;
375
+ padding: 0 14px;
376
+ }
369
377
  .session-link-group .btn-session-open {
370
378
  width: 44px;
371
379
  height: 44px;
@@ -585,6 +593,10 @@ textarea:focus-visible {
585
593
  height: 40px;
586
594
  }
587
595
 
596
+ .session-actions .session-action-label {
597
+ display: none;
598
+ }
599
+
588
600
  .session-preview-body {
589
601
  padding: 12px;
590
602
  }
@@ -544,12 +544,34 @@
544
544
  transform: none;
545
545
  }
546
546
 
547
+ .btn-session-export.has-label,
548
+ .btn-session-open.has-label,
549
+ .btn-session-clone.has-label,
550
+ .btn-session-refresh.has-label,
551
+ .btn-session-delete.has-label {
552
+ width: auto;
553
+ min-width: 32px;
554
+ height: 32px;
555
+ padding: 0 var(--spacing-sm);
556
+ gap: 6px;
557
+ font-size: var(--font-size-caption);
558
+ font-weight: var(--font-weight-secondary);
559
+ line-height: 1;
560
+ white-space: nowrap;
561
+ }
562
+
563
+ .session-action-label {
564
+ font-size: inherit;
565
+ line-height: 1;
566
+ letter-spacing: 0.01em;
567
+ white-space: nowrap;
568
+ }
569
+
547
570
  .btn-icon-sm {
548
571
  width: 16px;
549
572
  height: 16px;
550
573
  flex-shrink: 0;
551
574
  }
552
-
553
575
  /* ===== Session match badges ===== */
554
576
  .session-match-badge {
555
577
  display: inline-flex;