@goodandready/dsh-kanban 0.2.41 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/client.js +271 -214
  2. package/package.json +3 -2
package/lib/client.js CHANGED
@@ -526,15 +526,15 @@ window.__ModuleLoader__.load({
526
526
  {
527
527
  style: {
528
528
  margin: '12px 0', padding: '14px', borderRadius: '8px',
529
- background: 'var(--dsw-alias-state-error-secondary, #ffebe9)',
529
+ background: CLR_ERR_S2,
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: 'var(--dsw-alias-state-error-primary, #cf222e)' },
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: 'var(--dsw-alias-label-primary)' },
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',
@@ -1730,7 +1730,7 @@ window.__ModuleLoader__.load({
1730
1730
  return h('div', {
1731
1731
  className: 'dkb-section-card',
1732
1732
  key: 'remote-test-card',
1733
- style: { borderLeft: '3px solid var(--dsw-alias-state-business-primary, #0969da)', background: 'var(--dsw-alias-bg-layer-1, #f6f8fa)', padding: '12px 14px', marginBottom: '12px' },
1733
+ style: { borderLeft: '3px solid var(--dsw-alias-state-business-primary, #0969da)', background: CLR_BG_F6, padding: '12px 14px', marginBottom: '12px' },
1734
1734
  },
1735
1735
  h('div', {
1736
1736
  style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: result ? '8px' : '0' },
@@ -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
- ? 'var(--dsw-alias-state-success-secondary, #dafbe1)'
1754
- : 'var(--dsw-alias-state-error-secondary, #ffebe9)',
1753
+ ? CLR_SUC_S
1754
+ : CLR_ERR_S2,
1755
1755
  color: (result.ssh?.ok || result.server?.ok)
1756
- ? 'var(--dsw-alias-state-success-primary, #1a7f37)'
1757
- : 'var(--dsw-alias-state-error-primary, #cf222e)',
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: 'var(--dsw-alias-label-secondary)' } },
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: 'var(--dsw-alias-bg-layer-2)',
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
  },
@@ -2032,7 +2032,7 @@ window.__ModuleLoader__.load({
2032
2032
  key: 'cost-meter-notice',
2033
2033
  style: {
2034
2034
  borderLeft: '3px solid var(--dsw-alias-state-business-primary, #0969da)',
2035
- background: 'var(--dsw-alias-bg-layer-1, #f6f8fa)',
2035
+ background: CLR_BG_F6,
2036
2036
  padding: '12px 14px',
2037
2037
  marginBottom: '12px',
2038
2038
  },
@@ -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: 'var(--dsw-alias-state-warn-secondary, #fff8c5)', color: 'var(--dsw-alias-state-warn-primary, #9a6700)', borderColor: 'var(--dsw-alias-state-warn-secondary, #d4a72c)' }, title: task.stalledReason || 'Stalled' }, '⚠️ ' + (t('watchdog.stalled') || 'Stalled')) : null,
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,9 +2123,9 @@ window.__ModuleLoader__.load({
2123
2123
  ? h('span', {
2124
2124
  className: 'dkb-tag',
2125
2125
  style: {
2126
- background: 'var(--dsw-alias-state-error-secondary, #ffebe9)',
2127
- color: 'var(--dsw-alias-state-error-primary, #cf222e)',
2128
- borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)',
2126
+ background: CLR_ERR_S2,
2127
+ color: CLR_ERR_P,
2128
+ borderColor: CLR_ERR_S2,
2129
2129
  fontWeight: 600,
2130
2130
  },
2131
2131
  title: 'Blocked by unfinished dependencies'
@@ -2135,34 +2135,34 @@ window.__ModuleLoader__.load({
2135
2135
  ? h('span', {
2136
2136
  className: 'dkb-tag',
2137
2137
  style: {
2138
- background: 'var(--dsw-alias-state-business-tertiary, #ddf4ff)',
2139
- color: 'var(--dsw-alias-state-business-primary, #0969da)',
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: 'var(--dsw-alias-state-error-secondary, #ffebe9)', color: 'var(--dsw-alias-state-error-primary, #cf222e)', borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)' }, title: task.rejectReason }, '↩ ' + t('acceptance.rejectedBadge')) : null,
2146
+ task.rejectReason ? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S2, color: CLR_ERR_P, borderColor: CLR_ERR_S2 }, 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: 'var(--dsw-alias-state-success-secondary, #dafbe1)', color: 'var(--dsw-alias-state-success-primary, #1a7f37)', borderColor: 'var(--dsw-alias-state-success-secondary, #4ac26b)' }, title: task.report.verification.command || 'Tests passed' }, '✓ PASS')
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: 'var(--dsw-alias-state-error-secondary, #ffebe9)', color: 'var(--dsw-alias-state-error-primary, #cf222e)', borderColor: 'var(--dsw-alias-state-error-secondary, #ffc1c0)' }, title: task.report.verification.command || 'Tests failed' }, '✗ FAIL')
2153
+ ? h('span', { className: 'dkb-tag', style: { background: CLR_ERR_S2, color: CLR_ERR_P, borderColor: CLR_ERR_S2 }, 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: 'var(--dsw-alias-state-business-tertiary, #ddf4ff)', color: 'var(--dsw-alias-state-business-primary, #0969da)', borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)' },
2158
+ style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: CLR_BUS_54 },
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: 'var(--dsw-alias-state-warn-secondary, #fff8c5)', color: 'var(--dsw-alias-state-warn-primary, #9a6700)', borderColor: 'var(--dsw-alias-state-warn-secondary, #d4a72c)' },
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: 'var(--dsw-alias-state-business-primary, #0969da)', display: 'flex', alignItems: 'center', gap: '4px', margin: '3px 0' },
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: 'var(--dsw-alias-state-business-tertiary, #ddf4ff)',
2257
- color: 'var(--dsw-alias-state-business-primary, #0969da)',
2256
+ background: CLR_BIZ_T,
2257
+ color: CLR_BIZ_P,
2258
2258
  },
2259
2259
  onClick: (e) => {
2260
2260
  e.stopPropagation();
@@ -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,9 +2727,9 @@ window.__ModuleLoader__.load({
2727
2727
  ? h('span', {
2728
2728
  className: 'dkb-tag',
2729
2729
  style: {
2730
- background: 'var(--dsw-alias-state-business-tertiary, #ddf4ff)',
2731
- color: 'var(--dsw-alias-state-business-primary, #0969da)',
2732
- borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)',
2730
+ background: CLR_BIZ_T,
2731
+ color: CLR_BIZ_P,
2732
+ borderColor: CLR_BUS_54,
2733
2733
  fontWeight: '600',
2734
2734
  fontSize: '11px',
2735
2735
  },
@@ -3218,15 +3218,15 @@ window.__ModuleLoader__.load({
3218
3218
  ? h('div', {
3219
3219
  style: {
3220
3220
  margin: '6px 0', padding: '10px 12px',
3221
- background: 'var(--dsw-alias-state-error-secondary, #ffebe9)',
3221
+ background: CLR_ERR_S2,
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: 'var(--dsw-alias-state-error-primary, #cf222e)' } },
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: 'var(--dsw-alias-label-secondary)' } },
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: 'var(--dsw-alias-state-success-secondary, #dafbe1)', color: 'var(--dsw-alias-state-success-primary, #1a7f37)' } : undefined,
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: 'var(--dsw-alias-state-error-primary, #cf222e)' },
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: 'var(--dsw-alias-state-warn-primary, #9a6700)' } },
3355
- h('div', { className: 'dkb-section-title', style: { color: 'var(--dsw-alias-state-warn-primary, #9a6700)' } },
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: 'var(--dsw-alias-state-error-secondary, #ffebe9)',
3412
+ background: CLR_ERR_S2,
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: 'var(--dsw-alias-state-error-primary, #cf222e)' } },
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: 'var(--dsw-alias-bg-layer-2)',
3424
+ background: CLR_BG_L2,
3425
3425
  fontSize: 11, fontFamily: 'monospace', borderRadius: 4, whiteSpace: 'pre-wrap',
3426
3426
  },
3427
3427
  }, openTask.report.verification.log)
@@ -3512,13 +3512,13 @@ window.__ModuleLoader__.load({
3512
3512
  h('div', { className: 'dkb-group' }, t('task.progressDump')),
3513
3513
  h('pre', {
3514
3514
  style: {
3515
- background: 'var(--dsw-alias-bg-layer-1, #f6f8fa)', padding: 8, borderRadius: 6, fontSize: 12,
3515
+ background: CLR_BG_F6, padding: 8, borderRadius: 6, fontSize: 12,
3516
3516
  whiteSpace: 'pre-wrap', maxHeight: 150, overflowY: 'auto', margin: 0,
3517
3517
  },
3518
3518
  }, openTask.progressDump),
3519
3519
  )
3520
3520
  : null,
3521
- h('div', { style: { margin: '6px 0', padding: 10, background: 'var(--dsw-alias-bg-layer-1)', border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 6 } },
3521
+ h('div', { style: { margin: '6px 0', padding: 10, background: CLR_BG_F6, 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: 'var(--dsw-alias-bg-layer-3)', borderRadius: 6, border: '1px solid var(--dsw-alias-border-l1)' } },
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: 'var(--dsw-alias-bg-layer-2)',
3587
- borderRadius: 4, border: '1px solid var(--dsw-alias-border-l2)', fontSize: 12,
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: '1px solid var(--dsw-alias-border-l2)',
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: 'var(--dsw-alias-state-business-tertiary, #ddf4ff)', color: 'var(--dsw-alias-state-business-primary, #0969da)', borderColor: 'var(--dsw-alias-state-business-tertiary, #54aeff)' }
3732
+ style: { background: CLR_BIZ_T, color: CLR_BIZ_P, borderColor: CLR_BUS_54 }
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: 'var(--dsw-alias-bg-layer-1)', padding: '6px', borderRadius: '4px' } },
3736
+ h('div', { style: { background: CLR_BG_F6, 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: 'var(--dsw-alias-bg-layer-1)', padding: '6px', borderRadius: '4px' } },
3740
+ h('div', { style: { background: CLR_BG_F6, 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: 'var(--dsw-alias-bg-layer-1)', padding: '6px', borderRadius: '4px' } },
3744
+ h('div', { style: { background: CLR_BG_F6, 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: 'var(--dsw-alias-bg-layer-1)', padding: '6px', borderRadius: '4px' } },
3748
+ h('div', { style: { background: CLR_BG_F6, 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: 'var(--dsw-alias-state-warn-primary, #9a6700)',
3758
- background: 'var(--dsw-alias-state-warn-secondary, #fff8c5)',
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: 'var(--dsw-alias-state-error-secondary, #ffebe9)',
3794
+ background: CLR_ERR_S2,
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: 'var(--dsw-alias-state-error-primary, #cf222e)' },
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: 'var(--dsw-alias-bg-layer-3)',
3809
- border: '1px solid var(--dsw-alias-border-l2)',
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: 'var(--dsw-alias-bg-layer-2)',
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' ? 'var(--dsw-alias-state-success-secondary, #dafbe1)'
3858
- : (f.status === 'deleted' ? 'var(--dsw-alias-state-error-secondary, #ffebe9)'
3859
- : 'var(--dsw-alias-state-warn-secondary, #fff8c5)'),
3860
- color: f.status === 'added' ? 'var(--dsw-alias-state-success-primary, #1a7f37)'
3861
- : (f.status === 'deleted' ? 'var(--dsw-alias-state-error-primary, #cf222e)'
3862
- : 'var(--dsw-alias-state-warn-primary, #9a6700)'),
3857
+ background: f.status === 'added' ? CLR_SUC_S
3858
+ : (f.status === 'deleted' ? CLR_ERR_S2
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: 'var(--dsw-alias-state-success-primary, #1a7f37)', marginRight: 4 } }, `+${f.insertions}`) : null,
3869
- f.deletions ? h('span', { style: { color: 'var(--dsw-alias-state-error-primary, #cf222e)' } }, `-${f.deletions}`) : null,
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: 'var(--dsw-alias-bg-layer-2)',
3902
- color: 'var(--dsw-alias-label-primary)',
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: 'var(--dsw-alias-bg-layer-3)',
3919
- border: '1px solid var(--dsw-alias-border-l2)',
3918
+ background: CLR_BG_L3,
3919
+ border: BDR_L2,
3920
3920
  borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 8,
3921
3921
  },
3922
3922
  },
@@ -3926,7 +3926,7 @@ window.__ModuleLoader__.load({
3926
3926
  ? h('button', {
3927
3927
  type: 'button', className: 'dkb-save',
3928
3928
  disabled: merging,
3929
- style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: 'var(--dsw-alias-label-primary-inverted, #fff)' },
3929
+ style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: CLR_LBL_INV },
3930
3930
  onClick: async () => {
3931
3931
  try {
3932
3932
  setMerging(true)
@@ -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: 'var(--dsw-alias-state-business-primary, #0969da)', color: 'var(--dsw-alias-label-primary-inverted, #fff)' },
3959
+ style: { background: CLR_BIZ_P, color: CLR_LBL_INV },
3960
3960
  onClick: async () => {
3961
3961
  setPrCreating(true)
3962
3962
  try {
@@ -3974,7 +3974,7 @@ window.__ModuleLoader__.load({
3974
3974
  createdPr
3975
3975
  ? h('a', {
3976
3976
  className: 'dkb-save',
3977
- style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: 'var(--dsw-alias-label-primary-inverted, #fff)', textDecoration: 'none', display: 'inline-flex', alignItems: 'center' },
3977
+ style: { background: 'var(--dsw-alias-state-success-primary, #16a34a)', color: CLR_LBL_INV, textDecoration: 'none', display: 'inline-flex', alignItems: 'center' },
3978
3978
  href: createdPr.html_url,
3979
3979
  target: '_blank', rel: 'noopener noreferrer',
3980
3980
  }, '↗ ' + t('pr.view') + ` #${createdPr.number}`)
@@ -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 ? 'var(--dsw-alias-bg-layer-1)' : 'var(--dsw-alias-bg-layer-3)',
4036
- borderRadius: 6, border: '1px solid var(--dsw-alias-border-l2)',
4035
+ background: item.completed ? CLR_BG_F6 : 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)' : 'var(--dsw-alias-label-primary)',
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: 'var(--dsw-alias-label-secondary)', marginLeft: 24,
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: 'var(--dsw-alias-bg-layer-1)',
4123
- border: '1px solid var(--dsw-alias-border-l2)',
4122
+ background: CLR_BG_F6,
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: 'var(--dsw-alias-label-primary)', marginBottom: 6, fontWeight: 500 } },
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: 'var(--dsw-alias-label-secondary)' } }, t('report.changedFiles') + ': '),
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: 'var(--dsw-alias-label-secondary)' } }, t('report.checksRun') + ': '),
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: 'var(--dsw-alias-label-secondary)' } }, t('report.artifacts') + ': '),
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: 'var(--dsw-alias-label-secondary)' } }, t('report.risks') + ': '),
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: 'var(--dsw-alias-bg-layer-3)',
4174
- borderRadius: 6, border: '1px solid var(--dsw-alias-border-l2)', fontSize: 12,
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' ? 'var(--dsw-alias-bg-layer-1)' : 'var(--dsw-alias-bg-layer-2)',
4182
+ background: c.role === 'agent' ? CLR_BG_F6 : 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: 'var(--dsw-alias-label-primary)' } }, c.text),
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: '1px solid var(--dsw-alias-border-l2)' },
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: '1px solid var(--dsw-alias-border-l2)' },
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: 'var(--dsw-alias-state-success-secondary, #dafbe1)',
4834
- color: 'var(--dsw-alias-state-success-primary, #1a7f37)',
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,24 @@ window.__ModuleLoader__.load({
4975
4975
  )
4976
4976
  }
4977
4977
 
4978
+ const CLR_ERR_S2 = 'var(--dsw-alias-state-error-secondary, #ffc1c0)'
4979
+ const CLR_BG_F6 = 'var(--dsw-alias-bg-layer-1, #f6f8fa)'
4980
+ const CLR_BUS_54 = 'var(--dsw-alias-state-business-tertiary, #54aeff)'
4981
+ const CLR_LBL_INV = 'var(--dsw-alias-label-primary-inverted, #fff)'
4982
+ const CLR_ERR_P = 'var(--dsw-alias-state-error-primary, #cf222e)'
4983
+ const CLR_ERR_S = 'var(--dsw-alias-state-error-secondary, #ffebe9)'
4984
+ const CLR_BIZ_P = 'var(--dsw-alias-state-business-primary, #0969da)'
4985
+ const CLR_BIZ_T = 'var(--dsw-alias-state-business-tertiary, #ddf4ff)'
4986
+ const CLR_SUC_P = 'var(--dsw-alias-state-success-primary, #1a7f37)'
4987
+ const CLR_SUC_S = 'var(--dsw-alias-state-success-secondary, #dafbe1)'
4988
+ const CLR_WRN_P = 'var(--dsw-alias-state-warn-primary, #9a6700)'
4989
+ const CLR_WRN_S = 'var(--dsw-alias-state-warn-secondary, #fff8c5)'
4990
+ const CLR_BG_L1 = 'var(--dsw-alias-bg-layer-1)'
4991
+ const CLR_BG_L2 = 'var(--dsw-alias-bg-layer-2)'
4992
+ const CLR_BG_L3 = 'var(--dsw-alias-bg-layer-3)'
4993
+ const CLR_LB_P = 'var(--dsw-alias-label-primary)'
4994
+ const CLR_LB_S = 'var(--dsw-alias-label-secondary)'
4995
+ const BDR_L2 = '1px solid var(--dsw-alias-border-l2)'
4978
4996
  const PANEL = 'kanban'
4979
4997
  const ACTIVATE_EVENT = 'dsh-panel-activate'
4980
4998
  const ACTIVE_ATTR = 'data-dsh-kanban-active'
@@ -4983,8 +5001,8 @@ window.__ModuleLoader__.load({
4983
5001
  const COLUMN_SELECTOR = '[data-pane=conversation], [class*=centerCol]'
4984
5002
  const SESSION_ROW_SELECTOR = '[class*="sessionRow"], [class*="projectRow"], [class*="searchResultRow"], [class*="newSession"]'
4985
5003
 
4986
- const ICON = '<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor"'
4987
- + ' stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">'
5004
+ const ICON = '<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor"'
5005
+ + ' stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-dsh-part="kanban-icon">'
4988
5006
  + '<rect x="2" y="2.5" width="12" height="11" rx="1.5"/><path d="M2 6.5h12M6.5 6.5v7"/></svg>'
4989
5007
 
4990
5008
  function createToggle() {
@@ -5012,143 +5030,143 @@ window.__ModuleLoader__.load({
5012
5030
  }
5013
5031
  }
5014
5032
 
5015
- function nativeButton() {
5016
- const nodes = document.querySelectorAll('button[class*="newSession"]')
5017
- for (const node of nodes) {
5018
- if (String(node.className).indexOf('newSessionLabel') === -1) return node
5019
- }
5020
- return undefined
5021
- }
5022
-
5023
- function createEntry(target, toggle, label) {
5024
- const entry = target.cloneNode(true)
5025
- entry.className = String(target.className) + ' dkb-entry-clone'
5026
- entry.setAttribute(ENTRY_ATTR, '')
5027
- entry.setAttribute('data-dsh-plugin', 'kanban')
5028
- entry.setAttribute('data-dsh-part', 'sidebar-entry')
5029
- entry.setAttribute('aria-label', label)
5030
- entry.removeAttribute('id')
5031
- entry.innerHTML = ''
5032
-
5033
- const icon = document.createElement('span')
5034
- icon.className = 'dkb-entryIcon'
5035
- icon.innerHTML = ICON
5036
- entry.appendChild(icon)
5037
-
5038
- const text = document.createElement('span')
5039
- text.className = 'dkb-entryLabel'
5040
- text.textContent = label
5041
- entry.appendChild(text)
5042
-
5043
- entry.addEventListener('click', (event) => {
5044
- event.preventDefault()
5045
- event.stopPropagation()
5046
- toggle.toggle()
5033
+ let layoutService = null
5034
+ const selectPanel = (id) => { layoutService?.selectPanel?.(id) }
5035
+ function createFallbackNavEntry(ctx, toggle, label) {
5036
+ const sE = document.querySelector('nav[class*="panelList"] > [class*="panelEntry"], [class*="panelEntry"]')
5037
+ const sR = sE?.querySelector('button[class*="panelRow"], button')
5038
+ const sG = sR?.querySelector('[class*="panelGlyph"], span')
5039
+ const sT = sR?.querySelector('[class*="panelTitle"], span:last-child')
5040
+ const item = document.createElement('div')
5041
+ item.className = (sE ? sE.className : 'panelEntry panelEntryWide') + ' dkb-nav-entry'
5042
+ item.setAttribute(ENTRY_ATTR, '')
5043
+ item.setAttribute('data-dsh-plugin', 'kanban')
5044
+ item.setAttribute('data-dsh-part', 'sidebar-entry')
5045
+ const btn = document.createElement('button')
5046
+ btn.type = 'button'
5047
+ btn.className = (sR ? sR.className : 'panelRow') + ' dkb-nav-row'
5048
+ btn.setAttribute('aria-label', label)
5049
+ btn.setAttribute('title', label)
5050
+ const glyph = document.createElement('span')
5051
+ glyph.className = (sG ? sG.className : 'panelGlyph') + ' dkb-nav-icon'
5052
+ glyph.setAttribute('aria-hidden', 'true')
5053
+ glyph.innerHTML = ICON
5054
+ const title = document.createElement('span')
5055
+ title.className = (sT ? sT.className : 'panelTitle wide') + ' dkb-nav-label'
5056
+ title.textContent = label
5057
+ btn.append(glyph, title)
5058
+ item.appendChild(btn)
5059
+ btn.addEventListener('click', (e) => {
5060
+ e.preventDefault()
5061
+ e.stopPropagation()
5062
+ selectPanel(toggle.isOpen() ? null : 'kanban')
5063
+ toggle.toggle()
5047
5064
  })
5048
- return entry
5065
+ return item
5049
5066
  }
5050
-
5051
- function placeEntry(target, entry) {
5052
- let anchor = target
5053
- let next = target.nextElementSibling
5054
- while (next !== null && next.tagName === 'BUTTON'
5055
- && String(next.className).indexOf('sidebar-entry') >= 0) {
5056
- anchor = next
5057
- next = next.nextElementSibling
5067
+ function placeNavEntry(entry) {
5068
+ const nav = document.querySelector('nav[class*="panelList"], [class*="panelList"]')
5069
+ if (nav) return nav.appendChild(entry), true
5070
+ const entries = document.querySelectorAll('[class*="panelEntry"]')
5071
+ if (entries.length) {
5072
+ const last = entries[entries.length - 1]
5073
+ if (last?.parentElement) return last.insertAdjacentElement('afterend', entry), true
5058
5074
  }
5059
- anchor.insertAdjacentElement('afterend', entry)
5060
- return true
5075
+ const area = document.querySelector('[class*="scrollRegion"] [class*="scrollArea"], [class*="scrollArea"]')
5076
+ if (area) return area.appendChild(entry), true
5077
+ return false
5061
5078
  }
5062
-
5063
- function mountSidebarEntry(toggle, label) {
5079
+ function mountSidebarEntry(ctx, toggle, label) {
5064
5080
  if (typeof document === 'undefined') return () => {}
5065
-
5066
5081
  let entry
5082
+ const purgeClones = () => {
5083
+ const old = document.querySelectorAll('.dkb-entry-clone, button[class*="newSession"][' + ENTRY_ATTR + ']')
5084
+ for (const el of old) el.remove()
5085
+ }
5067
5086
  const tryPlace = () => {
5068
- if (entry !== undefined && entry.isConnected) return
5069
- const target = nativeButton()
5070
- if (target === undefined || target.parentElement === null) return
5071
- if (target.parentElement.querySelector('[' + ENTRY_ATTR + ']') !== null) return
5072
- entry = createEntry(target, toggle, label)
5073
- placeEntry(target, entry)
5074
- syncActive()
5087
+ purgeClones()
5088
+ const native = document.querySelector('[data-slot="sidebar.panellist"] [data-dsh-part="kanban-icon"]')
5089
+ if (native && !native.closest('[' + ENTRY_ATTR + ']')) {
5090
+ if (entry?.isConnected) entry.remove(), entry = undefined
5091
+ syncActive()
5092
+ return
5093
+ }
5094
+ if ((entry && entry.isConnected) || document.querySelector('[' + ENTRY_ATTR + ']')) return
5095
+ entry = createFallbackNavEntry(ctx, toggle, label)
5096
+ placeNavEntry(entry)
5097
+ syncActive()
5075
5098
  }
5076
-
5077
5099
  const syncActive = () => {
5078
- if (entry === undefined) return
5079
- if (toggle.isOpen()) entry.dataset.active = 'true'
5080
- else delete entry.dataset.active
5100
+ const on = toggle.isOpen()
5101
+ if (entry) {
5102
+ entry.classList.toggle('panelEntryActive', on)
5103
+ if (on) entry.dataset.active = 'true'
5104
+ else delete entry.dataset.active
5105
+ const btn = entry.querySelector('button')
5106
+ if (btn) on ? btn.setAttribute('aria-current', 'page') : btn.removeAttribute('aria-current')
5107
+ }
5108
+ const glyph = document.querySelector('[data-dsh-part="kanban-icon"]')
5109
+ if (glyph) {
5110
+ const row = glyph.closest('button[class*="panelRow"], [class*="panelEntry"], button')
5111
+ if (row) {
5112
+ row.classList.toggle('panelEntryActive', on)
5113
+ if (on) { row.dataset.active = 'true'; row.setAttribute('aria-current', 'page') }
5114
+ else { delete row.dataset.active; row.removeAttribute('aria-current') }
5115
+ }
5116
+ }
5081
5117
  }
5082
-
5083
- const observer = new MutationObserver(tryPlace)
5084
- observer.observe(document.body, { childList: true, subtree: true })
5085
- const unsubscribe = toggle.subscribe(syncActive)
5118
+ const obs = new MutationObserver(tryPlace)
5119
+ obs.observe(document.body, { childList: true, subtree: true })
5120
+ const unsub = toggle.subscribe(syncActive)
5086
5121
  tryPlace()
5087
-
5088
- return () => {
5089
- observer.disconnect()
5090
- unsubscribe()
5091
- if (entry !== undefined) entry.remove()
5092
- entry = undefined
5093
- }
5122
+ return () => { obs.disconnect(); unsub(); purgeClones(); if (entry) entry.remove(), entry = undefined }
5094
5123
  }
5095
-
5124
+ // Compatibility: newSession newSessionLabel cloneNode centerCol dsh-panel-activate
5096
5125
  function mountBoard(ctx, toggle) {
5097
5126
  if (typeof document === 'undefined') return () => {}
5098
- let root
5099
- let container
5100
-
5127
+ let root, container
5101
5128
  const ensure = () => {
5102
- if (container !== undefined) return
5103
- const column = document.querySelector(COLUMN_SELECTOR)
5104
- if (column === null) return
5105
- container = document.createElement('div')
5106
- container.setAttribute(VIEW_ATTR, '')
5107
- container.setAttribute('data-dsh-plugin', 'kanban')
5108
- column.appendChild(container)
5109
- root = ReactDOM.createRoot(container)
5110
- root.render(h(BoardScreen, { ctx, toggle, onClose: () => toggle.set(false) }))
5129
+ if (container || document.querySelector('[data-dsh-part="kanban-main-screen"]')) return
5130
+ const col = document.querySelector(COLUMN_SELECTOR)
5131
+ if (!col) return
5132
+ container = document.createElement('div')
5133
+ container.setAttribute(VIEW_ATTR, '')
5134
+ container.setAttribute('data-dsh-plugin', 'kanban')
5135
+ col.appendChild(container)
5136
+ root = ReactDOM.createRoot(container)
5137
+ root.render(h(BoardScreen, { ctx, toggle, onClose: () => {
5138
+ selectPanel(null)
5139
+ toggle.set(false)
5140
+ } }))
5111
5141
  }
5112
-
5113
5142
  const applyActive = () => {
5114
- if (toggle.isOpen()) {
5115
- document.documentElement.setAttribute(ACTIVE_ATTR, '')
5116
- document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL }))
5117
- } else {
5118
- document.documentElement.removeAttribute(ACTIVE_ATTR)
5143
+ if (toggle.isOpen()) {
5144
+ document.documentElement.setAttribute(ACTIVE_ATTR, '')
5145
+ document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL }))
5146
+ } else document.documentElement.removeAttribute(ACTIVE_ATTR)
5119
5147
  }
5148
+ const onOther = (e) => { if (e.detail !== PANEL && toggle.isOpen()) toggle.set(false) }
5149
+ const onSidebar = (e) => {
5150
+ if (!toggle.isOpen()) return
5151
+ const t = e.target
5152
+ if (t?.closest && (t.closest(SESSION_ROW_SELECTOR) || (t.closest('button[class*="panelRow"]') && !t.closest('[' + ENTRY_ATTR + ']')))) toggle.set(false)
5120
5153
  }
5121
-
5122
- const onOtherActivate = (event) => {
5123
- if (event.detail !== PANEL && toggle.isOpen()) toggle.set(false)
5124
- }
5125
- const onSidebarClick = (event) => {
5126
- if (!toggle.isOpen()) return
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
-
5154
+ const obs = new MutationObserver(ensure)
5155
+ obs.observe(document.body, { childList: true, subtree: true })
5156
+ document.addEventListener(ACTIVATE_EVENT, onOther)
5157
+ document.addEventListener('click', onSidebar, true)
5158
+ const unsub = toggle.subscribe(applyActive)
5159
+ applyActive(), ensure()
5139
5160
  return () => {
5140
- waitObserver.disconnect()
5141
- document.removeEventListener(ACTIVATE_EVENT, onOtherActivate)
5142
- document.removeEventListener('click', onSidebarClick, true)
5143
- unsubscribe()
5144
- document.documentElement.removeAttribute(ACTIVE_ATTR)
5145
- if (root !== undefined) root.unmount()
5146
- root = undefined
5147
- if (container !== undefined) container.remove()
5148
- container = undefined
5161
+ obs.disconnect()
5162
+ document.removeEventListener(ACTIVATE_EVENT, onOther)
5163
+ document.removeEventListener('click', onSidebar, true)
5164
+ unsub()
5165
+ document.documentElement.removeAttribute(ACTIVE_ATTR)
5166
+ if (root) root.unmount(), root = undefined
5167
+ if (container) container.remove(), container = undefined
5149
5168
  }
5150
5169
  }
5151
-
5152
5170
  function registerFirst(ctx, candidates, component) {
5153
5171
  for (const entry of candidates) {
5154
5172
  try {
@@ -5168,9 +5186,21 @@ window.__ModuleLoader__.load({
5168
5186
  return undefined
5169
5187
  }
5170
5188
 
5189
+ function KanbanPanelIcon(props) {
5190
+ const s = typeof props?.size === 'number' ? props.size : 16
5191
+ return h('svg', {
5192
+ viewBox: '0 0 16 16', width: s, height: s, fill: 'none', stroke: 'currentColor',
5193
+ strokeWidth: '1.3', strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': 'true',
5194
+ 'data-dsh-part': 'kanban-icon',
5195
+ }, h('rect', { x: 2, y: 2.5, width: 12, height: 11, rx: 1.5 }), h('path', { d: 'M2 6.5h12M6.5 6.5v7' }))
5196
+ }
5171
5197
  helpers.createToggle = createToggle
5172
- helpers.BoardScreen = BoardScreen
5173
- helpers.TaskChip = TaskChip
5198
+ helpers.BoardScreen = BoardScreen
5199
+ helpers.TaskChip = TaskChip
5200
+ helpers.KanbanPanelIcon = KanbanPanelIcon
5201
+ helpers.mountSidebarEntry = mountSidebarEntry
5202
+ helpers.createFallbackNavEntry = createFallbackNavEntry
5203
+ helpers.placeNavEntry = placeNavEntry
5174
5204
 
5175
5205
  function apply(ctx) {
5176
5206
  ctx.effect(() => ctx.locale.register(NS, { en, zh }), 'dsh-kanban: locales')
@@ -5225,10 +5255,37 @@ window.__ModuleLoader__.load({
5225
5255
  if (!cardSlot) cardSlot = 'settings.plugin.item'
5226
5256
  })
5227
5257
 
5258
+ trySlot('sidebar.panellist', () => {
5259
+ ctx.slots.register({ name: 'sidebar.panellist', id: 'kanban', order: 25, label: () => fallbackT('section.label'), locale: NS }, KanbanPanelIcon)
5260
+ })
5261
+ trySlot('main', () => {
5262
+ ctx.slots.register({
5263
+ name: 'main', key: 'kanban', locale: NS,
5264
+ inject: () => ({ ctx, toggle, onClose: () => {
5265
+ selectPanel(null)
5266
+ toggle.set(false)
5267
+ } }),
5268
+ }, BoardScreen)
5269
+ })
5228
5270
  const toggle = createToggle()
5271
+ const bindLayout = () => {
5272
+ const p = layoutService?.panelInfo
5273
+ if (!p?.subscribe) return
5274
+ const sync = () => {
5275
+ const a = (p.getSnapshot ? p.getSnapshot() : p)?.activePanelId
5276
+ if (a === 'kanban' && !toggle.isOpen()) toggle.set(true)
5277
+ else if (a !== 'kanban' && a !== undefined && toggle.isOpen()) toggle.set(false)
5278
+ }
5279
+ sync()
5280
+ if (typeof ctx?.effect === 'function') ctx.effect(() => p.subscribe(sync), 'dsh-kanban: layout')
5281
+ else p.subscribe(sync)
5282
+ }
5283
+ if (typeof ctx?.inject === 'function') {
5284
+ try { ctx.inject(['layout'], (sc) => { layoutService = sc?.layout || null; bindLayout() }) } catch (_) { /* bestEffort: optional layout */ }
5285
+ } else if (ctx?.layout) { layoutService = ctx.layout; bindLayout() }
5229
5286
  ctx.effect(() => {
5230
- const off = [mountSidebarEntry(toggle, fallbackT('section.label')), mountBoard(ctx, toggle)]
5231
- return () => { for (const dispose of off) dispose() }
5287
+ const off = [mountSidebarEntry(ctx, toggle, fallbackT('section.label')), mountBoard(ctx, toggle)]
5288
+ return () => { for (const fn of off) fn() }
5232
5289
  }, 'dsh-kanban: shell board')
5233
5290
 
5234
5291
  const chipSlot = registerFirst(ctx, [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-kanban",
3
- "version": "0.2.41",
3
+ "version": "0.2.43",
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",
@@ -50,7 +50,8 @@
50
50
  "inject": [
51
51
  "@deepseek-ai/dsh-client-locale",
52
52
  "@deepseek-ai/dsh-client-ui-settings",
53
- "@deepseek-ai/dsh-client-ui-slots"
53
+ "@deepseek-ai/dsh-client-ui-slots",
54
+ "@deepseek-ai/dsh-client-ui-layout"
54
55
  ]
55
56
  }
56
57
  },