@william2000/dsh-nova-ui-task-board 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +87 -24
- package/lib/client.js.map +1 -1
- package/lib/index.js +2 -2
- package/lib/types/client/NovaPluginsSection.d.ts +27 -0
- package/lib/types/client/board-controller.d.ts +2 -0
- package/lib/types/client/index.d.ts +11 -8
- package/lib/types/client/locales.d.ts +14 -0
- package/lib/types/index.d.ts +1 -1
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
window.__ModuleLoader__.load({
|
|
2
|
-
id: "dsh-nova-ui-task-board",
|
|
2
|
+
id: "@william2000/dsh-nova-ui-task-board",
|
|
3
3
|
factory: (require) => {
|
|
4
4
|
var module = { exports: {} };
|
|
5
5
|
var exports = module.exports;
|
|
@@ -390,19 +390,27 @@ window.__ModuleLoader__.load({
|
|
|
390
390
|
if (transport === void 0) return true;
|
|
391
391
|
try {
|
|
392
392
|
this.acceptRemote(await transport.bootstrap(this.deps.legacy?.() ?? []));
|
|
393
|
-
if (!this.remoteSubscribed) {
|
|
394
|
-
this.remoteSubscribed = true;
|
|
395
|
-
this.disposers.push(transport.subscribe((event) => {
|
|
396
|
-
this.onRemoteEvent(event);
|
|
397
|
-
}));
|
|
398
|
-
}
|
|
399
393
|
return true;
|
|
400
394
|
} catch (error) {
|
|
401
395
|
this.transportError = messageOf(error);
|
|
402
396
|
this.notify();
|
|
403
397
|
return false;
|
|
398
|
+
} finally {
|
|
399
|
+
try {
|
|
400
|
+
this.ensureRemoteSubscription();
|
|
401
|
+
} catch (error) {
|
|
402
|
+
console.error("[dsh-task-board] SSE subscription failed", error);
|
|
403
|
+
}
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
|
+
/** 幂等建立 SSE 订阅(bootstrap 失败也要订阅,见 doInitializeRemote 注释)。 */
|
|
407
|
+
ensureRemoteSubscription() {
|
|
408
|
+
if (this.remoteSubscribed) return;
|
|
409
|
+
this.remoteSubscribed = true;
|
|
410
|
+
this.disposers.push(this.deps.transport.subscribe((event) => {
|
|
411
|
+
this.onRemoteEvent(event);
|
|
412
|
+
}));
|
|
413
|
+
}
|
|
406
414
|
/**
|
|
407
415
|
* SSE 帧处理(§11.1):revision 与已应用的一致 → 就地更新 scheduler/power
|
|
408
416
|
* (不动任务列表,memo 边界保持);否则(帧不完整/新 revision/同步信号)重拉
|
|
@@ -727,8 +735,8 @@ window.__ModuleLoader__.load({
|
|
|
727
735
|
*/
|
|
728
736
|
/** zh dictionary (key-set source of truth). */
|
|
729
737
|
const zh = {
|
|
730
|
-
"entry.label": "任务看板",
|
|
731
|
-
"board.title": "任务看板",
|
|
738
|
+
"entry.label": "Nova 任务看板",
|
|
739
|
+
"board.title": "Nova 任务看板",
|
|
732
740
|
"board.close": "返回会话",
|
|
733
741
|
"board.new": "新建任务",
|
|
734
742
|
"board.search": "筛选任务…",
|
|
@@ -901,19 +909,19 @@ window.__ModuleLoader__.load({
|
|
|
901
909
|
"split.parentOf": "所属需求",
|
|
902
910
|
"split.parentMissing": "(父任务已删除)",
|
|
903
911
|
"split.children": "子任务",
|
|
904
|
-
"settings.title": "任务看板",
|
|
905
|
-
"settings.description": "控制 Host 任务看板与 agent 播报。",
|
|
906
|
-
"settings.enabled": "
|
|
912
|
+
"settings.title": "Nova 任务看板",
|
|
913
|
+
"settings.description": "控制 Host Nova 任务看板与 agent 播报。",
|
|
914
|
+
"settings.enabled": "启用 Nova 任务看板",
|
|
907
915
|
"settings.enabledHint": "关闭后隐藏侧边栏入口与看板视图。",
|
|
908
|
-
"settings.announceToAgent": "向 agent
|
|
916
|
+
"settings.announceToAgent": "向 agent 播报 Nova 任务看板",
|
|
909
917
|
"settings.announceToAgentHint": "开启:每条 agent 系统提示都会包含本看板的说明;关闭:不播报。",
|
|
910
918
|
"settings.notExposed": "当前 DSH 版本未向设置页暴露本插件的配置命名空间,表单不可用。可编辑 ~/.dsh/settings.yaml 直接配置。",
|
|
911
919
|
"settings.readOnly": "当前部署的设置只读。"
|
|
912
920
|
};
|
|
913
921
|
/** en dictionary, complete against the zh key set. */
|
|
914
922
|
const en = {
|
|
915
|
-
"entry.label": "Task Board",
|
|
916
|
-
"board.title": "Task Board",
|
|
923
|
+
"entry.label": "Nova Task Board",
|
|
924
|
+
"board.title": "Nova Task Board",
|
|
917
925
|
"board.close": "Back to chat",
|
|
918
926
|
"board.new": "New Task",
|
|
919
927
|
"board.search": "Filter tasks…",
|
|
@@ -1086,11 +1094,11 @@ window.__ModuleLoader__.load({
|
|
|
1086
1094
|
"split.parentOf": "Parent requirement",
|
|
1087
1095
|
"split.parentMissing": "(parent task deleted)",
|
|
1088
1096
|
"split.children": "Subtasks",
|
|
1089
|
-
"settings.title": "Task Board",
|
|
1090
|
-
"settings.description": "Configure the Host task board and agent announcement.",
|
|
1091
|
-
"settings.enabled": "Enable the task board",
|
|
1097
|
+
"settings.title": "Nova Task Board",
|
|
1098
|
+
"settings.description": "Configure the Host Nova task board and agent announcement.",
|
|
1099
|
+
"settings.enabled": "Enable the Nova task board",
|
|
1092
1100
|
"settings.enabledHint": "When off, the sidebar entry and board view are hidden.",
|
|
1093
|
-
"settings.announceToAgent": "Announce the task board to agents",
|
|
1101
|
+
"settings.announceToAgent": "Announce the Nova task board to agents",
|
|
1094
1102
|
"settings.announceToAgentHint": "On: every agent system prompt includes a note about this board. Off: no announcement.",
|
|
1095
1103
|
"settings.notExposed": "This DSH version does not expose this plugin's settings namespace to the configuration page, so the form is unavailable. Edit ~/.dsh/settings.yaml directly.",
|
|
1096
1104
|
"settings.readOnly": "This deployment stores settings read-only."
|
|
@@ -1105,13 +1113,28 @@ window.__ModuleLoader__.load({
|
|
|
1105
1113
|
if (params !== void 0) for (const [name, value] of Object.entries(params)) text = text.replaceAll(`{${name}}`, value);
|
|
1106
1114
|
return text;
|
|
1107
1115
|
}
|
|
1116
|
+
/**
|
|
1117
|
+
* Locale dictionary for the "Nova 插件" settings section (the first-level nav
|
|
1118
|
+
* entry that hosts the dsh-nova-ui family plugin cards). Kept as its own
|
|
1119
|
+
* namespace (`nova-plugins`) so the section copy never collides with the
|
|
1120
|
+
* task-board card's `nova-task-board` namespace (AGENTS.md D4). Key set 以 zh 为准。
|
|
1121
|
+
*/
|
|
1122
|
+
const groupZh = {
|
|
1123
|
+
title: "Nova 插件",
|
|
1124
|
+
description: "统一管理 Nova 系列插件(dsh-nova-ui 全家桶)的启用与配置。"
|
|
1125
|
+
};
|
|
1126
|
+
/** en dictionary, complete against the groupZh key set. */
|
|
1127
|
+
const groupEn = {
|
|
1128
|
+
title: "Nova Plugins",
|
|
1129
|
+
description: "Enable and configure the dsh-nova-ui family plugins from one place."
|
|
1130
|
+
};
|
|
1108
1131
|
//#endregion
|
|
1109
1132
|
//#region \0dsh-css:packages/dsh-nova-ui-task-board/src/client/board.module.css.mjs
|
|
1110
1133
|
const css = "[data-pane=conversation],[class*=centerCol]{position:relative}[data-dsh-nova-taskboard-view]{z-index:60;background:var(--dsw-alias-bg-base);display:none;position:absolute;inset:0;container:a-UL2G_nova-task-board-view/inline-size}html[data-dsh-nova-taskboard-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-dsh-nova-taskboard-view]{display:block}html[data-dsh-nova-taskboard-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane=conversation]>:not([data-dsh-nova-taskboard-view]),html[data-dsh-nova-taskboard-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*=centerCol]>:not([data-dsh-nova-taskboard-view]){display:none!important}.a-UL2G_entry{width:100%;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:0 12px;font-size:13px;display:flex}.a-UL2G_entry:hover{background:var(--dsw-specific-sidebar-nav-item-hover);color:var(--dsw-alias-label-primary)}.a-UL2G_entry[data-active]{background:var(--dsw-specific-sidebar-nav-item-active);color:var(--dsw-alias-label-primary);font-weight:600}.a-UL2G_entryIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.a-UL2G_entryLabel{text-overflow:ellipsis;overflow:hidden}[data-dsh-frame][data-sidebar-collapsed] .a-UL2G_entry{justify-content:center;width:100%;padding:0}[data-dsh-frame][data-sidebar-collapsed] .a-UL2G_entryLabel{display:none}.a-UL2G_boardView{height:100%;min-height:0}.a-UL2G_board{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 16px;display:flex}.a-UL2G_boardHeader{flex-wrap:wrap;flex:none;align-items:center;gap:10px;display:flex}.a-UL2G_boardTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;margin:0;font-size:16px;font-weight:700}.a-UL2G_backButton{align-items:center;gap:4px;display:inline-flex}.a-UL2G_hostMeta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;margin-left:auto;font-size:11px;overflow:hidden}.a-UL2G_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 260px;padding:6px 10px;font-size:13px}.a-UL2G_search::placeholder{color:var(--dsw-alias-label-tertiary)}.a-UL2G_filterBar{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex-wrap:wrap;flex:none;align-items:center;gap:14px;padding:8px 10px;display:flex}.a-UL2G_filterItem{align-items:center;gap:8px;min-width:0;display:inline-flex}.a-UL2G_filterLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;font-weight:600}.a-UL2G_filterItem .a-UL2G_select{max-width:220px}.a-UL2G_filterChips{flex-wrap:wrap;align-items:center;gap:6px;max-height:64px;display:inline-flex;overflow-y:auto}.a-UL2G_filterChip{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-hover);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;border-radius:999px;padding:2px 9px;font-family:inherit;font-size:12px;line-height:1.5;transition:background-color .12s,color .12s,border-color .12s}.a-UL2G_filterChip:hover{border-color:var(--dsw-alias-border-l3)}.a-UL2G_filterChipActive{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);border-color:#0000}.a-UL2G_filterActions{align-items:center;gap:10px;margin-left:auto;display:inline-flex}.a-UL2G_filterHitCount{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px}.a-UL2G_cardChips{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.a-UL2G_cardProject{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-state-business-primary);white-space:nowrap;text-overflow:ellipsis;border-radius:999px;max-width:140px;padding:1px 8px;font-size:11px;font-weight:600;line-height:1.5;overflow:hidden}.a-UL2G_cardTag{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-hover);border:1px solid var(--dsw-alias-border-l2);white-space:nowrap;text-overflow:ellipsis;border-radius:999px;max-width:110px;padding:1px 8px;font-size:11px;line-height:1.5;overflow:hidden}.a-UL2G_cardTagMore{color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:999px;padding:1px 6px;font-size:11px;line-height:1.5}.a-UL2G_cardParent{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-state-business-primary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;border-radius:999px;max-width:180px;padding:1px 8px;font-size:11px;line-height:1.5;display:inline-block;overflow:hidden}.a-UL2G_cardParent:hover{filter:brightness(1.1);text-decoration:underline}.a-UL2G_splitRows{flex-direction:column;gap:12px;max-height:min(46vh,420px);display:flex;overflow-y:auto}.a-UL2G_splitRow{background:var(--dsw-alias-bg-l2);border:1px solid var(--dsw-alias-border-l2);border-radius:10px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.a-UL2G_splitRowHeader{justify-content:space-between;align-items:center;gap:8px;display:flex}.a-UL2G_splitRowIndex{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.a-UL2G_tagEditor{flex-direction:column;gap:6px;display:flex}.a-UL2G_tagEditor .a-UL2G_input{max-width:280px}.a-UL2G_tagEditorChip{cursor:default;align-items:center;gap:4px;display:inline-flex}.a-UL2G_tagEditorRemove{width:16px;height:16px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:13px;line-height:1;display:inline-flex}.a-UL2G_tagEditorRemove:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.a-UL2G_tagEditorRemove:disabled{opacity:.45;cursor:default}.a-UL2G_columns{overscroll-behavior-inline:contain;scrollbar-color:var(--dsw-alias-border-l3) var(--dsw-alias-interactive-bg-hover);scrollbar-width:thin;flex:1;grid-auto-columns:minmax(220px,1fr);grid-auto-flow:column;gap:12px;min-height:0;padding-bottom:6px;display:grid;overflow:auto hidden}.a-UL2G_columns::-webkit-scrollbar{height:10px}.a-UL2G_columns::-webkit-scrollbar-track{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px}.a-UL2G_columns::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l3);background-clip:content-box;border:2px solid #0000;border-radius:999px}.a-UL2G_columns::-webkit-scrollbar-thumb:hover{background:var(--dsw-alias-border-l4);background-clip:content-box}.a-UL2G_column{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}.a-UL2G_columnHeader{flex:none;align-items:center;gap:6px;padding:10px 12px;display:flex}.a-UL2G_columnTitle{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;margin:0;font-size:13px;font-weight:700;overflow:hidden}.a-UL2G_columnCount{min-width:0;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;flex:none;padding:1px 8px;font-size:12px}.a-UL2G_statusDot{border-radius:50%;flex:none;width:8px;height:8px}.a-UL2G_statusDot[data-status=backlog]{background:var(--dsw-alias-label-tertiary)}.a-UL2G_statusDot[data-status=todo]{background:var(--dsw-alias-state-business-primary)}.a-UL2G_statusDot[data-status=running]{background:var(--dsw-alias-state-warn-primary)}.a-UL2G_statusDot[data-status=done]{background:var(--dsw-alias-state-success-primary)}.a-UL2G_statusDot[data-status=failed]{background:var(--dsw-alias-state-error-primary)}.a-UL2G_cards{flex-direction:column;flex:1;gap:8px;min-height:0;padding:2px 8px 10px;display:flex;overflow-y:auto}.a-UL2G_columnEmpty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:24px 8px;font-size:12px}.a-UL2G_card{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}.a-UL2G_card:hover{box-shadow:var(--dsw-shadow-lv2);border-color:var(--dsw-alias-border-l3);transform:translateY(-1px)}.a-UL2G_card[data-status=running]{border-color:var(--dsw-alias-state-warn-primary)}.a-UL2G_cardTitle{-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13px;font-weight:600;line-height:1.35;display:-webkit-box;overflow:hidden}.a-UL2G_cardExcerpt{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:1.4;display:-webkit-box;overflow:hidden}.a-UL2G_cardMeta{color:var(--dsw-alias-label-tertiary);align-items:center;gap:8px;font-size:11px;display:flex}.a-UL2G_cardTime{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.a-UL2G_cardSchedule{white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;flex:none;padding:2px 6px;font-size:12px;line-height:1}.a-UL2G_cardRun{flex:none}.a-UL2G_cardRun[data-result=failed]{color:var(--dsw-alias-state-error-primary)}.a-UL2G_cardRun[data-result=succeeded]{color:var(--dsw-alias-state-success-primary)}.a-UL2G_cardSession{color:var(--dsw-alias-state-business-primary);flex:none}.a-UL2G_cardRunningLabel{color:var(--dsw-alias-state-warn-primary);font-size:11px}.a-UL2G_cardSpinner{border:2px solid var(--dsw-alias-state-warn-primary);border-top-color:#0000;border-radius:50%;flex:none;width:10px;height:10px;animation:.8s linear infinite a-UL2G_dshNovaTbSpin}@keyframes a-UL2G_dshNovaTbSpin{to{transform:rotate(360deg)}}.a-UL2G_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);cursor:pointer;white-space:nowrap;border:none;border-radius:8px;padding:6px 14px;font-size:13px;font-weight:600}.a-UL2G_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}.a-UL2G_primaryButton:disabled{opacity:.5;cursor:default}.a-UL2G_ghostButton{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:5px 12px;font-size:12px}.a-UL2G_ghostButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.a-UL2G_ghostButton:disabled{opacity:.45;cursor:default}.a-UL2G_dangerButton{color:#fff;background:var(--dsw-alias-state-error-primary);cursor:pointer;white-space:nowrap;border:none;border-radius:8px;padding:6px 14px;font-size:13px;font-weight:600}.a-UL2G_dangerButton:hover:not(:disabled){filter:brightness(1.08)}.a-UL2G_dangerButton:active:not(:disabled){filter:brightness(.94)}.a-UL2G_dangerButton:disabled{opacity:.5;cursor:default}.a-UL2G_iconButton{width:26px;height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:0;font-size:13px;display:inline-flex}.a-UL2G_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.a-UL2G_linkButton{color:var(--dsw-alias-state-business-primary);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:0;font-size:12px}.a-UL2G_linkButton:hover{text-decoration:underline}.a-UL2G_modalBackdrop{z-index:1300;background:var(--dsw-alias-bg-mask-1);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.a-UL2G_modal{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);width:min(520px,100vw - 48px);max-height:calc(100vh - 96px);box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary);border-radius:14px;flex-direction:column;gap:12px;padding:18px;display:flex;overflow-y:auto}.a-UL2G_modalTitle{margin:0;font-size:15px;font-weight:700}.a-UL2G_confirmMessage{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:13px;line-height:1.5}.a-UL2G_modalFooter{justify-content:flex-end;gap:10px;margin-top:4px;display:flex}.a-UL2G_field{flex-direction:column;gap:5px;display:flex}.a-UL2G_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.a-UL2G_input{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:8px;outline:none;padding:7px 10px;font-family:inherit;font-size:13px}.a-UL2G_input:focus{border-color:var(--dsw-alias-state-business-primary)}.a-UL2G_select{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;max-width:100%;padding:7px 10px;font-family:inherit;font-size:13px}.a-UL2G_input::placeholder{color:var(--dsw-alias-label-tertiary)}.a-UL2G_formError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px}.a-UL2G_detail{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);width:min(640px,100vw - 48px);max-height:calc(100vh - 80px);box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}.a-UL2G_detailHeader{border-bottom:1px solid var(--dsw-alias-separator-primary);flex:none;align-items:center;gap:10px;padding:14px 18px;display:flex}.a-UL2G_detailTitle{overflow-wrap:anywhere;flex:1;margin:0;font-size:15px;font-weight:700}.a-UL2G_statusBadge{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:2px 10px;font-size:12px}.a-UL2G_statusBadge[data-status=running]{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}.a-UL2G_statusBadge[data-status=done]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}.a-UL2G_statusBadge[data-status=failed]{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}.a-UL2G_detailBody{flex-direction:column;flex:1;gap:16px;padding:14px 18px;display:flex;overflow-y:auto}.a-UL2G_detailSection{flex-direction:column;gap:6px;display:flex}.a-UL2G_detailSection h4{color:var(--dsw-alias-label-tertiary);text-transform:none;margin:0;font-size:12px;font-weight:700}.a-UL2G_detailText{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:13px;line-height:1.55}.a-UL2G_promptBlock{font-size:12.5px;line-height:1.5;font-family:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-markdown-code-block);border:1px solid var(--dsw-alias-border-l1);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px;max-height:240px;margin:0;padding:10px 12px;overflow-y:auto}.a-UL2G_executionList{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.a-UL2G_executionRow{border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-wrap:wrap;align-items:center;gap:10px;padding:8px 10px;display:flex}.a-UL2G_executionBadge{color:var(--dsw-alias-state-warn-primary);background:var(--dsw-alias-state-warn-secondary);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:600}.a-UL2G_executionBadge[data-result=succeeded]{color:var(--dsw-alias-state-success-primary);background:0 0}.a-UL2G_executionBadge[data-result=failed]{color:var(--dsw-alias-state-error-primary);background:0 0}.a-UL2G_executionBadge[data-result=cancelled]{color:var(--dsw-alias-label-tertiary);background:0 0}.a-UL2G_executionTimes{color:var(--dsw-alias-label-secondary);font-size:12px}.a-UL2G_executionError{width:100%;color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;font-size:12px}.a-UL2G_moveRow{flex-wrap:wrap;gap:8px;display:flex}.a-UL2G_scheduleMode{background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);border-radius:10px;gap:4px;margin-bottom:10px;padding:3px;display:inline-flex}.a-UL2G_scheduleModeButton{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:7px;padding:4px 12px;font-size:12px}.a-UL2G_scheduleModeButton:hover:not(.a-UL2G_scheduleModeActive){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.a-UL2G_scheduleModeActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-fill-cs-primary);box-shadow:var(--dsw-alias-shadow-fs-1)}.a-UL2G_dangerGhostButton{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:5px 12px;font-size:12px}.a-UL2G_dangerGhostButton:hover:not(:disabled){background:var(--dsw-alias-state-error-tint)}.a-UL2G_dangerGhostButton:disabled{opacity:.45;cursor:default}.a-UL2G_scheduleToggle{color:var(--dsw-alias-label-primary);cursor:pointer;user-select:none;align-items:center;gap:8px;font-size:13px;display:flex}.a-UL2G_scheduleToggle input{accent-color:var(--dsw-alias-state-business-primary)}.a-UL2G_scheduleRow{align-items:center;gap:8px;display:flex}.a-UL2G_scheduleInput{min-width:0;font-family:var(--dsw-font-markdown-code-block-small);flex:1;font-size:12.5px}.a-UL2G_scheduleInputInvalid,.a-UL2G_scheduleInputInvalid:focus{border-color:var(--dsw-alias-state-error-primary)}.a-UL2G_schedulePreset{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:none;padding:7px 8px;font-size:12.5px}.a-UL2G_scheduleMeta{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin:0;font-size:12px}.a-UL2G_detailFooter{border-top:1px solid var(--dsw-alias-separator-primary);flex:none;align-items:center;gap:10px;padding:12px 18px;display:flex}.a-UL2G_detailMeta{color:var(--dsw-alias-label-tertiary);margin-left:auto;font-size:11px}@container a-UL2G_nova-task-board-view (width<=720px){.a-UL2G_board{gap:10px;padding:10px}.a-UL2G_columns{gap:10px}}@container a-UL2G_nova-task-board-view (width<=600px){.a-UL2G_boardHeader{flex-wrap:wrap;gap:8px}.a-UL2G_search{flex:calc(100% - 72px);min-width:0}.a-UL2G_boardHeader>button{flex:1 1 0;min-width:max-content}}.a-UL2G_entry:focus-visible,.a-UL2G_card:focus-visible,.a-UL2G_primaryButton:focus-visible,.a-UL2G_ghostButton:focus-visible,.a-UL2G_dangerButton:focus-visible,.a-UL2G_iconButton:focus-visible,.a-UL2G_linkButton:focus-visible,.a-UL2G_search:focus-visible,.a-UL2G_input:focus-visible,.a-UL2G_select:focus-visible,.a-UL2G_schedulePreset:focus-visible,.a-UL2G_scheduleToggle input:focus-visible,.a-UL2G_filterChip:focus-visible,.a-UL2G_tagEditorRemove:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.a-UL2G_entry,.a-UL2G_primaryButton,.a-UL2G_ghostButton,.a-UL2G_dangerButton,.a-UL2G_iconButton,.a-UL2G_linkButton,.a-UL2G_search,.a-UL2G_input,.a-UL2G_select,.a-UL2G_schedulePreset,.a-UL2G_scheduleToggle input,.a-UL2G_filterChip,.a-UL2G_tagEditorRemove{transition:background-color .12s,color .12s,border-color .12s,outline-color .12s,box-shadow .12s,transform .12s}.a-UL2G_card:active{box-shadow:var(--dsw-shadow-lv1);transform:translateY(0)}.a-UL2G_entry:active,.a-UL2G_primaryButton:active:not(:disabled),.a-UL2G_ghostButton:active:not(:disabled),.a-UL2G_dangerButton:active:not(:disabled),.a-UL2G_iconButton:active:not(:disabled),.a-UL2G_linkButton:active:not(:disabled){transform:translateY(1px)}.a-UL2G_entry[data-active]:hover{background:var(--dsw-specific-sidebar-nav-item-active)}.a-UL2G_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.a-UL2G_linkButton:hover:not(:disabled){text-decoration:underline}.a-UL2G_iconButton:disabled,.a-UL2G_linkButton:disabled{opacity:.45;cursor:default}.a-UL2G_search:focus,.a-UL2G_select:focus,.a-UL2G_schedulePreset:focus{border-color:var(--dsw-alias-state-business-primary)}@media (prefers-reduced-motion:reduce){.a-UL2G_entry,.a-UL2G_card,.a-UL2G_primaryButton,.a-UL2G_ghostButton,.a-UL2G_dangerButton,.a-UL2G_iconButton,.a-UL2G_linkButton,.a-UL2G_search,.a-UL2G_input,.a-UL2G_select,.a-UL2G_schedulePreset,.a-UL2G_scheduleToggle input,.a-UL2G_filterChip,.a-UL2G_tagEditorRemove{transition:none}.a-UL2G_cardSpinner{animation:none}}.a-UL2G_groupToggle{background:var(--dsw-alias-interactive-bg-hover);border-radius:8px;flex:none;align-items:center;gap:2px;padding:2px;display:inline-flex}.a-UL2G_groupToggleButton{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px}.a-UL2G_groupToggleButton:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.a-UL2G_groupToggleActive,.a-UL2G_groupToggleActive:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv1);font-weight:600}.a-UL2G_group{border:1px dashed #0000;border-radius:10px;flex-direction:column;gap:6px;padding:6px 8px;display:flex}.a-UL2G_group[data-drag-over]{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover)}.a-UL2G_group[data-drag-rejected]{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-surface,transparent)}.a-UL2G_groupHeader{flex:none;align-items:center;gap:6px;padding:2px 2px 0;display:flex}.a-UL2G_groupTitle{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;font-weight:700;overflow:hidden}.a-UL2G_groupCount{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;flex:none;padding:0 7px;font-size:11px}.a-UL2G_groupCards{flex-direction:column;gap:8px;display:flex}.a-UL2G_column[data-drag-over]{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 1px var(--dsw-alias-state-business-primary)}.a-UL2G_column[data-drag-rejected]{border-color:var(--dsw-alias-state-error-primary)}.a-UL2G_card[data-draggable]{cursor:grab}.a-UL2G_card[data-draggable]:active{cursor:grabbing}.a-UL2G_cardDragging{opacity:.45;box-shadow:var(--dsw-shadow-lv2)}.a-UL2G_dropIndicator{background:var(--dsw-alias-state-business-primary);pointer-events:none;border-radius:999px;flex:none;height:3px;margin:0 2px}.a-UL2G_groupToggleButton:focus-visible,.a-UL2G_groupToggleButton:hover:not(:disabled){outline:none}.a-UL2G_groupToggleButton:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-state-business-primary)}.a-UL2G_statusDot[data-status=proposed]{background:var(--dsw-alias-brand-primary,#7c6cf0)}.a-UL2G_cardProposedBadge{color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-brand-primary,#7c6cf0);white-space:nowrap;border-radius:999px;flex:none;align-self:flex-start;padding:1px 8px;font-size:11px;font-weight:600;line-height:1.5}.a-UL2G_cardSource{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:11px}.a-UL2G_entryBadge{text-align:center;min-width:18px;color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-state-error-primary,#e5484d);white-space:nowrap;border-radius:999px;flex:none;margin-left:auto;padding:0 6px;font-size:11px;font-weight:700;line-height:18px}.a-UL2G_entryBadge[data-count=\"0\"]{display:none}.a-UL2G_confirmTargetRow{flex-wrap:wrap;gap:8px;display:flex}.a-UL2G_confirmTargetButton{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:6px 14px;font-family:inherit;font-size:13px}.a-UL2G_confirmTargetButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.a-UL2G_confirmTargetActive,.a-UL2G_confirmTargetActive:hover:not(:disabled){color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);border-color:#0000;font-weight:600}.a-UL2G_confirmTargetButton:disabled{opacity:.45;cursor:default}.a-UL2G_sourceRow{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;align-items:center;gap:8px;font-size:12px;display:flex}.a-UL2G_messageAction{z-index:20;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);box-shadow:var(--dsw-shadow-lv1);cursor:pointer;white-space:nowrap;border-radius:8px;padding:3px 9px;font-family:inherit;font-size:11px;font-weight:600;position:absolute;top:6px;right:8px}.a-UL2G_messageAction:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}.a-UL2G_messageAction:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}";
|
|
1111
|
-
const tagId = "dsh-nova-ui-task-board/board.module.css";
|
|
1134
|
+
const tagId = "@william2000/dsh-nova-ui-task-board/board.module.css";
|
|
1112
1135
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
1113
1136
|
const tag = document.createElement("style");
|
|
1114
|
-
tag.dataset.plugin = "dsh-nova-ui-task-board";
|
|
1137
|
+
tag.dataset.plugin = "@william2000/dsh-nova-ui-task-board";
|
|
1115
1138
|
tag.dataset.pluginCss = tagId;
|
|
1116
1139
|
tag.textContent = css;
|
|
1117
1140
|
document.head.appendChild(tag);
|
|
@@ -5467,6 +5490,22 @@ window.__ModuleLoader__.load({
|
|
|
5467
5490
|
});
|
|
5468
5491
|
}
|
|
5469
5492
|
//#endregion
|
|
5493
|
+
//#region src/client/NovaPluginsSection.tsx
|
|
5494
|
+
/**
|
|
5495
|
+
* Render the Nova plugins section content column: a heading, a lede, and the
|
|
5496
|
+
* family plugin cards contributed into `nova.plugin.item`.
|
|
5497
|
+
* @param props - composed slot props (close, renderSlot, t).
|
|
5498
|
+
* @returns the section.
|
|
5499
|
+
*/
|
|
5500
|
+
function NovaPluginsSection(props) {
|
|
5501
|
+
const { renderSlot, t } = props;
|
|
5502
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
|
|
5503
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", { children: t("title") }),
|
|
5504
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: t("description") }),
|
|
5505
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: renderSlot("nova.plugin.item", {}) })
|
|
5506
|
+
] });
|
|
5507
|
+
}
|
|
5508
|
+
//#endregion
|
|
5470
5509
|
//#region src/client/NovaTaskBoardSettingsCard.tsx
|
|
5471
5510
|
/**
|
|
5472
5511
|
* Nova task-board settings card skeleton (T001).
|
|
@@ -5527,8 +5566,12 @@ window.__ModuleLoader__.load({
|
|
|
5527
5566
|
}
|
|
5528
5567
|
//#endregion
|
|
5529
5568
|
//#region src/client/index.ts
|
|
5530
|
-
/** Locale namespace this plugin owns. */
|
|
5569
|
+
/** Locale namespace this plugin owns (the task-board card copy). */
|
|
5531
5570
|
const NS = "nova-task-board";
|
|
5571
|
+
/** Locale namespace of the "Nova 插件" section heading/lede. */
|
|
5572
|
+
const GROUP_NS = "nova-plugins";
|
|
5573
|
+
/** First-level settings nav id hosting the Nova family plugin cards. */
|
|
5574
|
+
const GROUP_SECTION_ID = "nova-plugins";
|
|
5532
5575
|
/** Settings namespace the settings card edits (the Host plugin registers it). */
|
|
5533
5576
|
const TASK_BOARD_NS = "nova-task-board";
|
|
5534
5577
|
/** Required services (fiber inject waiting — the runtime must be up first). */
|
|
@@ -5552,10 +5595,30 @@ window.__ModuleLoader__.load({
|
|
|
5552
5595
|
zh,
|
|
5553
5596
|
en
|
|
5554
5597
|
}), "nova-task-board: dictionaries");
|
|
5598
|
+
ctx.effect(() => ctx.locale.register(GROUP_NS, {
|
|
5599
|
+
zh: groupZh,
|
|
5600
|
+
en: groupEn
|
|
5601
|
+
}), "nova-plugins: dictionaries");
|
|
5602
|
+
ctx.slots.inject("settings.section", () => {
|
|
5603
|
+
const unregister = ctx.slots.register({
|
|
5604
|
+
name: "settings.section",
|
|
5605
|
+
id: GROUP_SECTION_ID,
|
|
5606
|
+
order: 112,
|
|
5607
|
+
label: () => ctx.locale.bind(GROUP_NS)("title"),
|
|
5608
|
+
locale: GROUP_NS,
|
|
5609
|
+
children: { "nova.plugin.item": {
|
|
5610
|
+
kind: "list",
|
|
5611
|
+
scope: "root"
|
|
5612
|
+
} }
|
|
5613
|
+
}, NovaPluginsSection);
|
|
5614
|
+
return () => {
|
|
5615
|
+
unregister();
|
|
5616
|
+
};
|
|
5617
|
+
});
|
|
5555
5618
|
const settingsScope = (ctx.get("webUiSettings") ?? ctx.settingsScope).bind({ namespace: TASK_BOARD_NS });
|
|
5556
|
-
ctx.slots.inject("
|
|
5619
|
+
ctx.slots.inject("nova.plugin.item", () => {
|
|
5557
5620
|
const unregister = ctx.slots.register({
|
|
5558
|
-
name: "
|
|
5621
|
+
name: "nova.plugin.item",
|
|
5559
5622
|
id: "nova-task-board",
|
|
5560
5623
|
order: 110,
|
|
5561
5624
|
locale: NS,
|