dsh-global-todo 0.5.0 → 0.5.1
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/CHANGELOG.md +10 -0
- package/lib/client.js +47 -1
- package/lib/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.5.1] — 2026-10-19
|
|
11
|
+
|
|
12
|
+
The last two loose ends from the D4 audit.
|
|
13
|
+
|
|
14
|
+
- **The idle window is editable where the switch is.** It was already in the settings file and
|
|
15
|
+
the API; now the panel has a number field next to 自动获取, writing on blur so typing 1 on the
|
|
16
|
+
way to 120 does not save 1.
|
|
17
|
+
- **The inbox can be worked in batches.** In the inbox view, the selection bar offers 确认
|
|
18
|
+
(removes the inbox mark) and 丢弃 (archives and removes it) instead of complete/archive, which
|
|
19
|
+
do not mean anything for records nobody has confirmed yet.
|
|
10
20
|
## [0.5.0] — 2026-10-19
|
|
11
21
|
|
|
12
22
|
The last two pieces of the automatic-capture plan: an external door, and somewhere for its
|
package/lib/client.js
CHANGED
|
@@ -50,7 +50,7 @@ window.__ModuleLoader__.load({
|
|
|
50
50
|
* different mechanisms (restart vs. hot reload), so "which one am I looking
|
|
51
51
|
* at" needs an answer that the bundle itself carries.
|
|
52
52
|
*/
|
|
53
|
-
const UI_REV = '
|
|
53
|
+
const UI_REV = 'ui32'
|
|
54
54
|
/** Last language resolved for the shell; module-level so a fetch failure can be worded too. */
|
|
55
55
|
let activeLang = 'zh'
|
|
56
56
|
|
|
@@ -119,6 +119,7 @@ window.__ModuleLoader__.load({
|
|
|
119
119
|
'assign.ask': '这 {n} 条找不到原对话,也没有同工作区的对话:选一个目标一起分配。',
|
|
120
120
|
'assign.failed': '{n} 条没分出去:{detail}',
|
|
121
121
|
'autoCollect.label': '自动获取',
|
|
122
|
+
'autoCollect.idle': '安静窗口(分钟)',
|
|
122
123
|
'autoCollect.hint': '开启后:某个对话**安静满 {n} 分钟**(期间没有任何新发言)才自动问它一次「有没有要跟进的事」;你一边说话它一边计时重置,所以工作时不会被打扰。它问过之后,**只有你在那个对话里再说一句话**才会重新问——不会追着自己的提问反复问。关掉就完全靠你和 Agent 手动记。',
|
|
123
124
|
'autoCollect.last': '最近一次判定:{reason}(等待 {waiting} · 到点 {due})',
|
|
124
125
|
'autoCollect.reason.off': '开关关着',
|
|
@@ -334,6 +335,7 @@ window.__ModuleLoader__.load({
|
|
|
334
335
|
'assign.ask': '{n} of them have no origin and no same-workspace conversation: pick one target for those.',
|
|
335
336
|
'assign.failed': '{n} could not be assigned: {detail}',
|
|
336
337
|
'autoCollect.label': 'Auto-collect',
|
|
338
|
+
'autoCollect.idle': 'Idle window (minutes)',
|
|
337
339
|
'autoCollect.hint': 'When on: a conversation is asked once whether anything needs following up, but only after it has been **quiet for {n} minutes** — every new message restarts that clock, so a session you are working in is never interrupted. Once it has asked, only **you writing in that conversation** arms it again, so the question can never chase its own answer.',
|
|
338
340
|
'autoCollect.last': 'Last decision: {reason} (waiting {waiting}, due {due})',
|
|
339
341
|
'autoCollect.reason.off': 'the switch is off',
|
|
@@ -992,6 +994,7 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
|
|
|
992
994
|
border: 1px solid var(--dsw-alias-brand-primary); border-radius: 9px; background: var(--dsw-alias-bg-layer-1); font-size: 12.5px; }
|
|
993
995
|
.gt-item-body { flex: 1; display: flex; flex-direction: column; gap: 5px; min-width: 0; }
|
|
994
996
|
.gt-item-title { font-weight: 600; font-size: 13.5px; word-break: break-word; line-height: 1.45; }
|
|
997
|
+
.gt-input-xs { width: 68px; padding: 3px 6px; font-size: 12px; }
|
|
995
998
|
.gt-inbox { margin-left: 6px; padding: 1px 6px; border-radius: 999px; font-size: 10.5px; font-weight: 600;
|
|
996
999
|
color: var(--dsw-alias-state-warn-primary); border: 1px solid var(--dsw-alias-state-warn-primary);
|
|
997
1000
|
vertical-align: 1px; }
|
|
@@ -2501,6 +2504,23 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
|
|
|
2501
2504
|
},
|
|
2502
2505
|
t('autoCollect.label'),
|
|
2503
2506
|
),
|
|
2507
|
+
// The idle window is a number, not a switch: expose it where the switch lives and
|
|
2508
|
+
// write on blur, so typing "1" on the way to "120" does not save 1.
|
|
2509
|
+
h('input', {
|
|
2510
|
+
key: 'idle',
|
|
2511
|
+
type: 'number',
|
|
2512
|
+
min: 5,
|
|
2513
|
+
max: 1440,
|
|
2514
|
+
className: 'gt-input gt-input-xs',
|
|
2515
|
+
defaultValue: Number(state.health?.settings?.idleMinutes) || 30,
|
|
2516
|
+
title: t('autoCollect.idle'),
|
|
2517
|
+
'aria-label': t('autoCollect.idle'),
|
|
2518
|
+
onBlur: (event) => {
|
|
2519
|
+
const next = Number(event.target.value)
|
|
2520
|
+
if (!Number.isInteger(next) || next < 5 || next > 1440) return
|
|
2521
|
+
void call('settings', { method: 'POST', body: { idleMinutes: next } }).then(() => refreshHealth())
|
|
2522
|
+
},
|
|
2523
|
+
}),
|
|
2504
2524
|
]
|
|
2505
2525
|
|
|
2506
2526
|
const autoCollectOn = settingsOn
|
|
@@ -3299,6 +3319,32 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
|
|
|
3299
3319
|
},
|
|
3300
3320
|
t('select.archive'),
|
|
3301
3321
|
),
|
|
3322
|
+
// In the inbox view the useful batch actions are confirm and discard, not
|
|
3323
|
+
// complete: nothing here is done yet.
|
|
3324
|
+
filter === 'inbox'
|
|
3325
|
+
? h(
|
|
3326
|
+
'button',
|
|
3327
|
+
{
|
|
3328
|
+
type: 'button',
|
|
3329
|
+
className: 'gt-btn gt-btn-quiet',
|
|
3330
|
+
disabled: Object.keys(selected).length === 0,
|
|
3331
|
+
onClick: () => void runBulk({ removeTags: ['inbox'] }),
|
|
3332
|
+
},
|
|
3333
|
+
t('action.confirm'),
|
|
3334
|
+
)
|
|
3335
|
+
: null,
|
|
3336
|
+
filter === 'inbox'
|
|
3337
|
+
? h(
|
|
3338
|
+
'button',
|
|
3339
|
+
{
|
|
3340
|
+
type: 'button',
|
|
3341
|
+
className: 'gt-btn gt-btn-quiet',
|
|
3342
|
+
disabled: Object.keys(selected).length === 0,
|
|
3343
|
+
onClick: () => void runBulk({ status: 'archived', removeTags: ['inbox'] }),
|
|
3344
|
+
},
|
|
3345
|
+
t('action.discard'),
|
|
3346
|
+
)
|
|
3347
|
+
: null,
|
|
3302
3348
|
h('input', {
|
|
3303
3349
|
className: 'gt-input gt-bulk-tag',
|
|
3304
3350
|
value: bulkTag,
|
package/lib/index.js
CHANGED
|
@@ -35,7 +35,7 @@ import { createStore, resolveStorePath } from './store.js'
|
|
|
35
35
|
import { createTools } from './tools.js'
|
|
36
36
|
|
|
37
37
|
/** Must equal `package.json`'s version; `npm run check` enforces that. */
|
|
38
|
-
export const VERSION = '0.5.
|
|
38
|
+
export const VERSION = '0.5.1'
|
|
39
39
|
|
|
40
40
|
/** Plugin id. Also the Loader row id in `cordis.patch.yml`. */
|
|
41
41
|
export const name = 'dsh-global-todo'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-global-todo",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"icon": "./docs/icon.svg",
|
|
5
5
|
"description": "Global, cross-session todos for DeepSeek Harness: one list owned by the human and the agent together, with creation time, attached documents and links, and one-click hand-off to an agent session. 全局待办:跨会话一份清单,记录加入时间,可挂文档与地址,可一键交给 Agent 继续干。",
|
|
6
6
|
"type": "module",
|