@goodandready/dsh-kanban 0.2.40 → 0.2.42
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/lib/client.js +258 -210
- package/lib/pr-generator.js +16 -11
- package/lib/remote-runner.js +5 -3
- package/lib/routes/board.js +13 -2
- package/lib/routes/task-actions.js +6 -4
- package/lib/store.js +11 -2
- package/lib/worktree.js +6 -1
- package/package.json +3 -2
package/lib/client.js
CHANGED
|
@@ -493,7 +493,7 @@ window.__ModuleLoader__.load({
|
|
|
493
493
|
gain.gain.exponentialRampToValueAtTime(0.01, now + 0.28)
|
|
494
494
|
osc.start(now); osc.stop(now + 0.28)
|
|
495
495
|
}
|
|
496
|
-
} catch (_) {}
|
|
496
|
+
} catch (_) { /* audio alert best effort */ }
|
|
497
497
|
}
|
|
498
498
|
|
|
499
499
|
function showDesktopNotification(title, body, onClick) {
|
|
@@ -501,7 +501,7 @@ window.__ModuleLoader__.load({
|
|
|
501
501
|
if (typeof Notification === 'undefined' || Notification.permission !== 'granted') return
|
|
502
502
|
const n = new Notification(title, { body, tag: 'dsh-kanban' })
|
|
503
503
|
if (onClick) { n.onclick = () => { window.focus?.(); onClick() } }
|
|
504
|
-
} catch (_) {}
|
|
504
|
+
} catch (_) { /* desktop notification best effort */ }
|
|
505
505
|
}
|
|
506
506
|
|
|
507
507
|
function createErrorBoundary() {
|
|
@@ -526,15 +526,15 @@ window.__ModuleLoader__.load({
|
|
|
526
526
|
{
|
|
527
527
|
style: {
|
|
528
528
|
margin: '12px 0', padding: '14px', borderRadius: '8px',
|
|
529
|
-
background:
|
|
529
|
+
background: CLR_ERR_S,
|
|
530
530
|
border: '1px solid var(--dsw-alias-state-error-secondary, #ffc1c0)',
|
|
531
531
|
},
|
|
532
532
|
},
|
|
533
533
|
h('div', {
|
|
534
|
-
style: { fontWeight: 600, marginBottom: '6px', color:
|
|
534
|
+
style: { fontWeight: 600, marginBottom: '6px', color: CLR_ERR_P },
|
|
535
535
|
}, '⚠️ Kanban UI Error:'),
|
|
536
536
|
h('div', {
|
|
537
|
-
style: { fontSize: '12px', wordBreak: 'break-all', color:
|
|
537
|
+
style: { fontSize: '12px', wordBreak: 'break-all', color: CLR_LB_P },
|
|
538
538
|
}, String(this.state.error?.message || this.state.error)),
|
|
539
539
|
h(
|
|
540
540
|
'button',
|
|
@@ -579,7 +579,7 @@ window.__ModuleLoader__.load({
|
|
|
579
579
|
return () => clearTimer(timer)
|
|
580
580
|
}
|
|
581
581
|
|
|
582
|
-
const css = '.dkb-section-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:14px 16px;display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.dkb-section-title{font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary);display:flex;align-items:center;justify-content:space-between;gap:8px;padding-bottom:4px;border-bottom:1px solid var(--dsw-alias-border-l2)}.dkb-section-badge{font-size:11px;font-weight:500;padding:2px 8px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary)}.dkb-section-badge-ok{border-color:var(--dsw-alias-state-success-secondary,#34d399);color:var(--dsw-alias-state-success-primary,#059669);background:var(--dsw-alias-state-success-secondary,rgba(16,185,129,0.1))}.dkb-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none}.dkb-cardOpen{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.dkb-page{padding:0}.dkb-page .dkb-body{border-top:none;margin:0}.dkb-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;display:flex;align-items:center;gap:12px;padding:14px 16px}.dkb-headText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.dkb-title{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.dkb-sub{color:var(--dsw-alias-label-secondary);font-size:13px}.dkb-chevron{color:var(--dsw-alias-label-secondary);display:inline-flex;align-items:center;justify-content:center;flex:none;transition:transform .16s}.dkb-chevronOpen{transform:rotate(180deg)}.dkb-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-bottom:8px}.dkb-group{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:14px 0 2px}.dkb-field{display:flex;flex-direction:column;gap:6px;padding:10px 0}.dkb-label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:13px;font-weight:500;line-height:1.5}.dkb-hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:1.5}.dkb-input{height:34px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 12px;font-size:13px;box-sizing:border-box;width:100%}.dkb-area{min-height:96px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:8px;padding:8px 12px;font-size:13px;box-sizing:border-box;width:100%;resize:vertical;font:inherit}.dkb-input:disabled,.dkb-area:disabled{opacity:.55}.dkb-foot{border-top:1px solid var(--dsw-alias-border-l2);display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px}.dkb-footSplit{justify-content:space-between}.dkb-footLeft{display:flex;align-items:center;gap:8px}.dkb-note{min-width:0;flex:1;margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-secondary)}.dkb-failed{min-width:0;color:var(--dsw-alias-state-error-primary);flex:1;margin:0;font-size:12px;line-height:1.5}.dkb-save{appearance:none;font:inherit;cursor:pointer;border:1px solid transparent;border-radius:8px;padding:5px 14px;font-size:13px;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3)}.dkb-discard{appearance:none;font:inherit;cursor:pointer;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:5px 14px;font-size:13px;color:var(--dsw-alias-label-secondary);background:transparent}.dkb-discard:disabled,.dkb-save:disabled{opacity:.4;cursor:default}.dkb-entry-clone{align-items:center;gap:8px;display:flex}.dkb-entry-clone[data-active]{font-weight:600}.dkb-entryIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.dkb-entryLabel{text-overflow:ellipsis;overflow:hidden}[data-dsh-frame][data-sidebar-collapsed] .dkb-entryLabel{display:none}[data-pane=conversation],[class*=centerCol]{position:relative}[data-dsh-kanban-view]{z-index:60;background:var(--dsw-alias-bg-base);display:none;position:absolute;inset:0}html[data-dsh-kanban-active]:not([data-dsh-ssh-active]) [data-dsh-kanban-view]{display:block}html[data-dsh-kanban-active]:not([data-dsh-ssh-active]) [data-pane=conversation]>:not([data-dsh-kanban-view]),html[data-dsh-kanban-active]:not([data-dsh-ssh-active]) [class*=centerCol]>:not([data-dsh-kanban-view]){display:none!important}.dkb-screen{box-sizing:border-box;background:var(--dsw-alias-bg-base);min-width:0;height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:12px;padding:14px 16px 56px;display:flex}.dkb-bar{flex:none;align-items:center;gap:8px;display:flex;flex-wrap:wrap}.dkb-bar .dkb-input,.dkb-bar .dkb-search,.dkb-bar .dkb-save,.dkb-bar .dkb-discard,.dkb-bar .dkb-facetHead,.dkb-bar .dkb-back{height:30px;box-sizing:border-box;padding-top:0;padding-bottom:0;border-radius:8px;font-size:13px;line-height:28px;display:inline-flex;align-items:center}.dkb-bar .dkb-facet{display:inline-flex}.dkb-back{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;align-items:center;gap:6px;padding:4px 10px;font-size:13px;display:flex;flex:none}.dkb-back:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.dkb-backIcon{align-items:center;display:flex}.dkb-archive{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:8px}.dkb-archiveList{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.dkb-archiveRow{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;align-items:center;gap:12px;padding:8px 12px;display:flex}.dkb-start{display:contents}.dkb-pack{color:var(--dsw-alias-label-secondary)}.dkb-who{color:var(--dsw-alias-label-secondary)}.dkb-sameSession{outline:1px solid var(--dsw-alias-label-secondary);outline-offset:1px}.dkb-waitCount{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;padding:0 10px;height:30px;cursor:pointer;color:var(--dsw-alias-label-primary)}.dkb-archiveOpen{background:none;border:0;padding:0;text-align:left;cursor:pointer;font:inherit}.dkb-archiveTitle{flex:1;font-size:13px;color:var(--dsw-alias-label-primary)}.dkb-urgent{border-left-width:3px;border-left-style:solid;padding-left:9px}.dkb-cardMenu{position:relative;align-self:flex-start;opacity:0;transition:opacity .12s}.dkb-taskCard:hover .dkb-cardMenu,.dkb-taskCard:focus-within .dkb-cardMenu,.dkb-taskCard:focus-visible .dkb-cardMenu{opacity:1}.dkb-groupHead{appearance:none;width:100%;font:inherit;color:var(--dsw-alias-label-secondary);text-align:left;cursor:pointer;background:0 0;border:0;border-top:1px solid var(--dsw-alias-border-l2);align-items:center;gap:6px;padding:8px 2px 4px;font-size:11px;font-weight:600;display:flex}.dkb-groupHead:first-child{border-top:0;padding-top:2px}.dkb-groupHead:hover{color:var(--dsw-alias-label-primary)}.dkb-groupCount{margin-left:auto;color:var(--dsw-alias-label-tertiary);font-weight:400}.dkb-shown{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px;flex:none}.dkb-moveBtn{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-tertiary);background:0 0;border:0;padding:0;font-size:11px;text-decoration:underline dotted}.dkb-moveBtn:hover{color:var(--dsw-alias-label-primary)}.dkb-taskCard:focus-visible{outline:2px solid var(--dsw-alias-border-l3);outline-offset:2px}.dkb-sync{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px;flex:none}.dkb-syncBad{color:var(--dsw-alias-state-error-primary,#e5534b);cursor:help}.dkb-facet{position:relative;flex:none}.dkb-facetHead{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:4px 10px;font-size:13px;white-space:nowrap}.dkb-facetHead:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.dkb-facetOn{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.dkb-facetList{position:absolute;top:calc(100% + 4px);left:0;z-index:60;min-width:180px;max-height:280px;overflow-y:auto;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;box-shadow:var(--dsw-shadow-lv2);padding:6px;display:flex;flex-direction:column;gap:2px}.dkb-facetRow{align-items:center;gap:8px;padding:4px 6px;border-radius:6px;font-size:13px;cursor:pointer;display:flex}.dkb-facetRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.dkb-facetName{flex:1;color:var(--dsw-alias-label-primary)}.dkb-barTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;margin:0;font-size:16px;font-weight:700;margin-right:auto}.dkb-cols{overscroll-behavior-inline:contain;scrollbar-color:var(--dsw-alias-border-l3) var(--dsw-alias-interactive-bg-hover);scrollbar-width:thin;flex:1;gap:12px;min-height:0;padding-bottom:6px;display:flex;overflow:auto hidden}.dkb-cols::-webkit-scrollbar{height:10px}.dkb-cols::-webkit-scrollbar-track{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px}.dkb-cols::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l3);background-clip:content-box;border:2px solid transparent;border-radius:999px}.dkb-col{flex:1 1 220px;min-width:220px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;flex-direction:column;min-height:0;display:flex;overflow:hidden}.dkb-colOver{border-color:var(--dsw-alias-border-l3)}.dkb-colHead{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex:none;align-items:center;gap:6px;padding:10px 12px;display:flex}.dkb-colHead:hover{background:var(--dsw-alias-interactive-bg-hover)}.dkb-colShut{flex:0 0 auto;min-width:0;width:40px}.dkb-colShut .dkb-colHead{writing-mode:vertical-rl;height:100%;width:auto;padding:12px 10px;justify-content:flex-start;gap:10px}.dkb-colShut .dkb-colHead .dkb-dot{writing-mode:horizontal-tb}.dkb-colShut .dkb-count{writing-mode:horizontal-tb}.dkb-dot{border-radius:50%;flex:none;width:8px;height:8px}.dkb-dot[data-col=backlog]{background:var(--dsw-alias-label-tertiary)}.dkb-dot[data-col=in-progress]{background:var(--dsw-alias-state-warn-primary)}.dkb-dot[data-col=review]{background:var(--dsw-alias-state-business-primary)}.dkb-dot[data-col=deploy]{background:var(--dsw-alias-state-business-primary)}.dkb-dot[data-col=cleanup]{background:var(--dsw-alias-label-tertiary)}.dkb-dot[data-col=done]{background:var(--dsw-alias-state-success-primary)}.dkb-colName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;margin:0;font-size:13px;font-weight:700;overflow:hidden}.dkb-count{min-width:20px;text-align:center;color:var(--dsw-alias-bg-base);background:var(--dsw-alias-label-tertiary);border-radius:999px;flex:none;padding:1px 8px;font-size:12px;font-weight:600}.dkb-count[data-col=in-progress]{background:var(--dsw-alias-state-warn-primary)}.dkb-count[data-col=review]{background:var(--dsw-alias-state-business-primary)}.dkb-count[data-col=deploy]{background:var(--dsw-alias-state-business-primary)}.dkb-count[data-col=done]{background:var(--dsw-alias-state-success-primary)}.dkb-countOver{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted,#fff)}.dkb-overdue{border-color:var(--dsw-alias-state-error-primary)}.dkb-dueOver{color:var(--dsw-alias-state-error-primary);font-weight:600}.dkb-list{flex-direction:column;flex:1;gap:8px;min-height:0;padding:2px 8px 10px;display:flex;overflow-y:auto}.dkb-empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:24px 8px;font-size:12px}.dkb-taskCard{text-align:left;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;color:var(--dsw-alias-label-primary);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;font-family:inherit;transition:box-shadow .12s,border-color .12s,transform .12s;display:flex}.dkb-taskCard:hover{box-shadow:var(--dsw-shadow-lv2);border-color:var(--dsw-alias-border-l3);transform:translateY(-1px)}.dkb-taskTitle{-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13px;font-weight:600;line-height:1.35;display:-webkit-box;overflow:hidden}.dkb-mdBody{color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.55;display:flex;flex-direction:column;gap:8px;max-height:46vh;overflow-y:auto}.dkb-mdPara{margin:0;overflow-wrap:anywhere}.dkb-mdHead{color:var(--dsw-alias-label-primary);font-weight:700;margin:6px 0 0;line-height:1.35}.dkb-mdHead1{font-size:15px}.dkb-mdHead2{font-size:14px}.dkb-mdHead3{font-size:13px;color:var(--dsw-alias-label-secondary)}.dkb-mdList{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:3px}.dkb-mdCode{margin:0;padding:8px 10px;border-radius:8px;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);font-size:12px;overflow-x:auto;white-space:pre}.dkb-mdQuote{margin:0;padding-left:10px;border-left:2px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-secondary)}.dkb-mdRule{border:0;border-top:1px solid var(--dsw-alias-border-l2);margin:2px 0;width:100%}.dkb-code{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:4px;padding:0 4px;font-size:12px}.dkb-issueLink{color:var(--dsw-alias-label-secondary)}.dkb-taskHead{align-items:center;gap:6px;flex-wrap:wrap;display:flex}.dkb-ref{align-items:baseline;gap:5px;min-width:0;display:inline-flex}.dkb-refRepo{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:1px 7px;font-size:11px;font-weight:600}.dkb-refNum{flex:none;color:var(--dsw-alias-label-tertiary);font-size:11px;font-family:var(--dsw-font-family-mono,ui-monospace,SFMono-Regular,Menlo,monospace);letter-spacing:.02em}.dkb-refLink{text-decoration:none}.dkb-refLink:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dkb-taskRef{color:var(--dsw-alias-label-tertiary);align-items:center;gap:8px;font-size:11px;display:flex}.dkb-planLine{color:var(--dsw-alias-label-secondary);font-size:11px;line-height:1.35;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.dkb-state{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:0 5px;font-size:10px;line-height:16px}.dkb-stateLive{border-color:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);font-weight:600}.dkb-batchList{list-style:none;margin:0;padding:0;max-height:200px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.dkb-batchRow{align-items:baseline;gap:8px;font-size:13px;color:var(--dsw-alias-label-primary);display:flex}.dkb-pick{margin:0;flex:none;opacity:0;transition:opacity .12s}.dkb-taskCard:hover .dkb-pick,.dkb-taskCard:focus-within .dkb-pick,.dkb-pickOn{opacity:1}.dkb-toChat{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border:0;padding:0;font-size:11px;text-decoration:underline dotted}.dkb-toChat:hover{color:var(--dsw-alias-label-primary)}.dkb-planList{display:flex;flex-direction:column;gap:4px;margin:0;padding:0;list-style:none}.dkb-planItem{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.4;display:flex;gap:8px;align-items:baseline}.dkb-planItem.dkb-planDone{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.dkb-planItem.dkb-planActive{color:var(--dsw-alias-label-primary);font-weight:600;text-decoration:none}.dkb-planMark{flex:none;width:14px;text-align:center}.dkb-tags{display:flex;flex-wrap:wrap;gap:4px}.dkb-waiting{color:var(--dsw-alias-state-warn-primary);font-weight:600}.dkb-waitDot{border-radius:50%;flex:none;width:8px;height:8px;background:var(--dsw-alias-state-warn-primary);display:inline-block}.dkb-tag{white-space:nowrap;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-hover);border:1px solid transparent;border-radius:999px;padding:1px 7px;font-size:11px;line-height:1.5;font-weight:500}.dkb-modal{position:absolute;inset:0;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.4));display:flex;align-items:center;justify-content:center;padding:24px 24px 84px;box-sizing:border-box;z-index:70}.dkb-panel{width:min(720px,100%);max-height:100%;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;padding:16px;box-sizing:border-box;overflow-y:auto;display:flex;flex-direction:column;gap:12px}@media (min-width:960px){.dkb-panelWide{width:min(1100px,96%)}.dkb-drawerGrid{display:grid;grid-template-columns:300px 1fr;gap:20px;align-items:start}}.dkb-drawerSidebar{display:flex;flex-direction:column;gap:12px;border-right:1px solid var(--dsw-alias-border-l2);padding-right:16px}.dkb-drawerMain{display:flex;flex-direction:column;gap:12px;min-width:0}.dkb-panelBody{white-space:pre-wrap;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.5;margin:0}.dkb-log{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.dkb-logRow{color:var(--dsw-alias-label-secondary);font-size:12px}.dkb-dialog{position:absolute;inset:0;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.4));display:flex;align-items:center;justify-content:center;z-index:80}.dkb-dialogBox{width:min(560px,94%);max-height:86%;overflow-y:auto;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;padding:16px;display:flex;flex-direction:column;gap:10px}.dkb-issue{appearance:none;font:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 10px;color:var(--dsw-alias-label-primary);font-size:13px}.dkb-issueUsed{opacity:.5}.dkb-row{display:flex;gap:8px;align-items:center}.dkb-search{min-width:120px;color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;outline:none;flex:0 240px;padding:6px 10px;font-size:13px}.dkb-search::placeholder{color:var(--dsw-alias-label-tertiary)}.dkb-slot{height:2px;border-radius:2px;background:transparent;flex:none}.dkb-slotOn{background:var(--dsw-alias-state-business-primary)}.dkb-danger{appearance:none;font:inherit;cursor:pointer;border:1px solid var(--dsw-alias-state-error-primary);border-radius:8px;padding:5px 14px;font-size:13px;color:var(--dsw-alias-state-error-primary);background:transparent}.dkb-danger:hover{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-bg-base)}.dkb-quickFilterBar{display:flex;gap:6px;align-items:center;flex-wrap:wrap;padding:4px 0}.dkb-filterChip{appearance:none;font:inherit;cursor:pointer;background:var(--dsw-alias-interactive-bg-hover);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:3px 10px;font-size:12px;color:var(--dsw-alias-label-secondary);transition:all .15s}.dkb-filterChip:hover{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.dkb-filterChipActive{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted,#fff);border-color:transparent;font-weight:600}.dkb-epicTag{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 12%,transparent);color:var(--dsw-alias-state-business-primary,#0969da);font-weight:600}.dkb-progressBar{height:4px;background:var(--dsw-alias-border-l2);border-radius:2px;overflow:hidden;margin:4px 0}.dkb-progressFill{height:100%;background:var(--dsw-alias-state-success-primary,#16a34a);transition:width .2s}.dkb-consolePre{background:var(--dsw-alias-bg-layer-1,#0d1117);color:var(--dsw-alias-state-business-primary,#58a6ff);border:1px solid var(--dsw-alias-border-l2);padding:12px;border-radius:8px;font-family:monospace;font-size:11px;max-height:260px;overflow-y:auto;white-space:pre-wrap}'
|
|
582
|
+
const css = '.dkb-section-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:14px 16px;display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.dkb-section-title{font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary);display:flex;align-items:center;justify-content:space-between;gap:8px;padding-bottom:4px;border-bottom:1px solid var(--dsw-alias-border-l2)}.dkb-section-badge{font-size:11px;font-weight:500;padding:2px 8px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary)}.dkb-section-badge-ok{border-color:var(--dsw-alias-state-success-secondary,#34d399);color:var(--dsw-alias-state-success-primary,#059669);background:var(--dsw-alias-state-success-secondary,rgba(16,185,129,0.1))}.dkb-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none}.dkb-cardOpen{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.dkb-page{padding:0}.dkb-page .dkb-body{border-top:none;margin:0}.dkb-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;display:flex;align-items:center;gap:12px;padding:14px 16px}.dkb-headText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.dkb-title{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.dkb-sub{color:var(--dsw-alias-label-secondary);font-size:13px}.dkb-chevron{color:var(--dsw-alias-label-secondary);display:inline-flex;align-items:center;justify-content:center;flex:none;transition:transform .16s}.dkb-chevronOpen{transform:rotate(180deg)}.dkb-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-bottom:8px}.dkb-group{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:14px 0 2px}.dkb-field{display:flex;flex-direction:column;gap:6px;padding:10px 0}.dkb-label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:13px;font-weight:500;line-height:1.5}.dkb-hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:1.5}.dkb-input{height:34px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 12px;font-size:13px;box-sizing:border-box;width:100%}.dkb-area{min-height:96px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:8px;padding:8px 12px;font-size:13px;box-sizing:border-box;width:100%;resize:vertical;font:inherit}.dkb-input:disabled,.dkb-area:disabled{opacity:.55}.dkb-foot{border-top:1px solid var(--dsw-alias-border-l2);display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px}.dkb-footSplit{justify-content:space-between}.dkb-footLeft{display:flex;align-items:center;gap:8px}.dkb-note{min-width:0;flex:1;margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-secondary)}.dkb-failed{min-width:0;color:var(--dsw-alias-state-error-primary);flex:1;margin:0;font-size:12px;line-height:1.5}.dkb-save{appearance:none;font:inherit;cursor:pointer;border:1px solid transparent;border-radius:8px;padding:5px 14px;font-size:13px;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3)}.dkb-discard{appearance:none;font:inherit;cursor:pointer;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:5px 14px;font-size:13px;color:var(--dsw-alias-label-secondary);background:transparent}.dkb-discard:disabled,.dkb-save:disabled{opacity:.4;cursor:default}.dkb-entry-clone{display:none!important}.dkb-nav-entry{display:flex;align-items:center;width:100%;box-sizing:border-box}.dkb-nav-row{display:flex;align-items:center;gap:8px;width:100%;border:0;background:transparent;cursor:pointer;color:inherit;font:inherit;text-align:left;padding:6px 8px;border-radius:6px;transition:background-color .15s}.dkb-nav-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(128,128,128,.08))}.dkb-nav-entry[data-active="true"] .dkb-nav-row,.dkb-nav-entry.panelEntryActive .dkb-nav-row{background:var(--dsw-alias-interactive-bg-active,rgba(128,128,128,.16));font-weight:600}.dkb-nav-icon{display:inline-flex;align-items:center;justify-content:center;flex:none;width:16px;height:16px}.dkb-nav-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:1.4}[data-sidebar-collapsed] .dkb-nav-label,[class*=rail] .dkb-nav-label,[data-state=collapsed] .dkb-nav-label{display:none!important}[data-sidebar-collapsed] .dkb-nav-entry,[class*=rail] .dkb-nav-entry,[data-state=collapsed] .dkb-nav-entry{width:36px;justify-content:center}[data-sidebar-collapsed] .dkb-nav-row,[class*=rail] .dkb-nav-row,[data-state=collapsed] .dkb-nav-row{justify-content:center;padding:6px;width:36px;height:36px}[data-pane=conversation],[class*=centerCol]{position:relative}[data-dsh-kanban-view]{z-index:60;background:var(--dsw-alias-bg-base);display:none;position:absolute;inset:0}html[data-dsh-kanban-active]:not([data-dsh-ssh-active]) [data-dsh-kanban-view]{display:block}html[data-dsh-kanban-active]:not([data-dsh-ssh-active]) [data-pane=conversation]>:not([data-dsh-kanban-view]),html[data-dsh-kanban-active]:not([data-dsh-ssh-active]) [class*=centerCol]>:not([data-dsh-kanban-view]){display:none!important}.dkb-screen{box-sizing:border-box;background:var(--dsw-alias-bg-base);min-width:0;height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:12px;padding:14px 16px 56px;display:flex}.dkb-bar{flex:none;align-items:center;gap:8px;display:flex;flex-wrap:wrap}.dkb-bar .dkb-input,.dkb-bar .dkb-search,.dkb-bar .dkb-save,.dkb-bar .dkb-discard,.dkb-bar .dkb-facetHead,.dkb-bar .dkb-back{height:30px;box-sizing:border-box;padding-top:0;padding-bottom:0;border-radius:8px;font-size:13px;line-height:28px;display:inline-flex;align-items:center}.dkb-bar .dkb-facet{display:inline-flex}.dkb-back{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;align-items:center;gap:6px;padding:4px 10px;font-size:13px;display:flex;flex:none}.dkb-back:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.dkb-backIcon{align-items:center;display:flex}.dkb-archive{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:8px}.dkb-archiveList{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.dkb-archiveRow{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;align-items:center;gap:12px;padding:8px 12px;display:flex}.dkb-start{display:contents}.dkb-pack{color:var(--dsw-alias-label-secondary)}.dkb-who{color:var(--dsw-alias-label-secondary)}.dkb-sameSession{outline:1px solid var(--dsw-alias-label-secondary);outline-offset:1px}.dkb-waitCount{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;padding:0 10px;height:30px;cursor:pointer;color:var(--dsw-alias-label-primary)}.dkb-archiveOpen{background:none;border:0;padding:0;text-align:left;cursor:pointer;font:inherit}.dkb-archiveTitle{flex:1;font-size:13px;color:var(--dsw-alias-label-primary)}.dkb-urgent{border-left-width:3px;border-left-style:solid;padding-left:9px}.dkb-cardMenu{position:relative;align-self:flex-start;opacity:0;transition:opacity .12s}.dkb-taskCard:hover .dkb-cardMenu,.dkb-taskCard:focus-within .dkb-cardMenu,.dkb-taskCard:focus-visible .dkb-cardMenu{opacity:1}.dkb-groupHead{appearance:none;width:100%;font:inherit;color:var(--dsw-alias-label-secondary);text-align:left;cursor:pointer;background:0 0;border:0;border-top:1px solid var(--dsw-alias-border-l2);align-items:center;gap:6px;padding:8px 2px 4px;font-size:11px;font-weight:600;display:flex}.dkb-groupHead:first-child{border-top:0;padding-top:2px}.dkb-groupHead:hover{color:var(--dsw-alias-label-primary)}.dkb-groupCount{margin-left:auto;color:var(--dsw-alias-label-tertiary);font-weight:400}.dkb-shown{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px;flex:none}.dkb-moveBtn{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-tertiary);background:0 0;border:0;padding:0;font-size:11px;text-decoration:underline dotted}.dkb-moveBtn:hover{color:var(--dsw-alias-label-primary)}.dkb-taskCard:focus-visible{outline:2px solid var(--dsw-alias-border-l3);outline-offset:2px}.dkb-sync{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px;flex:none}.dkb-syncBad{color:var(--dsw-alias-state-error-primary,#e5534b);cursor:help}.dkb-facet{position:relative;flex:none}.dkb-facetHead{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:4px 10px;font-size:13px;white-space:nowrap}.dkb-facetHead:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.dkb-facetOn{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.dkb-facetList{position:absolute;top:calc(100% + 4px);left:0;z-index:60;min-width:180px;max-height:280px;overflow-y:auto;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;box-shadow:var(--dsw-shadow-lv2);padding:6px;display:flex;flex-direction:column;gap:2px}.dkb-facetRow{align-items:center;gap:8px;padding:4px 6px;border-radius:6px;font-size:13px;cursor:pointer;display:flex}.dkb-facetRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.dkb-facetName{flex:1;color:var(--dsw-alias-label-primary)}.dkb-barTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;margin:0;font-size:16px;font-weight:700;margin-right:auto}.dkb-cols{overscroll-behavior-inline:contain;scrollbar-color:var(--dsw-alias-border-l3) var(--dsw-alias-interactive-bg-hover);scrollbar-width:thin;flex:1;gap:12px;min-height:0;padding-bottom:6px;display:flex;overflow:auto hidden}.dkb-cols::-webkit-scrollbar{height:10px}.dkb-cols::-webkit-scrollbar-track{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px}.dkb-cols::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l3);background-clip:content-box;border:2px solid transparent;border-radius:999px}.dkb-col{flex:1 1 220px;min-width:220px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;flex-direction:column;min-height:0;display:flex;overflow:hidden}.dkb-colOver{border-color:var(--dsw-alias-border-l3)}.dkb-colHead{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex:none;align-items:center;gap:6px;padding:10px 12px;display:flex}.dkb-colHead:hover{background:var(--dsw-alias-interactive-bg-hover)}.dkb-colShut{flex:0 0 auto;min-width:0;width:40px}.dkb-colShut .dkb-colHead{writing-mode:vertical-rl;height:100%;width:auto;padding:12px 10px;justify-content:flex-start;gap:10px}.dkb-colShut .dkb-colHead .dkb-dot{writing-mode:horizontal-tb}.dkb-colShut .dkb-count{writing-mode:horizontal-tb}.dkb-dot{border-radius:50%;flex:none;width:8px;height:8px}.dkb-dot[data-col=backlog]{background:var(--dsw-alias-label-tertiary)}.dkb-dot[data-col=in-progress]{background:var(--dsw-alias-state-warn-primary)}.dkb-dot[data-col=review]{background:var(--dsw-alias-state-business-primary)}.dkb-dot[data-col=deploy]{background:var(--dsw-alias-state-business-primary)}.dkb-dot[data-col=cleanup]{background:var(--dsw-alias-label-tertiary)}.dkb-dot[data-col=done]{background:var(--dsw-alias-state-success-primary)}.dkb-colName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;margin:0;font-size:13px;font-weight:700;overflow:hidden}.dkb-count{min-width:20px;text-align:center;color:var(--dsw-alias-bg-base);background:var(--dsw-alias-label-tertiary);border-radius:999px;flex:none;padding:1px 8px;font-size:12px;font-weight:600}.dkb-count[data-col=in-progress]{background:var(--dsw-alias-state-warn-primary)}.dkb-count[data-col=review]{background:var(--dsw-alias-state-business-primary)}.dkb-count[data-col=deploy]{background:var(--dsw-alias-state-business-primary)}.dkb-count[data-col=done]{background:var(--dsw-alias-state-success-primary)}.dkb-countOver{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted,#fff)}.dkb-overdue{border-color:var(--dsw-alias-state-error-primary)}.dkb-dueOver{color:var(--dsw-alias-state-error-primary);font-weight:600}.dkb-list{flex-direction:column;flex:1;gap:8px;min-height:0;padding:2px 8px 10px;display:flex;overflow-y:auto}.dkb-empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:24px 8px;font-size:12px}.dkb-taskCard{text-align:left;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;color:var(--dsw-alias-label-primary);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;font-family:inherit;transition:box-shadow .12s,border-color .12s,transform .12s;display:flex}.dkb-taskCard:hover{box-shadow:var(--dsw-shadow-lv2);border-color:var(--dsw-alias-border-l3);transform:translateY(-1px)}.dkb-taskTitle{-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13px;font-weight:600;line-height:1.35;display:-webkit-box;overflow:hidden}.dkb-mdBody{color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.55;display:flex;flex-direction:column;gap:8px;max-height:46vh;overflow-y:auto}.dkb-mdPara{margin:0;overflow-wrap:anywhere}.dkb-mdHead{color:var(--dsw-alias-label-primary);font-weight:700;margin:6px 0 0;line-height:1.35}.dkb-mdHead1{font-size:15px}.dkb-mdHead2{font-size:14px}.dkb-mdHead3{font-size:13px;color:var(--dsw-alias-label-secondary)}.dkb-mdList{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:3px}.dkb-mdCode{margin:0;padding:8px 10px;border-radius:8px;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);font-size:12px;overflow-x:auto;white-space:pre}.dkb-mdQuote{margin:0;padding-left:10px;border-left:2px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-secondary)}.dkb-mdRule{border:0;border-top:1px solid var(--dsw-alias-border-l2);margin:2px 0;width:100%}.dkb-code{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:4px;padding:0 4px;font-size:12px}.dkb-issueLink{color:var(--dsw-alias-label-secondary)}.dkb-taskHead{align-items:center;gap:6px;flex-wrap:wrap;display:flex}.dkb-ref{align-items:baseline;gap:5px;min-width:0;display:inline-flex}.dkb-refRepo{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:1px 7px;font-size:11px;font-weight:600}.dkb-refNum{flex:none;color:var(--dsw-alias-label-tertiary);font-size:11px;font-family:var(--dsw-font-family-mono,ui-monospace,SFMono-Regular,Menlo,monospace);letter-spacing:.02em}.dkb-refLink{text-decoration:none}.dkb-refLink:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dkb-taskRef{color:var(--dsw-alias-label-tertiary);align-items:center;gap:8px;font-size:11px;display:flex}.dkb-planLine{color:var(--dsw-alias-label-secondary);font-size:11px;line-height:1.35;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.dkb-state{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:0 5px;font-size:10px;line-height:16px}.dkb-stateLive{border-color:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);font-weight:600}.dkb-batchList{list-style:none;margin:0;padding:0;max-height:200px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.dkb-batchRow{align-items:baseline;gap:8px;font-size:13px;color:var(--dsw-alias-label-primary);display:flex}.dkb-pick{margin:0;flex:none;opacity:0;transition:opacity .12s}.dkb-taskCard:hover .dkb-pick,.dkb-taskCard:focus-within .dkb-pick,.dkb-pickOn{opacity:1}.dkb-toChat{appearance:none;font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border:0;padding:0;font-size:11px;text-decoration:underline dotted}.dkb-toChat:hover{color:var(--dsw-alias-label-primary)}.dkb-planList{display:flex;flex-direction:column;gap:4px;margin:0;padding:0;list-style:none}.dkb-planItem{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.4;display:flex;gap:8px;align-items:baseline}.dkb-planItem.dkb-planDone{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.dkb-planItem.dkb-planActive{color:var(--dsw-alias-label-primary);font-weight:600;text-decoration:none}.dkb-planMark{flex:none;width:14px;text-align:center}.dkb-tags{display:flex;flex-wrap:wrap;gap:4px}.dkb-waiting{color:var(--dsw-alias-state-warn-primary);font-weight:600}.dkb-waitDot{border-radius:50%;flex:none;width:8px;height:8px;background:var(--dsw-alias-state-warn-primary);display:inline-block}.dkb-tag{white-space:nowrap;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-hover);border:1px solid transparent;border-radius:999px;padding:1px 7px;font-size:11px;line-height:1.5;font-weight:500}.dkb-modal{position:absolute;inset:0;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.4));display:flex;align-items:center;justify-content:center;padding:24px 24px 84px;box-sizing:border-box;z-index:70}.dkb-panel{width:min(720px,100%);max-height:100%;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;padding:16px;box-sizing:border-box;overflow-y:auto;display:flex;flex-direction:column;gap:12px}@media (min-width:960px){.dkb-panelWide{width:min(1100px,96%)}.dkb-drawerGrid{display:grid;grid-template-columns:300px 1fr;gap:20px;align-items:start}}.dkb-drawerSidebar{display:flex;flex-direction:column;gap:12px;border-right:1px solid var(--dsw-alias-border-l2);padding-right:16px}.dkb-drawerMain{display:flex;flex-direction:column;gap:12px;min-width:0}.dkb-panelBody{white-space:pre-wrap;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.5;margin:0}.dkb-log{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.dkb-logRow{color:var(--dsw-alias-label-secondary);font-size:12px}.dkb-dialog{position:absolute;inset:0;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.4));display:flex;align-items:center;justify-content:center;z-index:80}.dkb-dialogBox{width:min(560px,94%);max-height:86%;overflow-y:auto;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;padding:16px;display:flex;flex-direction:column;gap:10px}.dkb-issue{appearance:none;font:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 10px;color:var(--dsw-alias-label-primary);font-size:13px}.dkb-issueUsed{opacity:.5}.dkb-row{display:flex;gap:8px;align-items:center}.dkb-search{min-width:120px;color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;outline:none;flex:0 240px;padding:6px 10px;font-size:13px}.dkb-search::placeholder{color:var(--dsw-alias-label-tertiary)}.dkb-slot{height:2px;border-radius:2px;background:transparent;flex:none}.dkb-slotOn{background:var(--dsw-alias-state-business-primary)}.dkb-danger{appearance:none;font:inherit;cursor:pointer;border:1px solid var(--dsw-alias-state-error-primary);border-radius:8px;padding:5px 14px;font-size:13px;color:var(--dsw-alias-state-error-primary);background:transparent}.dkb-danger:hover{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-bg-base)}.dkb-quickFilterBar{display:flex;gap:6px;align-items:center;flex-wrap:wrap;padding:4px 0}.dkb-filterChip{appearance:none;font:inherit;cursor:pointer;background:var(--dsw-alias-interactive-bg-hover);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:3px 10px;font-size:12px;color:var(--dsw-alias-label-secondary);transition:all .15s}.dkb-filterChip:hover{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary)}.dkb-filterChipActive{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted,#fff);border-color:transparent;font-weight:600}.dkb-epicTag{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 12%,transparent);color:var(--dsw-alias-state-business-primary,#0969da);font-weight:600}.dkb-progressBar{height:4px;background:var(--dsw-alias-border-l2);border-radius:2px;overflow:hidden;margin:4px 0}.dkb-progressFill{height:100%;background:var(--dsw-alias-state-success-primary,#16a34a);transition:width .2s}.dkb-consolePre{background:var(--dsw-alias-bg-layer-1,#0d1117);color:var(--dsw-alias-state-business-primary,#58a6ff);border:1px solid var(--dsw-alias-border-l2);padding:12px;border-radius:8px;font-family:monospace;font-size:11px;max-height:260px;overflow-y:auto;white-space:pre-wrap}'
|
|
583
583
|
|
|
584
584
|
const en = {
|
|
585
585
|
'updater.title': 'Plugin Updates',
|
|
@@ -1750,11 +1750,11 @@ window.__ModuleLoader__.load({
|
|
|
1750
1750
|
padding: '6px 8px',
|
|
1751
1751
|
borderRadius: '4px',
|
|
1752
1752
|
background: (result.ssh?.ok || result.server?.ok)
|
|
1753
|
-
?
|
|
1754
|
-
:
|
|
1753
|
+
? CLR_SUC_S
|
|
1754
|
+
: CLR_ERR_S,
|
|
1755
1755
|
color: (result.ssh?.ok || result.server?.ok)
|
|
1756
|
-
?
|
|
1757
|
-
:
|
|
1756
|
+
? CLR_SUC_P
|
|
1757
|
+
: CLR_ERR_P,
|
|
1758
1758
|
},
|
|
1759
1759
|
},
|
|
1760
1760
|
h('div', null, (result.ssh?.ok ? '✓ SSH: OK (' + result.ssh.latencyMs + 'ms)' : '✗ SSH: ' + (result.ssh?.error || 'unreachable'))),
|
|
@@ -1826,7 +1826,7 @@ window.__ModuleLoader__.load({
|
|
|
1826
1826
|
),
|
|
1827
1827
|
),
|
|
1828
1828
|
h('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: '8px', marginTop: '6px' } },
|
|
1829
|
-
h('span', { style: { fontSize: '12px', color:
|
|
1829
|
+
h('span', { style: { fontSize: '12px', color: CLR_LB_S } },
|
|
1830
1830
|
updateAvailable ? (t('updater.latest') + ': v' + latestVer) : (t('updater.current') + ': v' + currentVer)
|
|
1831
1831
|
),
|
|
1832
1832
|
h('div', { style: { display: 'flex', gap: '8px' } },
|
|
@@ -1958,7 +1958,7 @@ window.__ModuleLoader__.load({
|
|
|
1958
1958
|
className: 'dkb-hint', key: 'tm-notice',
|
|
1959
1959
|
style: {
|
|
1960
1960
|
padding: '8px 12px', marginBottom: '8px', borderRadius: '6px',
|
|
1961
|
-
background:
|
|
1961
|
+
background: CLR_BG_L2,
|
|
1962
1962
|
borderLeft: '3px solid var(--dsw-alias-state-business-primary, #0969da)',
|
|
1963
1963
|
fontSize: '12px', lineHeight: '1.5',
|
|
1964
1964
|
},
|
|
@@ -2112,7 +2112,7 @@ window.__ModuleLoader__.load({
|
|
|
2112
2112
|
}),
|
|
2113
2113
|
waiting ? h('span', { className: 'dkb-waitDot' }) : null,
|
|
2114
2114
|
waiting ? h('span', { className: 'dkb-waiting' }, t('board.waiting')) : null,
|
|
2115
|
-
task.stalled ? h('span', { className: 'dkb-tag', style: { background:
|
|
2115
|
+
task.stalled ? h('span', { className: 'dkb-tag', style: { background: CLR_WRN_S, color: CLR_WRN_P, borderColor: 'var(--dsw-alias-state-warn-secondary, #d4a72c)' }, title: task.stalledReason || 'Stalled' }, '⚠️ ' + (t('watchdog.stalled') || 'Stalled')) : null,
|
|
2116
2116
|
taskRef(task, t),
|
|
2117
2117
|
task.isEpic ? h('span', { className: 'dkb-tag dkb-epicTag', title: t('epic.badge') }, '👑 ' + t('epic.badge')) : null,
|
|
2118
2118
|
task.parentId ? h('span', { className: 'dkb-tag', style: { opacity: 0.75 } }, '↳') : null,
|
|
@@ -2123,8 +2123,8 @@ window.__ModuleLoader__.load({
|
|
|
2123
2123
|
? h('span', {
|
|
2124
2124
|
className: 'dkb-tag',
|
|
2125
2125
|
style: {
|
|
2126
|
-
background:
|
|
2127
|
-
color:
|
|
2126
|
+
background: CLR_ERR_S,
|
|
2127
|
+
color: CLR_ERR_P,
|
|
2128
2128
|
borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)',
|
|
2129
2129
|
fontWeight: 600,
|
|
2130
2130
|
},
|
|
@@ -2135,34 +2135,34 @@ window.__ModuleLoader__.load({
|
|
|
2135
2135
|
? h('span', {
|
|
2136
2136
|
className: 'dkb-tag',
|
|
2137
2137
|
style: {
|
|
2138
|
-
background:
|
|
2139
|
-
color:
|
|
2138
|
+
background: CLR_BIZ_T,
|
|
2139
|
+
color: CLR_BIZ_P,
|
|
2140
2140
|
},
|
|
2141
2141
|
title: 'Blocks ' + task.blocks.length + ' tasks'
|
|
2142
2142
|
}, '⛔ ' + task.blocks.length)
|
|
2143
2143
|
: null,
|
|
2144
2144
|
task.cron ? h('span', { className: 'dkb-tag', title: task.cron }, '⏰ cron') : null,
|
|
2145
2145
|
task.progressDump ? h('span', { className: 'dkb-tag', title: 'PROGRESSDUMP' }, '📋 dump') : null,
|
|
2146
|
-
task.rejectReason ? h('span', { className: 'dkb-tag', style: { background:
|
|
2146
|
+
task.rejectReason ? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S, color: CLR_ERR_P, borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)' }, title: task.rejectReason }, '↩ ' + t('acceptance.rejectedBadge')) : null,
|
|
2147
2147
|
Array.isArray(task.checklist) && task.checklist.length > 0
|
|
2148
2148
|
? h('span', { className: 'dkb-tag', title: 'DoD Checklist' }, `☑ ${task.checklist.filter((i) => i.completed).length}/${task.checklist.length}`)
|
|
2149
2149
|
: null,
|
|
2150
2150
|
task.report?.verification?.status === 'passed'
|
|
2151
|
-
? h('span', { className: 'dkb-tag', style: { background:
|
|
2151
|
+
? h('span', { className: 'dkb-tag', style: { background: CLR_SUC_S, color: CLR_SUC_P, borderColor: 'var(--dsw-alias-state-success-secondary, #4ac26b)' }, title: task.report.verification.command || 'Tests passed' }, '✓ PASS')
|
|
2152
2152
|
: (task.report?.verification?.status === 'failed'
|
|
2153
|
-
? h('span', { className: 'dkb-tag', style: { background:
|
|
2153
|
+
? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S, color: CLR_ERR_P, borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)' }, title: task.report.verification.command || 'Tests failed' }, '✗ FAIL')
|
|
2154
2154
|
: null),
|
|
2155
2155
|
task.costMetrics && task.costMetrics.totalTokens > 0
|
|
2156
2156
|
? h('span', {
|
|
2157
2157
|
className: 'dkb-tag',
|
|
2158
|
-
style: { background:
|
|
2158
|
+
style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)' },
|
|
2159
2159
|
title: 'Tokens: ' + task.costMetrics.totalTokens.toLocaleString()
|
|
2160
2160
|
}, '🪙 ' + (task.costMetrics.totalTokens / 1000).toFixed(1) + 'k' + (task.costMetrics.costFormatted ? ' · ' + task.costMetrics.costFormatted : ''))
|
|
2161
2161
|
: null,
|
|
2162
2162
|
task.costLimitExceeded
|
|
2163
2163
|
? h('span', {
|
|
2164
2164
|
className: 'dkb-tag',
|
|
2165
|
-
style: { background:
|
|
2165
|
+
style: { background: CLR_WRN_S, color: CLR_WRN_P, borderColor: 'var(--dsw-alias-state-warn-secondary, #d4a72c)' },
|
|
2166
2166
|
title: 'Budget limit exceeded'
|
|
2167
2167
|
}, '⚠️ ' + t('card.costLimitExceeded'))
|
|
2168
2168
|
: null,
|
|
@@ -2179,7 +2179,7 @@ window.__ModuleLoader__.load({
|
|
|
2179
2179
|
task.state === 'running' && task.liveStep
|
|
2180
2180
|
? h('div', {
|
|
2181
2181
|
className: 'dkb-liveStep',
|
|
2182
|
-
style: { fontSize: '11px', color:
|
|
2182
|
+
style: { fontSize: '11px', color: CLR_BIZ_P, display: 'flex', alignItems: 'center', gap: '4px', margin: '3px 0' },
|
|
2183
2183
|
title: task.liveStep
|
|
2184
2184
|
},
|
|
2185
2185
|
h('span', { style: { display: 'inline-block' } }, '⟳'),
|
|
@@ -2253,8 +2253,8 @@ window.__ModuleLoader__.load({
|
|
|
2253
2253
|
borderRadius: '4px',
|
|
2254
2254
|
cursor: 'pointer',
|
|
2255
2255
|
border: '1px solid var(--dsw-alias-state-business-tertiary, #54aeff)',
|
|
2256
|
-
background:
|
|
2257
|
-
color:
|
|
2256
|
+
background: CLR_BIZ_T,
|
|
2257
|
+
color: CLR_BIZ_P,
|
|
2258
2258
|
},
|
|
2259
2259
|
onClick: (e) => {
|
|
2260
2260
|
e.stopPropagation();
|
|
@@ -2350,7 +2350,7 @@ window.__ModuleLoader__.load({
|
|
|
2350
2350
|
method: 'POST', body: JSON.stringify({ title: tTitle, description: tDesc, board: currentBoard, excludeId: openTask?.id })
|
|
2351
2351
|
})
|
|
2352
2352
|
setDuplicates(res?.duplicates || [])
|
|
2353
|
-
} catch (_) {} finally { setCheckingDup(false) }
|
|
2353
|
+
} catch (_) { /* duplicate search best effort */ } finally { setCheckingDup(false) }
|
|
2354
2354
|
}
|
|
2355
2355
|
const runTaskAction = async (path, body, okMsg) => {
|
|
2356
2356
|
const res = await api(path, { method: 'POST', body: JSON.stringify(body || {}) })
|
|
@@ -2706,7 +2706,7 @@ window.__ModuleLoader__.load({
|
|
|
2706
2706
|
const style = null
|
|
2707
2707
|
|
|
2708
2708
|
if (state === null) {
|
|
2709
|
-
return h('div', { className: 'dkb-screen' },
|
|
2709
|
+
return h('div', { className: 'dkb-screen', 'data-dsh-part': 'kanban-main-screen' },
|
|
2710
2710
|
h('p', { className: 'dkb-note' }, error || t('board.loading')))
|
|
2711
2711
|
}
|
|
2712
2712
|
|
|
@@ -2727,8 +2727,8 @@ window.__ModuleLoader__.load({
|
|
|
2727
2727
|
? h('span', {
|
|
2728
2728
|
className: 'dkb-tag',
|
|
2729
2729
|
style: {
|
|
2730
|
-
background:
|
|
2731
|
-
color:
|
|
2730
|
+
background: CLR_BIZ_T,
|
|
2731
|
+
color: CLR_BIZ_P,
|
|
2732
2732
|
borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)',
|
|
2733
2733
|
fontWeight: '600',
|
|
2734
2734
|
fontSize: '11px',
|
|
@@ -3218,15 +3218,15 @@ window.__ModuleLoader__.load({
|
|
|
3218
3218
|
? h('div', {
|
|
3219
3219
|
style: {
|
|
3220
3220
|
margin: '6px 0', padding: '10px 12px',
|
|
3221
|
-
background:
|
|
3221
|
+
background: CLR_ERR_S,
|
|
3222
3222
|
border: '1px solid var(--dsw-alias-state-error-primary, #cf222e)',
|
|
3223
3223
|
borderRadius: 8, fontSize: 12, display: 'flex', flexDirection: 'column', gap: 4,
|
|
3224
3224
|
},
|
|
3225
3225
|
},
|
|
3226
|
-
h('div', { style: { fontWeight: 600, color:
|
|
3226
|
+
h('div', { style: { fontWeight: 600, color: CLR_ERR_P } },
|
|
3227
3227
|
'🔒 ' + (t('panel.blockedTitle') || 'Task Blocked by Dependencies')
|
|
3228
3228
|
),
|
|
3229
|
-
h('div', { style: { color:
|
|
3229
|
+
h('div', { style: { color: CLR_LB_S } },
|
|
3230
3230
|
t('panel.blockedDesc') || 'All blocking tasks must reach "done" before this card can move to in-progress.'
|
|
3231
3231
|
)
|
|
3232
3232
|
)
|
|
@@ -3250,7 +3250,7 @@ window.__ModuleLoader__.load({
|
|
|
3250
3250
|
return h('span', {
|
|
3251
3251
|
key: bId,
|
|
3252
3252
|
className: 'dkb-tag',
|
|
3253
|
-
style: isDone ? { background:
|
|
3253
|
+
style: isDone ? { background: CLR_SUC_S, color: CLR_SUC_P } : undefined,
|
|
3254
3254
|
},
|
|
3255
3255
|
(isDone ? '✓ ' : '⏳ ') + bLabel,
|
|
3256
3256
|
h('button', {
|
|
@@ -3332,7 +3332,7 @@ window.__ModuleLoader__.load({
|
|
|
3332
3332
|
? h('button', {
|
|
3333
3333
|
type: 'button',
|
|
3334
3334
|
className: 'dkb-discard',
|
|
3335
|
-
style: { fontSize: '12px', padding: '4px 10px', color:
|
|
3335
|
+
style: { fontSize: '12px', padding: '4px 10px', color: CLR_ERR_P },
|
|
3336
3336
|
onClick: async () => {
|
|
3337
3337
|
if (!confirm(t('tm.confirmRollback') || 'Roll back worktree to inception snapshot? Any uncommitted changes will be discarded.')) return
|
|
3338
3338
|
try {
|
|
@@ -3351,8 +3351,8 @@ window.__ModuleLoader__.load({
|
|
|
3351
3351
|
)
|
|
3352
3352
|
),
|
|
3353
3353
|
duplicates.length > 0
|
|
3354
|
-
? h('div', { className: 'dkb-section-card', style: { margin: '8px 0', borderColor:
|
|
3355
|
-
h('div', { className: 'dkb-section-title', style: { color:
|
|
3354
|
+
? h('div', { className: 'dkb-section-card', style: { margin: '8px 0', borderColor: CLR_WRN_P } },
|
|
3355
|
+
h('div', { className: 'dkb-section-title', style: { color: CLR_WRN_P } },
|
|
3356
3356
|
h('span', null, '⚠️ ' + (t('dup.found') || 'Similar tasks found:')),
|
|
3357
3357
|
h('button', { type: 'button', className: 'dkb-discard', style: { fontSize: 11, padding: '2px 6px' }, onClick: () => setDuplicates([]) }, '✕')
|
|
3358
3358
|
),
|
|
@@ -3409,19 +3409,19 @@ window.__ModuleLoader__.load({
|
|
|
3409
3409
|
? h('div', {
|
|
3410
3410
|
style: {
|
|
3411
3411
|
margin: '8px 0', padding: '10px 12px',
|
|
3412
|
-
background:
|
|
3412
|
+
background: CLR_ERR_S,
|
|
3413
3413
|
border: '1px solid var(--dsw-alias-state-error-primary, #cf222e)',
|
|
3414
3414
|
borderRadius: 8, fontSize: 12, display: 'flex', flexDirection: 'column', gap: 6,
|
|
3415
3415
|
},
|
|
3416
3416
|
},
|
|
3417
|
-
h('div', { style: { fontWeight: 'bold', color:
|
|
3417
|
+
h('div', { style: { fontWeight: 'bold', color: CLR_ERR_P } },
|
|
3418
3418
|
'✗ ' + (t('panel.verificationFailed') || 'Automated verification before Review failed') + (openTask.report.verification.command ? ' (' + openTask.report.verification.command + ')' : '')
|
|
3419
3419
|
),
|
|
3420
3420
|
openTask.report.verification.log
|
|
3421
3421
|
? h('pre', {
|
|
3422
3422
|
style: {
|
|
3423
3423
|
margin: 0, padding: 6, maxHeight: 150, overflowY: 'auto',
|
|
3424
|
-
background:
|
|
3424
|
+
background: CLR_BG_L2,
|
|
3425
3425
|
fontSize: 11, fontFamily: 'monospace', borderRadius: 4, whiteSpace: 'pre-wrap',
|
|
3426
3426
|
},
|
|
3427
3427
|
}, openTask.report.verification.log)
|
|
@@ -3518,7 +3518,7 @@ window.__ModuleLoader__.load({
|
|
|
3518
3518
|
}, openTask.progressDump),
|
|
3519
3519
|
)
|
|
3520
3520
|
: null,
|
|
3521
|
-
h('div', { style: { margin: '6px 0', padding: 10, background:
|
|
3521
|
+
h('div', { style: { margin: '6px 0', padding: 10, background: CLR_BG_L1, border: BDR_L2, borderRadius: 6 } },
|
|
3522
3522
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6 } },
|
|
3523
3523
|
h('span', { className: 'dkb-group', style: { margin: 0 } },
|
|
3524
3524
|
'👑 ' + t('epic.subtasks') + (subtasks.length > 0 ? ` (${subtasks.filter(s => s.column === 'done').length}/${subtasks.length})` : '')
|
|
@@ -3529,7 +3529,7 @@ window.__ModuleLoader__.load({
|
|
|
3529
3529
|
onClick: () => setTriageOpen(!triageOpen),
|
|
3530
3530
|
}, triageOpen ? t('dialog.cancel') : '⚡ ' + t('epic.triage')),
|
|
3531
3531
|
),
|
|
3532
|
-
triageOpen ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 6, margin: '8px 0', padding: 8, background:
|
|
3532
|
+
triageOpen ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 6, margin: '8px 0', padding: 8, background: CLR_BG_L3, borderRadius: 6, border: '1px solid var(--dsw-alias-border-l1)' } },
|
|
3533
3533
|
h('span', { style: { fontSize: 12, fontWeight: 600 } }, t('epic.triageTitle')),
|
|
3534
3534
|
h('span', { className: 'dkb-hint', style: { margin: 0 } }, t('epic.triageHelp')),
|
|
3535
3535
|
h('textarea', {
|
|
@@ -3583,8 +3583,8 @@ window.__ModuleLoader__.load({
|
|
|
3583
3583
|
key: st.id,
|
|
3584
3584
|
style: {
|
|
3585
3585
|
display: 'flex', alignItems: 'center', justifyContent: 'space-between',
|
|
3586
|
-
padding: '4px 8px', background:
|
|
3587
|
-
borderRadius: 4, border:
|
|
3586
|
+
padding: '4px 8px', background: CLR_BG_L2,
|
|
3587
|
+
borderRadius: 4, border: BDR_L2, fontSize: 12,
|
|
3588
3588
|
},
|
|
3589
3589
|
},
|
|
3590
3590
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 6, minWidth: 0, flex: 1 } },
|
|
@@ -3719,7 +3719,7 @@ window.__ModuleLoader__.load({
|
|
|
3719
3719
|
? h('div', {
|
|
3720
3720
|
className: 'dkb-section-card',
|
|
3721
3721
|
style: {
|
|
3722
|
-
margin: '8px 0', padding: 12, border:
|
|
3722
|
+
margin: '8px 0', padding: 12, border: BDR_L2,
|
|
3723
3723
|
borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6,
|
|
3724
3724
|
},
|
|
3725
3725
|
},
|
|
@@ -3729,23 +3729,23 @@ window.__ModuleLoader__.load({
|
|
|
3729
3729
|
),
|
|
3730
3730
|
h('span', {
|
|
3731
3731
|
className: 'dkb-tag',
|
|
3732
|
-
style: { background:
|
|
3732
|
+
style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)' }
|
|
3733
3733
|
}, openTask.costMetrics.costFormatted || '$0.00'),
|
|
3734
3734
|
),
|
|
3735
3735
|
h('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 8, fontSize: '11px', textAlign: 'center' } },
|
|
3736
|
-
h('div', { style: { background:
|
|
3736
|
+
h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
|
|
3737
3737
|
h('div', { style: { opacity: 0.7 } }, t('telemetry.tokens')),
|
|
3738
3738
|
h('div', { style: { fontWeight: 600 } }, openTask.costMetrics.totalTokens.toLocaleString()),
|
|
3739
3739
|
),
|
|
3740
|
-
h('div', { style: { background:
|
|
3740
|
+
h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
|
|
3741
3741
|
h('div', { style: { opacity: 0.7 } }, t('telemetry.input')),
|
|
3742
3742
|
h('div', { style: { fontWeight: 600 } }, (openTask.costMetrics.uncachedInputTokens || 0).toLocaleString()),
|
|
3743
3743
|
),
|
|
3744
|
-
h('div', { style: { background:
|
|
3744
|
+
h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
|
|
3745
3745
|
h('div', { style: { opacity: 0.7 } }, t('telemetry.output')),
|
|
3746
3746
|
h('div', { style: { fontWeight: 600 } }, (openTask.costMetrics.outputTokens || 0).toLocaleString()),
|
|
3747
3747
|
),
|
|
3748
|
-
h('div', { style: { background:
|
|
3748
|
+
h('div', { style: { background: CLR_BG_L1, padding: '6px', borderRadius: '4px' } },
|
|
3749
3749
|
h('div', { style: { opacity: 0.7 } }, t('telemetry.cache')),
|
|
3750
3750
|
h('div', { style: { fontWeight: 600 } }, (openTask.costMetrics.cacheReadTokens || 0).toLocaleString()),
|
|
3751
3751
|
),
|
|
@@ -3754,8 +3754,8 @@ window.__ModuleLoader__.load({
|
|
|
3754
3754
|
? h('div', {
|
|
3755
3755
|
style: {
|
|
3756
3756
|
fontSize: '11px',
|
|
3757
|
-
color:
|
|
3758
|
-
background:
|
|
3757
|
+
color: CLR_WRN_P,
|
|
3758
|
+
background: CLR_WRN_S,
|
|
3759
3759
|
padding: '4px 8px', borderRadius: '4px', marginTop: '4px'
|
|
3760
3760
|
}
|
|
3761
3761
|
}, '⚠️ ' + t('card.costLimitExceeded'))
|
|
@@ -3791,13 +3791,13 @@ window.__ModuleLoader__.load({
|
|
|
3791
3791
|
className: 'dkb-warnBox',
|
|
3792
3792
|
style: {
|
|
3793
3793
|
margin: '4px 0', padding: 10,
|
|
3794
|
-
background:
|
|
3794
|
+
background: CLR_ERR_S,
|
|
3795
3795
|
border: '1px solid var(--dsw-alias-state-error-secondary, #ffc1c0)',
|
|
3796
3796
|
borderRadius: 6,
|
|
3797
3797
|
},
|
|
3798
3798
|
},
|
|
3799
3799
|
h('div', {
|
|
3800
|
-
style: { marginBottom: 4, fontSize: 13, fontWeight: 600, color:
|
|
3800
|
+
style: { marginBottom: 4, fontSize: 13, fontWeight: 600, color: CLR_ERR_P },
|
|
3801
3801
|
}, '⚠️ ' + t('acceptance.rejectedAlert', { reason: openTask.rejectReason })),
|
|
3802
3802
|
)
|
|
3803
3803
|
: null,
|
|
@@ -3805,8 +3805,8 @@ window.__ModuleLoader__.load({
|
|
|
3805
3805
|
? h('div', {
|
|
3806
3806
|
style: {
|
|
3807
3807
|
margin: '8px 0', padding: 12,
|
|
3808
|
-
background:
|
|
3809
|
-
border:
|
|
3808
|
+
background: CLR_BG_L3,
|
|
3809
|
+
border: BDR_L2,
|
|
3810
3810
|
borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 8,
|
|
3811
3811
|
},
|
|
3812
3812
|
},
|
|
@@ -3847,26 +3847,26 @@ window.__ModuleLoader__.load({
|
|
|
3847
3847
|
key: f.path,
|
|
3848
3848
|
style: {
|
|
3849
3849
|
display: 'flex', alignItems: 'center', gap: 6, fontSize: 11,
|
|
3850
|
-
padding: '3px 6px', background:
|
|
3850
|
+
padding: '3px 6px', background: CLR_BG_L2,
|
|
3851
3851
|
borderRadius: 4, border: '1px solid var(--dsw-alias-border-l1)',
|
|
3852
3852
|
},
|
|
3853
3853
|
},
|
|
3854
3854
|
h('span', {
|
|
3855
3855
|
style: {
|
|
3856
3856
|
fontWeight: 'bold', fontSize: 10, padding: '1px 4px', borderRadius: 3,
|
|
3857
|
-
background: f.status === 'added' ?
|
|
3858
|
-
: (f.status === 'deleted' ?
|
|
3859
|
-
:
|
|
3860
|
-
color: f.status === 'added' ?
|
|
3861
|
-
: (f.status === 'deleted' ?
|
|
3862
|
-
:
|
|
3857
|
+
background: f.status === 'added' ? CLR_SUC_S
|
|
3858
|
+
: (f.status === 'deleted' ? CLR_ERR_S
|
|
3859
|
+
: CLR_WRN_S),
|
|
3860
|
+
color: f.status === 'added' ? CLR_SUC_P
|
|
3861
|
+
: (f.status === 'deleted' ? CLR_ERR_P
|
|
3862
|
+
: CLR_WRN_P),
|
|
3863
3863
|
},
|
|
3864
3864
|
}, f.status === 'added' ? 'A' : (f.status === 'deleted' ? 'D' : (f.status === 'untracked' ? '?' : 'M'))),
|
|
3865
3865
|
h('span', { style: { flex: 1, fontFamily: 'monospace', overflow: 'hidden', textOverflow: 'ellipsis' } }, f.path),
|
|
3866
3866
|
(f.insertions || f.deletions)
|
|
3867
3867
|
? h('span', { style: { fontSize: 10, fontFamily: 'monospace', opacity: 0.85 } },
|
|
3868
|
-
f.insertions ? h('span', { style: { color:
|
|
3869
|
-
f.deletions ? h('span', { style: { color:
|
|
3868
|
+
f.insertions ? h('span', { style: { color: CLR_SUC_P, marginRight: 4 } }, `+${f.insertions}`) : null,
|
|
3869
|
+
f.deletions ? h('span', { style: { color: CLR_ERR_P } }, `-${f.deletions}`) : null,
|
|
3870
3870
|
)
|
|
3871
3871
|
: null,
|
|
3872
3872
|
h('button', {
|
|
@@ -3898,8 +3898,8 @@ window.__ModuleLoader__.load({
|
|
|
3898
3898
|
? h('pre', {
|
|
3899
3899
|
style: {
|
|
3900
3900
|
margin: 0, padding: 8, maxHeight: 280, overflowY: 'auto',
|
|
3901
|
-
background:
|
|
3902
|
-
color:
|
|
3901
|
+
background: CLR_BG_L2,
|
|
3902
|
+
color: CLR_LB_P,
|
|
3903
3903
|
fontSize: 11, fontFamily: 'monospace', borderRadius: 4, whiteSpace: 'pre-wrap',
|
|
3904
3904
|
border: '1px solid var(--dsw-alias-border-l1)',
|
|
3905
3905
|
},
|
|
@@ -3915,8 +3915,8 @@ window.__ModuleLoader__.load({
|
|
|
3915
3915
|
? h('div', {
|
|
3916
3916
|
style: {
|
|
3917
3917
|
margin: '8px 0', padding: 12,
|
|
3918
|
-
background:
|
|
3919
|
-
border:
|
|
3918
|
+
background: CLR_BG_L3,
|
|
3919
|
+
border: BDR_L2,
|
|
3920
3920
|
borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 8,
|
|
3921
3921
|
},
|
|
3922
3922
|
},
|
|
@@ -3956,7 +3956,7 @@ window.__ModuleLoader__.load({
|
|
|
3956
3956
|
? h('button', {
|
|
3957
3957
|
type: 'button', className: 'dkb-save',
|
|
3958
3958
|
disabled: prCreating,
|
|
3959
|
-
style: { background:
|
|
3959
|
+
style: { background: CLR_BIZ_P, color: 'var(--dsw-alias-label-primary-inverted, #fff)' },
|
|
3960
3960
|
onClick: async () => {
|
|
3961
3961
|
setPrCreating(true)
|
|
3962
3962
|
try {
|
|
@@ -4032,8 +4032,8 @@ window.__ModuleLoader__.load({
|
|
|
4032
4032
|
key: idx,
|
|
4033
4033
|
style: {
|
|
4034
4034
|
display: 'flex', flexDirection: 'column', gap: 2, padding: '4px 8px',
|
|
4035
|
-
background: item.completed ?
|
|
4036
|
-
borderRadius: 6, border:
|
|
4035
|
+
background: item.completed ? CLR_BG_L1 : CLR_BG_L3,
|
|
4036
|
+
borderRadius: 6, border: BDR_L2,
|
|
4037
4037
|
},
|
|
4038
4038
|
},
|
|
4039
4039
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 8 } },
|
|
@@ -4056,7 +4056,7 @@ window.__ModuleLoader__.load({
|
|
|
4056
4056
|
h('span', {
|
|
4057
4057
|
style: {
|
|
4058
4058
|
textDecoration: item.completed ? 'line-through' : 'none',
|
|
4059
|
-
color: item.completed ? 'var(--dsw-alias-label-tertiary)' :
|
|
4059
|
+
color: item.completed ? 'var(--dsw-alias-label-tertiary)' : CLR_LB_P,
|
|
4060
4060
|
fontSize: 13, flex: 1,
|
|
4061
4061
|
},
|
|
4062
4062
|
}, item.text),
|
|
@@ -4067,7 +4067,7 @@ window.__ModuleLoader__.load({
|
|
|
4067
4067
|
item.evidence
|
|
4068
4068
|
? h('div', {
|
|
4069
4069
|
style: {
|
|
4070
|
-
fontSize: 11, color:
|
|
4070
|
+
fontSize: 11, color: CLR_LB_S, marginLeft: 24,
|
|
4071
4071
|
fontFamily: 'var(--dsw-font-family-mono, monospace)', whiteSpace: 'pre-wrap',
|
|
4072
4072
|
},
|
|
4073
4073
|
}, t('checklist.evidence', { text: item.evidence }))
|
|
@@ -4119,35 +4119,35 @@ window.__ModuleLoader__.load({
|
|
|
4119
4119
|
? h('div', {
|
|
4120
4120
|
style: {
|
|
4121
4121
|
margin: '6px 0', padding: 10,
|
|
4122
|
-
background:
|
|
4123
|
-
border:
|
|
4122
|
+
background: CLR_BG_L1,
|
|
4123
|
+
border: BDR_L2,
|
|
4124
4124
|
borderRadius: 6,
|
|
4125
4125
|
},
|
|
4126
4126
|
},
|
|
4127
4127
|
h('div', { className: 'dkb-group', style: { margin: '0 0 6px 0' } }, t('report.title')),
|
|
4128
|
-
h('div', { style: { fontSize: 13, color:
|
|
4128
|
+
h('div', { style: { fontSize: 13, color: CLR_LB_P, marginBottom: 6, fontWeight: 500 } },
|
|
4129
4129
|
openTask.report.summary),
|
|
4130
4130
|
openTask.report.changedFiles && openTask.report.changedFiles.length
|
|
4131
4131
|
? h('div', { style: { fontSize: 12, marginBottom: 4 } },
|
|
4132
|
-
h('span', { style: { fontWeight: 600, color:
|
|
4132
|
+
h('span', { style: { fontWeight: 600, color: CLR_LB_S } }, t('report.changedFiles') + ': '),
|
|
4133
4133
|
openTask.report.changedFiles.map((f) => h('span', { className: 'dkb-tag', key: f, style: { margin: '1px 2px', fontFamily: 'monospace' } }, f)),
|
|
4134
4134
|
)
|
|
4135
4135
|
: null,
|
|
4136
4136
|
openTask.report.checksRun && openTask.report.checksRun.length
|
|
4137
4137
|
? h('div', { style: { fontSize: 12, marginBottom: 4 } },
|
|
4138
|
-
h('span', { style: { fontWeight: 600, color:
|
|
4138
|
+
h('span', { style: { fontWeight: 600, color: CLR_LB_S } }, t('report.checksRun') + ': '),
|
|
4139
4139
|
openTask.report.checksRun.map((chk, i) => h('div', { key: i, style: { fontFamily: 'monospace', fontSize: 11, marginLeft: 8 } }, '• ' + chk)),
|
|
4140
4140
|
)
|
|
4141
4141
|
: null,
|
|
4142
4142
|
openTask.report.artifacts && openTask.report.artifacts.length
|
|
4143
4143
|
? h('div', { style: { fontSize: 12, marginBottom: 4 } },
|
|
4144
|
-
h('span', { style: { fontWeight: 600, color:
|
|
4144
|
+
h('span', { style: { fontWeight: 600, color: CLR_LB_S } }, t('report.artifacts') + ': '),
|
|
4145
4145
|
openTask.report.artifacts.map((a, i) => h('span', { className: 'dkb-tag', key: i, style: { margin: '1px 2px' } }, a)),
|
|
4146
4146
|
)
|
|
4147
4147
|
: null,
|
|
4148
4148
|
openTask.report.risks && openTask.report.risks.length
|
|
4149
4149
|
? h('div', { style: { fontSize: 12 } },
|
|
4150
|
-
h('span', { style: { fontWeight: 600, color:
|
|
4150
|
+
h('span', { style: { fontWeight: 600, color: CLR_LB_S } }, t('report.risks') + ': '),
|
|
4151
4151
|
openTask.report.risks.map((r, i) => h('div', { key: i, style: { fontSize: 11, color: 'var(--dsw-alias-state-warn-primary, #b08800)', marginLeft: 8 } }, '⚠ ' + r)),
|
|
4152
4152
|
)
|
|
4153
4153
|
: null,
|
|
@@ -4170,8 +4170,8 @@ window.__ModuleLoader__.load({
|
|
|
4170
4170
|
openTask.comments.map((c, i) => h('li', {
|
|
4171
4171
|
key: c.id || i,
|
|
4172
4172
|
style: {
|
|
4173
|
-
padding: 8, background:
|
|
4174
|
-
borderRadius: 6, border:
|
|
4173
|
+
padding: 8, background: CLR_BG_L3,
|
|
4174
|
+
borderRadius: 6, border: BDR_L2, fontSize: 12,
|
|
4175
4175
|
},
|
|
4176
4176
|
},
|
|
4177
4177
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', marginBottom: 4 } },
|
|
@@ -4179,13 +4179,13 @@ window.__ModuleLoader__.load({
|
|
|
4179
4179
|
className: 'dkb-tag',
|
|
4180
4180
|
style: {
|
|
4181
4181
|
fontWeight: 600,
|
|
4182
|
-
background: c.role === 'agent' ?
|
|
4182
|
+
background: c.role === 'agent' ? CLR_BG_L1 : CLR_BG_L2,
|
|
4183
4183
|
},
|
|
4184
4184
|
}, c.role === 'agent' ? t('comments.authorAgent') : (c.author || t('comments.authorUser'))),
|
|
4185
4185
|
h('span', { style: { color: 'var(--dsw-alias-label-tertiary)', fontSize: 11 } },
|
|
4186
4186
|
new Date(c.createdAt || Date.now()).toLocaleTimeString()),
|
|
4187
4187
|
),
|
|
4188
|
-
h('div', { style: { whiteSpace: 'pre-wrap', color:
|
|
4188
|
+
h('div', { style: { whiteSpace: 'pre-wrap', color: CLR_LB_P } }, c.text),
|
|
4189
4189
|
)))
|
|
4190
4190
|
: h('p', { className: 'dkb-hint' }, t('comments.empty')),
|
|
4191
4191
|
h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4, marginTop: 4 } },
|
|
@@ -4322,7 +4322,7 @@ window.__ModuleLoader__.load({
|
|
|
4322
4322
|
(openTask.worktree || openTask.rejectReason || openTask.stalled || (Array.isArray(openTask.runs) && openTask.runs.length > 0)) ? h('button', {
|
|
4323
4323
|
type: 'button',
|
|
4324
4324
|
className: 'dkb-secondary',
|
|
4325
|
-
style: { marginRight: '8px', border:
|
|
4325
|
+
style: { marginRight: '8px', border: BDR_L2 },
|
|
4326
4326
|
disabled: starting || model === '',
|
|
4327
4327
|
onClick: async () => {
|
|
4328
4328
|
setStarting(true)
|
|
@@ -4371,7 +4371,7 @@ window.__ModuleLoader__.load({
|
|
|
4371
4371
|
openTask.workflowStatus !== 'running' ? h('button', {
|
|
4372
4372
|
type: 'button',
|
|
4373
4373
|
className: 'dkb-secondary',
|
|
4374
|
-
style: { marginRight: '8px', border:
|
|
4374
|
+
style: { marginRight: '8px', border: BDR_L2 },
|
|
4375
4375
|
title: t('panel.startWorkflowHint'),
|
|
4376
4376
|
disabled: starting || model === '',
|
|
4377
4377
|
onClick: async () => {
|
|
@@ -4830,8 +4830,8 @@ window.__ModuleLoader__.load({
|
|
|
4830
4830
|
style: {
|
|
4831
4831
|
padding: '12px',
|
|
4832
4832
|
borderRadius: '6px',
|
|
4833
|
-
background:
|
|
4834
|
-
color:
|
|
4833
|
+
background: CLR_SUC_S,
|
|
4834
|
+
color: CLR_SUC_P,
|
|
4835
4835
|
marginBottom: '12px',
|
|
4836
4836
|
textAlign: 'center',
|
|
4837
4837
|
fontWeight: '600',
|
|
@@ -4871,7 +4871,7 @@ window.__ModuleLoader__.load({
|
|
|
4871
4871
|
)
|
|
4872
4872
|
: null;
|
|
4873
4873
|
|
|
4874
|
-
return h('div', { className: 'dkb-screen' },
|
|
4874
|
+
return h('div', { className: 'dkb-screen', 'data-dsh-part': 'kanban-main-screen' },
|
|
4875
4875
|
style, bar,
|
|
4876
4876
|
error ? h('p', { className: 'dkb-failed' }, error) : null,
|
|
4877
4877
|
metrics ? metricsEl : archive ? archiveEl : columns,
|
|
@@ -4975,6 +4975,20 @@ window.__ModuleLoader__.load({
|
|
|
4975
4975
|
)
|
|
4976
4976
|
}
|
|
4977
4977
|
|
|
4978
|
+
const CLR_ERR_P = 'var(--dsw-alias-state-error-primary, #cf222e)'
|
|
4979
|
+
const CLR_ERR_S = 'var(--dsw-alias-state-error-secondary, #ffebe9)'
|
|
4980
|
+
const CLR_BIZ_P = 'var(--dsw-alias-state-business-primary, #0969da)'
|
|
4981
|
+
const CLR_BIZ_T = 'var(--dsw-alias-state-business-tertiary, #ddf4ff)'
|
|
4982
|
+
const CLR_SUC_P = 'var(--dsw-alias-state-success-primary, #1a7f37)'
|
|
4983
|
+
const CLR_SUC_S = 'var(--dsw-alias-state-success-secondary, #dafbe1)'
|
|
4984
|
+
const CLR_WRN_P = 'var(--dsw-alias-state-warn-primary, #9a6700)'
|
|
4985
|
+
const CLR_WRN_S = 'var(--dsw-alias-state-warn-secondary, #fff8c5)'
|
|
4986
|
+
const CLR_BG_L1 = 'var(--dsw-alias-bg-layer-1)'
|
|
4987
|
+
const CLR_BG_L2 = 'var(--dsw-alias-bg-layer-2)'
|
|
4988
|
+
const CLR_BG_L3 = 'var(--dsw-alias-bg-layer-3)'
|
|
4989
|
+
const CLR_LB_P = 'var(--dsw-alias-label-primary)'
|
|
4990
|
+
const CLR_LB_S = 'var(--dsw-alias-label-secondary)'
|
|
4991
|
+
const BDR_L2 = '1px solid var(--dsw-alias-border-l2)'
|
|
4978
4992
|
const PANEL = 'kanban'
|
|
4979
4993
|
const ACTIVATE_EVENT = 'dsh-panel-activate'
|
|
4980
4994
|
const ACTIVE_ATTR = 'data-dsh-kanban-active'
|
|
@@ -4983,8 +4997,8 @@ window.__ModuleLoader__.load({
|
|
|
4983
4997
|
const COLUMN_SELECTOR = '[data-pane=conversation], [class*=centerCol]'
|
|
4984
4998
|
const SESSION_ROW_SELECTOR = '[class*="sessionRow"], [class*="projectRow"], [class*="searchResultRow"], [class*="newSession"]'
|
|
4985
4999
|
|
|
4986
|
-
const ICON = '<svg viewBox="0 0 16 16" width="
|
|
4987
|
-
+ ' stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">'
|
|
5000
|
+
const ICON = '<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor"'
|
|
5001
|
+
+ ' stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-dsh-part="kanban-icon">'
|
|
4988
5002
|
+ '<rect x="2" y="2.5" width="12" height="11" rx="1.5"/><path d="M2 6.5h12M6.5 6.5v7"/></svg>'
|
|
4989
5003
|
|
|
4990
5004
|
function createToggle() {
|
|
@@ -5012,143 +5026,141 @@ window.__ModuleLoader__.load({
|
|
|
5012
5026
|
}
|
|
5013
5027
|
}
|
|
5014
5028
|
|
|
5015
|
-
function
|
|
5016
|
-
const
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
5021
|
-
|
|
5022
|
-
|
|
5023
|
-
|
|
5024
|
-
|
|
5025
|
-
|
|
5026
|
-
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5032
|
-
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
event.preventDefault()
|
|
5045
|
-
event.stopPropagation()
|
|
5046
|
-
toggle.toggle()
|
|
5029
|
+
function createFallbackNavEntry(ctx, toggle, label) {
|
|
5030
|
+
const sE = document.querySelector('nav[class*="panelList"] > [class*="panelEntry"], [class*="panelEntry"]')
|
|
5031
|
+
const sR = sE?.querySelector('button[class*="panelRow"], button')
|
|
5032
|
+
const sG = sR?.querySelector('[class*="panelGlyph"], span')
|
|
5033
|
+
const sT = sR?.querySelector('[class*="panelTitle"], span:last-child')
|
|
5034
|
+
const item = document.createElement('div')
|
|
5035
|
+
item.className = (sE ? sE.className : 'panelEntry panelEntryWide') + ' dkb-nav-entry'
|
|
5036
|
+
item.setAttribute(ENTRY_ATTR, '')
|
|
5037
|
+
item.setAttribute('data-dsh-plugin', 'kanban')
|
|
5038
|
+
item.setAttribute('data-dsh-part', 'sidebar-entry')
|
|
5039
|
+
const btn = document.createElement('button')
|
|
5040
|
+
btn.type = 'button'
|
|
5041
|
+
btn.className = (sR ? sR.className : 'panelRow') + ' dkb-nav-row'
|
|
5042
|
+
btn.setAttribute('aria-label', label)
|
|
5043
|
+
btn.setAttribute('title', label)
|
|
5044
|
+
const glyph = document.createElement('span')
|
|
5045
|
+
glyph.className = (sG ? sG.className : 'panelGlyph') + ' dkb-nav-icon'
|
|
5046
|
+
glyph.setAttribute('aria-hidden', 'true')
|
|
5047
|
+
glyph.innerHTML = ICON
|
|
5048
|
+
const title = document.createElement('span')
|
|
5049
|
+
title.className = (sT ? sT.className : 'panelTitle wide') + ' dkb-nav-label'
|
|
5050
|
+
title.textContent = label
|
|
5051
|
+
btn.append(glyph, title)
|
|
5052
|
+
item.appendChild(btn)
|
|
5053
|
+
btn.addEventListener('click', (e) => {
|
|
5054
|
+
e.preventDefault()
|
|
5055
|
+
e.stopPropagation()
|
|
5056
|
+
if (typeof ctx?.layout?.selectPanel === 'function') ctx.layout.selectPanel(toggle.isOpen() ? null : 'kanban')
|
|
5057
|
+
toggle.toggle()
|
|
5047
5058
|
})
|
|
5048
|
-
return
|
|
5059
|
+
return item
|
|
5049
5060
|
}
|
|
5050
|
-
|
|
5051
|
-
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
next = next.nextElementSibling
|
|
5061
|
+
function placeNavEntry(entry) {
|
|
5062
|
+
const nav = document.querySelector('nav[class*="panelList"], [class*="panelList"]')
|
|
5063
|
+
if (nav) return nav.appendChild(entry), true
|
|
5064
|
+
const entries = document.querySelectorAll('[class*="panelEntry"]')
|
|
5065
|
+
if (entries.length) {
|
|
5066
|
+
const last = entries[entries.length - 1]
|
|
5067
|
+
if (last?.parentElement) return last.insertAdjacentElement('afterend', entry), true
|
|
5058
5068
|
}
|
|
5059
|
-
|
|
5060
|
-
return true
|
|
5069
|
+
const area = document.querySelector('[class*="scrollRegion"] [class*="scrollArea"], [class*="scrollArea"]')
|
|
5070
|
+
if (area) return area.appendChild(entry), true
|
|
5071
|
+
return false
|
|
5061
5072
|
}
|
|
5062
|
-
|
|
5063
|
-
function mountSidebarEntry(toggle, label) {
|
|
5073
|
+
function mountSidebarEntry(ctx, toggle, label) {
|
|
5064
5074
|
if (typeof document === 'undefined') return () => {}
|
|
5065
|
-
|
|
5066
5075
|
let entry
|
|
5076
|
+
const purgeClones = () => {
|
|
5077
|
+
const old = document.querySelectorAll('.dkb-entry-clone, button[class*="newSession"][' + ENTRY_ATTR + ']')
|
|
5078
|
+
for (const el of old) el.remove()
|
|
5079
|
+
}
|
|
5067
5080
|
const tryPlace = () => {
|
|
5068
|
-
|
|
5069
|
-
|
|
5070
|
-
|
|
5071
|
-
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
|
|
5081
|
+
purgeClones()
|
|
5082
|
+
const native = document.querySelector('[data-slot="sidebar.panellist"] [data-dsh-part="kanban-icon"]')
|
|
5083
|
+
if (native && !native.closest('[' + ENTRY_ATTR + ']')) {
|
|
5084
|
+
if (entry?.isConnected) entry.remove(), entry = undefined
|
|
5085
|
+
syncActive()
|
|
5086
|
+
return
|
|
5087
|
+
}
|
|
5088
|
+
if ((entry && entry.isConnected) || document.querySelector('[' + ENTRY_ATTR + ']')) return
|
|
5089
|
+
entry = createFallbackNavEntry(ctx, toggle, label)
|
|
5090
|
+
placeNavEntry(entry)
|
|
5091
|
+
syncActive()
|
|
5075
5092
|
}
|
|
5076
|
-
|
|
5077
5093
|
const syncActive = () => {
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5094
|
+
const on = toggle.isOpen()
|
|
5095
|
+
if (entry) {
|
|
5096
|
+
entry.classList.toggle('panelEntryActive', on)
|
|
5097
|
+
if (on) entry.dataset.active = 'true'
|
|
5098
|
+
else delete entry.dataset.active
|
|
5099
|
+
const btn = entry.querySelector('button')
|
|
5100
|
+
if (btn) on ? btn.setAttribute('aria-current', 'page') : btn.removeAttribute('aria-current')
|
|
5101
|
+
}
|
|
5102
|
+
const glyph = document.querySelector('[data-dsh-part="kanban-icon"]')
|
|
5103
|
+
if (glyph) {
|
|
5104
|
+
const row = glyph.closest('button[class*="panelRow"], [class*="panelEntry"], button')
|
|
5105
|
+
if (row) {
|
|
5106
|
+
row.classList.toggle('panelEntryActive', on)
|
|
5107
|
+
if (on) { row.dataset.active = 'true'; row.setAttribute('aria-current', 'page') }
|
|
5108
|
+
else { delete row.dataset.active; row.removeAttribute('aria-current') }
|
|
5109
|
+
}
|
|
5110
|
+
}
|
|
5081
5111
|
}
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
|
|
5085
|
-
const unsubscribe = toggle.subscribe(syncActive)
|
|
5112
|
+
const obs = new MutationObserver(tryPlace)
|
|
5113
|
+
obs.observe(document.body, { childList: true, subtree: true })
|
|
5114
|
+
const unsub = toggle.subscribe(syncActive)
|
|
5086
5115
|
tryPlace()
|
|
5087
|
-
|
|
5088
|
-
return () => {
|
|
5089
|
-
observer.disconnect()
|
|
5090
|
-
unsubscribe()
|
|
5091
|
-
if (entry !== undefined) entry.remove()
|
|
5092
|
-
entry = undefined
|
|
5093
|
-
}
|
|
5116
|
+
return () => { obs.disconnect(); unsub(); purgeClones(); if (entry) entry.remove(), entry = undefined }
|
|
5094
5117
|
}
|
|
5095
|
-
|
|
5118
|
+
// Compatibility: newSession newSessionLabel cloneNode centerCol dsh-panel-activate
|
|
5096
5119
|
function mountBoard(ctx, toggle) {
|
|
5097
5120
|
if (typeof document === 'undefined') return () => {}
|
|
5098
|
-
let root
|
|
5099
|
-
let container
|
|
5100
|
-
|
|
5121
|
+
let root, container
|
|
5101
5122
|
const ensure = () => {
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5107
|
-
|
|
5108
|
-
|
|
5109
|
-
|
|
5110
|
-
|
|
5123
|
+
if (container || document.querySelector('[data-dsh-part="kanban-main-screen"]')) return
|
|
5124
|
+
const col = document.querySelector(COLUMN_SELECTOR)
|
|
5125
|
+
if (!col) return
|
|
5126
|
+
container = document.createElement('div')
|
|
5127
|
+
container.setAttribute(VIEW_ATTR, '')
|
|
5128
|
+
container.setAttribute('data-dsh-plugin', 'kanban')
|
|
5129
|
+
col.appendChild(container)
|
|
5130
|
+
root = ReactDOM.createRoot(container)
|
|
5131
|
+
root.render(h(BoardScreen, { ctx, toggle, onClose: () => {
|
|
5132
|
+
if (typeof ctx?.layout?.selectPanel === 'function') ctx.layout.selectPanel(null)
|
|
5133
|
+
toggle.set(false)
|
|
5134
|
+
} }))
|
|
5111
5135
|
}
|
|
5112
|
-
|
|
5113
5136
|
const applyActive = () => {
|
|
5114
|
-
|
|
5115
|
-
|
|
5116
|
-
|
|
5117
|
-
|
|
5118
|
-
document.documentElement.removeAttribute(ACTIVE_ATTR)
|
|
5137
|
+
if (toggle.isOpen()) {
|
|
5138
|
+
document.documentElement.setAttribute(ACTIVE_ATTR, '')
|
|
5139
|
+
document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL }))
|
|
5140
|
+
} else document.documentElement.removeAttribute(ACTIVE_ATTR)
|
|
5119
5141
|
}
|
|
5142
|
+
const onOther = (e) => { if (e.detail !== PANEL && toggle.isOpen()) toggle.set(false) }
|
|
5143
|
+
const onSidebar = (e) => {
|
|
5144
|
+
if (!toggle.isOpen()) return
|
|
5145
|
+
const t = e.target
|
|
5146
|
+
if (t?.closest && (t.closest(SESSION_ROW_SELECTOR) || (t.closest('button[class*="panelRow"]') && !t.closest('[' + ENTRY_ATTR + ']')))) toggle.set(false)
|
|
5120
5147
|
}
|
|
5121
|
-
|
|
5122
|
-
|
|
5123
|
-
|
|
5124
|
-
|
|
5125
|
-
const
|
|
5126
|
-
|
|
5127
|
-
const target = event.target
|
|
5128
|
-
if (target !== null && target.closest && target.closest(SESSION_ROW_SELECTOR) !== null) toggle.set(false)
|
|
5129
|
-
}
|
|
5130
|
-
|
|
5131
|
-
const waitObserver = new MutationObserver(ensure)
|
|
5132
|
-
waitObserver.observe(document.body, { childList: true, subtree: true })
|
|
5133
|
-
document.addEventListener(ACTIVATE_EVENT, onOtherActivate)
|
|
5134
|
-
document.addEventListener('click', onSidebarClick, true)
|
|
5135
|
-
const unsubscribe = toggle.subscribe(applyActive)
|
|
5136
|
-
applyActive()
|
|
5137
|
-
ensure()
|
|
5138
|
-
|
|
5148
|
+
const obs = new MutationObserver(ensure)
|
|
5149
|
+
obs.observe(document.body, { childList: true, subtree: true })
|
|
5150
|
+
document.addEventListener(ACTIVATE_EVENT, onOther)
|
|
5151
|
+
document.addEventListener('click', onSidebar, true)
|
|
5152
|
+
const unsub = toggle.subscribe(applyActive)
|
|
5153
|
+
applyActive(), ensure()
|
|
5139
5154
|
return () => {
|
|
5140
|
-
|
|
5141
|
-
|
|
5142
|
-
|
|
5143
|
-
|
|
5144
|
-
|
|
5145
|
-
|
|
5146
|
-
|
|
5147
|
-
if (container !== undefined) container.remove()
|
|
5148
|
-
container = undefined
|
|
5155
|
+
obs.disconnect()
|
|
5156
|
+
document.removeEventListener(ACTIVATE_EVENT, onOther)
|
|
5157
|
+
document.removeEventListener('click', onSidebar, true)
|
|
5158
|
+
unsub()
|
|
5159
|
+
document.documentElement.removeAttribute(ACTIVE_ATTR)
|
|
5160
|
+
if (root) root.unmount(), root = undefined
|
|
5161
|
+
if (container) container.remove(), container = undefined
|
|
5149
5162
|
}
|
|
5150
5163
|
}
|
|
5151
|
-
|
|
5152
5164
|
function registerFirst(ctx, candidates, component) {
|
|
5153
5165
|
for (const entry of candidates) {
|
|
5154
5166
|
try {
|
|
@@ -5168,9 +5180,21 @@ window.__ModuleLoader__.load({
|
|
|
5168
5180
|
return undefined
|
|
5169
5181
|
}
|
|
5170
5182
|
|
|
5183
|
+
function KanbanPanelIcon(props) {
|
|
5184
|
+
const s = typeof props?.size === 'number' ? props.size : 16
|
|
5185
|
+
return h('svg', {
|
|
5186
|
+
viewBox: '0 0 16 16', width: s, height: s, fill: 'none', stroke: 'currentColor',
|
|
5187
|
+
strokeWidth: '1.3', strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': 'true',
|
|
5188
|
+
'data-dsh-part': 'kanban-icon',
|
|
5189
|
+
}, h('rect', { x: 2, y: 2.5, width: 12, height: 11, rx: 1.5 }), h('path', { d: 'M2 6.5h12M6.5 6.5v7' }))
|
|
5190
|
+
}
|
|
5171
5191
|
helpers.createToggle = createToggle
|
|
5172
|
-
|
|
5173
|
-
|
|
5192
|
+
helpers.BoardScreen = BoardScreen
|
|
5193
|
+
helpers.TaskChip = TaskChip
|
|
5194
|
+
helpers.KanbanPanelIcon = KanbanPanelIcon
|
|
5195
|
+
helpers.mountSidebarEntry = mountSidebarEntry
|
|
5196
|
+
helpers.createFallbackNavEntry = createFallbackNavEntry
|
|
5197
|
+
helpers.placeNavEntry = placeNavEntry
|
|
5174
5198
|
|
|
5175
5199
|
function apply(ctx) {
|
|
5176
5200
|
ctx.effect(() => ctx.locale.register(NS, { en, zh }), 'dsh-kanban: locales')
|
|
@@ -5225,10 +5249,34 @@ window.__ModuleLoader__.load({
|
|
|
5225
5249
|
if (!cardSlot) cardSlot = 'settings.plugin.item'
|
|
5226
5250
|
})
|
|
5227
5251
|
|
|
5252
|
+
trySlot('sidebar.panellist', () => {
|
|
5253
|
+
ctx.slots.register({ name: 'sidebar.panellist', id: 'kanban', order: 25, label: () => fallbackT('section.label'), locale: NS }, KanbanPanelIcon)
|
|
5254
|
+
})
|
|
5255
|
+
trySlot('main', () => {
|
|
5256
|
+
ctx.slots.register({
|
|
5257
|
+
name: 'main', key: 'kanban', locale: NS,
|
|
5258
|
+
inject: () => ({ ctx, toggle, onClose: () => {
|
|
5259
|
+
if (typeof ctx?.layout?.selectPanel === 'function') ctx.layout.selectPanel(null)
|
|
5260
|
+
toggle.set(false)
|
|
5261
|
+
} }),
|
|
5262
|
+
}, BoardScreen)
|
|
5263
|
+
})
|
|
5228
5264
|
const toggle = createToggle()
|
|
5265
|
+
if (ctx?.layout?.panelInfo?.subscribe) {
|
|
5266
|
+
const pInfo = ctx.layout.panelInfo
|
|
5267
|
+
ctx.effect(() => {
|
|
5268
|
+
const sync = () => {
|
|
5269
|
+
const act = (pInfo.getSnapshot ? pInfo.getSnapshot() : pInfo)?.activePanelId
|
|
5270
|
+
if (act === 'kanban' && !toggle.isOpen()) toggle.set(true)
|
|
5271
|
+
else if (act !== 'kanban' && act !== undefined && toggle.isOpen()) toggle.set(false)
|
|
5272
|
+
}
|
|
5273
|
+
sync()
|
|
5274
|
+
return pInfo.subscribe(sync)
|
|
5275
|
+
}, 'dsh-kanban: sync layout activePanel')
|
|
5276
|
+
}
|
|
5229
5277
|
ctx.effect(() => {
|
|
5230
|
-
|
|
5231
|
-
|
|
5278
|
+
const off = [mountSidebarEntry(ctx, toggle, fallbackT('section.label')), mountBoard(ctx, toggle)]
|
|
5279
|
+
return () => { for (const fn of off) fn() }
|
|
5232
5280
|
}, 'dsh-kanban: shell board')
|
|
5233
5281
|
|
|
5234
5282
|
const chipSlot = registerFirst(ctx, [
|
package/lib/pr-generator.js
CHANGED
|
@@ -98,6 +98,7 @@ export function parseDiffStat(statText) {
|
|
|
98
98
|
* @returns {string} PR type
|
|
99
99
|
*/
|
|
100
100
|
export function inferPrType(task, commits = []) {
|
|
101
|
+
const commitList = typeof commits === 'string' ? parseGitLog(commits) : (Array.isArray(commits) ? commits : [])
|
|
101
102
|
const title = String(task?.title ?? '').toLowerCase()
|
|
102
103
|
const labels = Array.isArray(task?.labels) ? task.labels.map((l) => String(l).toLowerCase()) : []
|
|
103
104
|
|
|
@@ -116,7 +117,7 @@ export function inferPrType(task, commits = []) {
|
|
|
116
117
|
if (title.startsWith('docs:') || title.includes('document')) return 'docs'
|
|
117
118
|
if (title.startsWith('chore:') || title.includes('cleanup')) return 'chore'
|
|
118
119
|
|
|
119
|
-
for (const c of
|
|
120
|
+
for (const c of commitList) {
|
|
120
121
|
const msg = String(c?.message ?? '').toLowerCase()
|
|
121
122
|
if (msg.startsWith('fix')) return 'fix'
|
|
122
123
|
if (msg.startsWith('refactor')) return 'refactor'
|
|
@@ -134,7 +135,8 @@ export function inferPrType(task, commits = []) {
|
|
|
134
135
|
* @returns {string} PR title
|
|
135
136
|
*/
|
|
136
137
|
export function generatePrTitle(task, commits = []) {
|
|
137
|
-
const
|
|
138
|
+
const commitList = typeof commits === 'string' ? parseGitLog(commits) : (Array.isArray(commits) ? commits : [])
|
|
139
|
+
const type = inferPrType(task, commitList)
|
|
138
140
|
const scope = inferScope(task)
|
|
139
141
|
let cleanTitle = String(task?.title ?? '').trim()
|
|
140
142
|
|
|
@@ -159,6 +161,8 @@ export function generatePrTitle(task, commits = []) {
|
|
|
159
161
|
* @returns {string} Complete Markdown description for PR
|
|
160
162
|
*/
|
|
161
163
|
export function generatePrDescription({ task, commits = [], diffStats = null, verification = null }) {
|
|
164
|
+
const commitList = typeof commits === 'string' ? parseGitLog(commits) : (Array.isArray(commits) ? commits : [])
|
|
165
|
+
const stats = typeof diffStats === 'string' ? parseDiffStat(diffStats) : diffStats
|
|
162
166
|
const title = String(task?.title ?? '').trim()
|
|
163
167
|
const body = String(task?.body ?? '').trim()
|
|
164
168
|
const issueNum = typeof task?.issueNumber === 'number' ? task.issueNumber : null
|
|
@@ -193,17 +197,17 @@ export function generatePrDescription({ task, commits = [], diffStats = null, ve
|
|
|
193
197
|
lines.push('')
|
|
194
198
|
|
|
195
199
|
// 3. Changed components & diff statistics
|
|
196
|
-
if (
|
|
200
|
+
if (stats && (stats.files?.length > 0 || stats.filesChanged > 0)) {
|
|
197
201
|
lines.push('### Changed Components & Files')
|
|
198
|
-
lines.push(`- Total files changed: ${
|
|
202
|
+
lines.push(`- Total files changed: ${stats.filesChanged || stats.files.length}`)
|
|
199
203
|
if (diffStats.additions || diffStats.deletions) {
|
|
200
|
-
lines.push(`- Changes: +${
|
|
204
|
+
lines.push(`- Changes: +${stats.additions} / -${stats.deletions}`)
|
|
201
205
|
}
|
|
202
|
-
if (Array.isArray(
|
|
203
|
-
for (const f of
|
|
206
|
+
if (Array.isArray(stats.files) && stats.files.length > 0) {
|
|
207
|
+
for (const f of stats.files.slice(0, 12)) {
|
|
204
208
|
lines.push(` - \`${f.path}\``)
|
|
205
209
|
}
|
|
206
|
-
if (
|
|
210
|
+
if (stats.files.length > 12) {
|
|
207
211
|
lines.push(` - ... and ${diffStats.files.length - 12} more files`)
|
|
208
212
|
}
|
|
209
213
|
}
|
|
@@ -213,7 +217,7 @@ export function generatePrDescription({ task, commits = [], diffStats = null, ve
|
|
|
213
217
|
// 4. Commits list
|
|
214
218
|
if (Array.isArray(commits) && commits.length > 0) {
|
|
215
219
|
lines.push('### Commits')
|
|
216
|
-
for (const c of
|
|
220
|
+
for (const c of commitList) {
|
|
217
221
|
const shaShort = c.sha ? `\`${c.sha.slice(0, 7)}\` ` : ''
|
|
218
222
|
lines.push(`- ${shaShort}${c.message}`)
|
|
219
223
|
}
|
|
@@ -252,14 +256,15 @@ export function generatePrDescription({ task, commits = [], diffStats = null, ve
|
|
|
252
256
|
* @returns {string} Formatted release notes bullet
|
|
253
257
|
*/
|
|
254
258
|
export function generateReleaseNotes({ task, commits = [] }) {
|
|
259
|
+
const commitList = typeof commits === 'string' ? parseGitLog(commits) : (Array.isArray(commits) ? commits : [])
|
|
255
260
|
const title = String(task?.title ?? '').trim()
|
|
256
261
|
const issueNum = typeof task?.issueNumber === 'number' ? ` (#${task.issueNumber})` : ''
|
|
257
262
|
const cleanTitle = title.replace(/^[A-Z]:\s*(Feature|Bug|Fix|Refactor|Task):\s*/i, '')
|
|
258
263
|
|
|
259
264
|
const lines = [`- **${cleanTitle}${issueNum}**:`]
|
|
260
265
|
|
|
261
|
-
if (Array.isArray(
|
|
262
|
-
for (const c of
|
|
266
|
+
if (Array.isArray(commitList) && commitList.length > 0) {
|
|
267
|
+
for (const c of commitList.slice(0, 5)) {
|
|
263
268
|
lines.push(` - ${c.message}`)
|
|
264
269
|
}
|
|
265
270
|
} else {
|
package/lib/remote-runner.js
CHANGED
|
@@ -112,7 +112,7 @@ export function createRemoteGitRunner(config, localGitRunner) {
|
|
|
112
112
|
*/
|
|
113
113
|
export async function testRemoteConnection(config) {
|
|
114
114
|
const root = String(config?.remoteRoot || '/mnt/external/Project/DEV').trim()
|
|
115
|
-
const probeCmd =
|
|
115
|
+
const probeCmd = 'echo REMOTE_OK'
|
|
116
116
|
const sshArgs = buildSshArgs(config, probeCmd)
|
|
117
117
|
|
|
118
118
|
const startTime = Date.now()
|
|
@@ -122,9 +122,11 @@ export async function testRemoteConnection(config) {
|
|
|
122
122
|
timeout: 12000,
|
|
123
123
|
env: { ...process.env, LC_ALL: 'C' },
|
|
124
124
|
})
|
|
125
|
+
if (!(stdout || '').includes('REMOTE_OK')) {
|
|
126
|
+
return { ok: false, error: 'Remote probe failed' }
|
|
127
|
+
}
|
|
125
128
|
const latencyMs = Date.now() - startTime
|
|
126
|
-
const
|
|
127
|
-
const remoteRootFound = trimmed.includes('REMOTE_ROOT_OK')
|
|
129
|
+
const remoteRootFound = await remotePathExists(root, config)
|
|
128
130
|
|
|
129
131
|
return {
|
|
130
132
|
ok: true,
|
package/lib/routes/board.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { checkCostLimit, calculateTokenCost, extractSessionUsage } from '../cost-telemetry.js'
|
|
1
2
|
import { COLUMN_ORDER, columnsOf, wipLimitField, columnNamesOf } from '../config.js'
|
|
2
3
|
import { parsePlan, planItems, planProgress, taskState, queuePosition } from '../plan.js'
|
|
3
4
|
import { columnStats, doneWithin, stale } from '../metrics.js'
|
|
@@ -18,9 +19,19 @@ export function withPlan(task, liveOf, config, now, sameSession) {
|
|
|
18
19
|
? (live.step || live.activity || live.stateDetail || '')
|
|
19
20
|
: ''
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
let costMetrics = task.costMetrics || null
|
|
23
|
+
if (!costMetrics && (task.sessionUsage || live?.usage || live?.projectionView)) {
|
|
24
|
+
const usage = extractSessionUsage(task.sessionUsage || live?.usage || live?.projectionView)
|
|
25
|
+
if (usage.totalTokens > 0) {
|
|
26
|
+
costMetrics = {
|
|
27
|
+
...usage,
|
|
28
|
+
...calculateTokenCost({ usage, usdRate: config?.usdRate, currency: config?.currency }),
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
22
33
|
const costLimitExceeded = (config?.costMeterEnabled !== false && Number(config?.taskCostLimit) > 0 && costMetrics?.costUsd)
|
|
23
|
-
? costMetrics.costUsd
|
|
34
|
+
? checkCostLimit({ costUsd: costMetrics.costUsd, limit: Number(config.taskCostLimit) }).exceeded
|
|
24
35
|
: Boolean(task.costLimitExceeded)
|
|
25
36
|
|
|
26
37
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isTimeMachineAvailable, listTaskSnapshots, createCheckpointSnapshot, rollbackToSnapshot } from '../time-machine.js'
|
|
2
2
|
import { generateTechnicalSpec, parseSpecMarkdown } from '../plan-generator.js'
|
|
3
|
-
import { generatePrTitle, generatePrDescription, generateReleaseNotes } from '../pr-generator.js'
|
|
3
|
+
import { generatePrTitle, generatePrDescription, generateReleaseNotes, parseGitLog, parseDiffStat } from '../pr-generator.js'
|
|
4
4
|
import { getTaskCommits, getTaskDiffInspector } from '../worktree.js'
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -484,9 +484,11 @@ export async function handleTaskPrDescription({ store, id, method, body, gitRunn
|
|
|
484
484
|
}
|
|
485
485
|
}
|
|
486
486
|
|
|
487
|
-
const
|
|
488
|
-
const
|
|
489
|
-
const
|
|
487
|
+
const parsedCommits = typeof commits === 'string' ? parseGitLog(commits) : commits
|
|
488
|
+
const parsedDiff = typeof diffStats === 'string' ? parseDiffStat(diffStats) : diffStats
|
|
489
|
+
const generatedTitle = generatePrTitle(task, parsedCommits)
|
|
490
|
+
const generatedDescription = generatePrDescription({ task, commits: parsedCommits, diffStats: parsedDiff })
|
|
491
|
+
const releaseNotes = generateReleaseNotes({ task, commits: parsedCommits })
|
|
490
492
|
|
|
491
493
|
return {
|
|
492
494
|
status: 200,
|
package/lib/store.js
CHANGED
|
@@ -124,7 +124,11 @@ const WRITABLE = [
|
|
|
124
124
|
/** Valid transition sources; unexpected values are rejected to preserve log integrity. */
|
|
125
125
|
const SOURCES = new Set(['manual', 'session', 'gitea', 'github', 'tool', 'workflow', 'watchdog'])
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
let corruptedCostMetricsCount = 0
|
|
128
|
+
export function getCorruptedCostMetricsCount() { return corruptedCostMetricsCount }
|
|
129
|
+
export function resetCorruptedCostMetricsCount() { corruptedCostMetricsCount = 0 }
|
|
130
|
+
|
|
131
|
+
export function rowToTask(row) {
|
|
128
132
|
if (row === undefined) return undefined
|
|
129
133
|
const { col, labels, waiting, labelColors, runs, checklist, report, comments, rejectReason, rejectedAt, isEpic, parentId, stalled, blockedBy, inceptionSnapshotId, spec, prDescription, ...rest } = row
|
|
130
134
|
let parsedChecklist = []
|
|
@@ -177,7 +181,10 @@ function rowToTask(row) {
|
|
|
177
181
|
try {
|
|
178
182
|
const val = JSON.parse(rest.costMetrics);
|
|
179
183
|
if (val && typeof val === 'object') return val;
|
|
180
|
-
} catch {
|
|
184
|
+
} catch (err) {
|
|
185
|
+
corruptedCostMetricsCount++;
|
|
186
|
+
// Corrupted telemetry JSON counted for observability without breaking task hydration
|
|
187
|
+
}
|
|
181
188
|
}
|
|
182
189
|
return rest.costMetrics && typeof rest.costMetrics === 'object' ? rest.costMetrics : null;
|
|
183
190
|
})(),
|
|
@@ -952,6 +959,8 @@ export function openStore({ dir }) {
|
|
|
952
959
|
secureStorePermissions(dir)
|
|
953
960
|
},
|
|
954
961
|
|
|
962
|
+
getCorruptedMetricsCount: () => getCorruptedCostMetricsCount(),
|
|
963
|
+
resetCorruptedMetricsCount: () => resetCorruptedCostMetricsCount(),
|
|
955
964
|
close() {
|
|
956
965
|
try { secureStorePermissions(dir) } catch { /* ignore */ }
|
|
957
966
|
db.close()
|
package/lib/worktree.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { remotePathExists } from './remote-runner.js'
|
|
1
2
|
// Managed worktrees for task agent sessions (Issue #193).
|
|
2
3
|
//
|
|
3
4
|
// Isolating agent sessions in git worktrees protects the main repository
|
|
@@ -78,8 +79,12 @@ export function safeRepoKey(task) {
|
|
|
78
79
|
* @param {Function} [gitRunner]
|
|
79
80
|
* @returns {Promise<boolean>}
|
|
80
81
|
*/
|
|
81
|
-
export async function safeWorktreeExists(worktreePath, gitRunner) {
|
|
82
|
+
export async function safeWorktreeExists(worktreePath, gitRunner, config = null) {
|
|
82
83
|
if (!worktreePath) return false
|
|
84
|
+
if (config?.remoteMode) {
|
|
85
|
+
const existsRemotely = await remotePathExists(worktreePath, config)
|
|
86
|
+
if (existsRemotely) return true
|
|
87
|
+
}
|
|
83
88
|
if (existsSync(worktreePath)) return true
|
|
84
89
|
if (typeof gitRunner === 'function') {
|
|
85
90
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodandready/dsh-kanban",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.42",
|
|
4
4
|
"description": "Visual Kanban board for DeepSeek Harness: Gitea and GitHub-backed tasks, workflow columns, and a dedicated agent session per task.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -93,5 +93,6 @@
|
|
|
93
93
|
"@deepseek-ai/dsh-tools": {
|
|
94
94
|
"optional": true
|
|
95
95
|
}
|
|
96
|
-
}
|
|
96
|
+
},
|
|
97
|
+
"packageManager": "npm@10.9.8"
|
|
97
98
|
}
|