dsh-working-activity 0.2.6 → 0.3.2
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/LICENSE +28 -28
- package/README.i18n.yaml +6 -6
- package/README.md +122 -122
- package/README.zh.md +113 -113
- package/cordis.patch.yml +19 -19
- package/lib/client.js +6 -6
- package/lib/client.js.map +1 -1
- package/lib/types/config.d.ts +68 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/config.js +141 -0
- package/lib/types/frames.d.ts +37 -0
- package/lib/types/frames.d.ts.map +1 -0
- package/lib/types/frames.js +126 -0
- package/lib/types/index.d.ts +16 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +35 -6
- package/lib/types/lang.d.ts +100 -0
- package/lib/types/lang.d.ts.map +1 -0
- package/lib/types/lang.js +132 -0
- package/lib/types/phrases.d.ts +125 -6
- package/lib/types/phrases.d.ts.map +1 -1
- package/lib/types/phrases.js +362 -27
- package/lib/types/status.d.ts +62 -0
- package/lib/types/status.d.ts.map +1 -1
- package/lib/types/status.js +202 -22
- package/package.json +12 -2
- package/src/client/WorkingLine.module.css +74 -74
- package/src/client/WorkingLine.tsx +42 -42
- package/src/client/activity.ts +50 -50
- package/src/client/css-modules.d.ts +6 -6
- package/src/client/index.ts +42 -42
- package/src/config.ts +174 -0
- package/src/events.ts +45 -45
- package/src/frames.ts +138 -0
- package/src/index.ts +278 -228
- package/src/invariant.ts +69 -69
- package/src/lang.ts +145 -0
- package/src/phrases.ts +584 -180
- package/src/registration.ts +99 -99
- package/src/status.ts +706 -501
package/LICENSE
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
BSD 3-Clause License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026, chimney (ccch1mneyyy)
|
|
4
|
-
|
|
5
|
-
Redistribution and use in source and binary forms, with or without
|
|
6
|
-
modification, are permitted provided that the following conditions are met:
|
|
7
|
-
|
|
8
|
-
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
-
list of conditions and the following disclaimer.
|
|
10
|
-
|
|
11
|
-
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
-
this list of conditions and the following disclaimer in the documentation
|
|
13
|
-
and/or other materials provided with the distribution.
|
|
14
|
-
|
|
15
|
-
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
-
contributors may be used to endorse or promote products derived from
|
|
17
|
-
this software without specific prior written permission.
|
|
18
|
-
|
|
19
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
-
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
-
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
-
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, chimney (ccch1mneyyy)
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.i18n.yaml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
|
|
2
|
-
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
|
-
# after editing either side, bring the other along and re-record with:
|
|
4
|
-
# pnpm run verify-translation-pairing --write packages/activity/working-activity/README.md
|
|
5
|
-
README.md: bf0787caac11a292882ba1a35963878e373e7db8
|
|
6
|
-
README.zh.md: de09a7945dbe42c85d359fd256cdac0264d4b6cd
|
|
1
|
+
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
|
|
2
|
+
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
|
+
# after editing either side, bring the other along and re-record with:
|
|
4
|
+
# pnpm run verify-translation-pairing --write packages/activity/working-activity/README.md
|
|
5
|
+
README.md: bf0787caac11a292882ba1a35963878e373e7db8
|
|
6
|
+
README.zh.md: de09a7945dbe42c85d359fd256cdac0264d4b6cd
|
package/README.md
CHANGED
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
# dsh-working-activity
|
|
2
|
-
|
|
3
|
-
A live "working line" for DeepSeek Harness: the model's real-time activity — playful thinking copy, the tool actually running, elapsed time, and a turn-end summary — shown while the agent works.
|
|
4
|
-
|
|
5
|
-
## What it does
|
|
6
|
-
|
|
7
|
-
Folds the durable session stream (`turn/start`, `assistant/chunk`, `tool/call`, `tool/result`, `turn/end`) plus `agent/status` into one status line, refreshed on a render tick:
|
|
8
|
-
|
|
9
|
-
- **Thinking**: short colloquial copy rotates every few seconds (`嗯…让我捋捋`, `盘一下盘一下`, `大脑转起来了`, deadpan `lol` / `hm` / `ok`), tiered when thinking runs long (30s / 1min / 5min), night-owl copy mixed in between 00:00–06:00 local time.
|
|
10
|
-
- **Tool activity**: the running tool renders as `俏皮动词 + 参数细节 + 已耗时` (`跑个命令 npm test · 12s`); failed tools show `翻车了`-style copy in the done line.
|
|
11
|
-
- **Turn summary**: on `turn/end` the line becomes `搞定 ✓ · N 工具 · 想Xs 干Ys` (thinking/tool split), with the last tool's fragment pinned for a few seconds.
|
|
12
|
-
- **Minimal mode**: `phrases: false` renders plain functional labels (`思考中 · 总1m23s`, `bash npm test · 12s`).
|
|
13
|
-
|
|
14
|
-
Two optional sinks, both off by default only when their seam is absent:
|
|
15
|
-
|
|
16
|
-
1. **TUI prompt slot** — registers the `${activity}` template value on `ctx.tuiPrompt` when the TUI is composed. Add `${activity}` to `theme.leftPrompt` to see it next to `cwd`/`model`/`context`.
|
|
17
|
-
2. **Session events** — appends log-only `activity/status` events (never surface events: the model never sees them) for Web and other UI consumers; replay ignores them.
|
|
18
|
-
|
|
19
|
-
## Installation
|
|
20
|
-
|
|
21
|
-
The package is a self-mounting bundle: it declares `dsh.bundle.patch`
|
|
22
|
-
(`cordis.patch.yml`), so the official CLI both installs it and appends it to
|
|
23
|
-
the profile's bundle layer stack:
|
|
24
|
-
|
|
25
|
-
```sh
|
|
26
|
-
dsh plugin --profile <profile> add dsh-working-activity
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
At boot, app-boot applies the bundle's patch list over the profile root and
|
|
30
|
-
the package inserts its own `working-activity` row — no manual configuration
|
|
31
|
-
required. To tune a value, override the row's config by id in the profile's
|
|
32
|
-
user layer (`$DSH_HOME/profiles/<profile>/cordis.patch.yml`) instead of
|
|
33
|
-
inserting a second same-id row:
|
|
34
|
-
|
|
35
|
-
```yaml
|
|
36
|
-
- id: working-activity
|
|
37
|
-
config:
|
|
38
|
-
publishIntervalMs: 500
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## TUI usage
|
|
42
|
-
|
|
43
|
-
Install the plugin into a profile that composes the official `dsh-tui`, then
|
|
44
|
-
add the `${activity}` slot to the left prompt template in the profile's user
|
|
45
|
-
layer (`$DSH_HOME/profiles/<profile>/cordis.patch.yml`):
|
|
46
|
-
|
|
47
|
-
```yaml
|
|
48
|
-
- id: tui
|
|
49
|
-
config:
|
|
50
|
-
theme:
|
|
51
|
-
leftPrompt: '${cwd}${git/worktree}${activity}${model}${token_meter/cache_hit_rate}${context}'
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
While a turn runs, the prompt line shows e.g. `dsh main 跑个命令 npm test · 12s deepseek-chat …`; while thinking, `嗯…让我捋捋 · 总1m23s`; after the turn, `搞定 ✓ · 4 工具 · 想12s 干11s` briefly. Without `${activity}` in the template, the plugin is inert in the TUI (the slot is unregistered values are omitted by the template renderer).
|
|
55
|
-
|
|
56
|
-
## Web usage
|
|
57
|
-
|
|
58
|
-
The Web client renders the live line two ways, both fed by the `activity/status` events:
|
|
59
|
-
|
|
60
|
-
- The turn-level status label (`TurnStatus`, formerly the static "Deep diving...") shows the live line while a turn runs, keeping its sweep animation.
|
|
61
|
-
- A working-line dock entry (`WorkingLine` on `conversation.input.dock`) renders the turn-end statistics (token/elapsed/tool summary) above the composer after a turn settles; live phases stay on the turn label.
|
|
62
|
-
|
|
63
|
-
Both fall back to the previous static label while the plugin is absent, so the Web UI is unaffected by disabling it.
|
|
64
|
-
|
|
65
|
-
## Configuration
|
|
66
|
-
|
|
67
|
-
| Key | Type | Default | Meaning |
|
|
68
|
-
|---|---|---|---|
|
|
69
|
-
| `phrases` | `boolean` | `true` | Playful copy pool; `false` renders plain functional labels |
|
|
70
|
-
| `publish` | `boolean` | `false` | Append `activity/status` session events for UI consumers. Off by default: appended events currently make session logs unresumable (see note below) |
|
|
71
|
-
| `tickMs` | `number` | `500` | Status render tick interval (100–5000) |
|
|
72
|
-
| `publishIntervalMs` | `number` | `2000` | Minimum interval between published events while the line is stable (500–30000) |
|
|
73
|
-
| `detailLimit` | `number` | `40` | Max displayed detail length (paths/commands/patterns), 8–120 |
|
|
74
|
-
| `customActions` | `object` | `{}` | Exact tool-name → action-copy pools, e.g. `{"my_deploy": ["部署一下", "上线中"]}` |
|
|
75
|
-
| `narrate` | `boolean` | `true` | Inject the `⏵` self-narration contract into the system prompt; the line is surfaced live and stripped from the chat body |
|
|
76
|
-
|
|
77
|
-
## Event contract
|
|
78
|
-
|
|
79
|
-
`activity/status` is a log-only session event (merge-extensible `SessionEventMap` member, no `surfaceOp`):
|
|
80
|
-
|
|
81
|
-
```ts
|
|
82
|
-
{
|
|
83
|
-
phase: 'idle' | 'waiting' | 'thinking' | 'tool' | 'done'
|
|
84
|
-
line: string // plain-text status line, no ANSI
|
|
85
|
-
label?: string // current work label (tool action / stage)
|
|
86
|
-
detail?: string // path / command / pattern fragment
|
|
87
|
-
phrase?: string // current playful phrase
|
|
88
|
-
toolCount: number // tools completed this turn
|
|
89
|
-
turnElapsedMs: number // ms since turn start
|
|
90
|
-
phaseStartedAt: number // epoch ms the phase started (animation anchor)
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
> **Why `publish` is off by default:** `session.append()` cannot mark events ignorable, and the resume read path refuses any log containing unknown non-ignorable event types — so with `publish: true`, every session that rendered a status line fails to resume. Re-enable only for a log-replaying consumer on a harness that supports ignorable appends. The live TUI prompt line is unaffected.
|
|
95
|
-
|
|
96
|
-
Publishing rules: line changes publish immediately; a stable line republishes at most every `publishIntervalMs` so a long tool's elapsed time stays live without flooding the log. All data is lossless JSON; optional fields are omitted when absent.
|
|
97
|
-
|
|
98
|
-
## Export shape
|
|
99
|
-
|
|
100
|
-
A function/namespace plugin: `name` / `Config` / `apply`, no default export. The state machine (`ActivityTracker`) and copy pools live in `./status` and `./phrases` (pure, clock-injected, unit-tested). The invariant companion registers under `./invariant`.
|
|
101
|
-
|
|
102
|
-
## Model Experience
|
|
103
|
-
|
|
104
|
-
### Prompt and tool surface
|
|
105
|
-
|
|
106
|
-
Nothing. The plugin injects no prompt sections, registers no tools, and appends no surface events. `activity/status` is UI state only: it never enters derived model history, so the model cannot see its own working line.
|
|
107
|
-
|
|
108
|
-
### Token effect
|
|
109
|
-
|
|
110
|
-
Zero per request.
|
|
111
|
-
|
|
112
|
-
### KV Cache effect
|
|
113
|
-
|
|
114
|
-
No system-prompt contribution, so no cache-stability effect.
|
|
115
|
-
|
|
116
|
-
## Known Limitations and Deferred Work
|
|
117
|
-
|
|
118
|
-
- **Single active line**: the plugin keeps one status line per session; the TUI slot shows the most recently active session.
|
|
119
|
-
- **Narration is opt-in**: the `⏵` self-narration contract (model writes a short status line at the top of each reply) is injected by default (`narrate: true`); set `narrate: false` for a purely event-derived line.
|
|
120
|
-
- **No progress percentages**: DSH has no tool progress events; a long tool shows elapsed time only.
|
|
121
|
-
- **No animated frames**: the TUI slot renders a static text fragment; frame animation (moon/comet/braille presets) is deferred until the prompt-slot contract supports a frame callback.
|
|
122
|
-
- **Web dock entry duplicates the turn label**: the input-dock `WorkingLine` and the chat `TurnStatus` show the same snapshot; the dock entry exists for session views where the turn label is not visible.
|
|
1
|
+
# dsh-working-activity
|
|
2
|
+
|
|
3
|
+
A live "working line" for DeepSeek Harness: the model's real-time activity — playful thinking copy, the tool actually running, elapsed time, and a turn-end summary — shown while the agent works.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
Folds the durable session stream (`turn/start`, `assistant/chunk`, `tool/call`, `tool/result`, `turn/end`) plus `agent/status` into one status line, refreshed on a render tick:
|
|
8
|
+
|
|
9
|
+
- **Thinking**: short colloquial copy rotates every few seconds (`嗯…让我捋捋`, `盘一下盘一下`, `大脑转起来了`, deadpan `lol` / `hm` / `ok`), tiered when thinking runs long (30s / 1min / 5min), night-owl copy mixed in between 00:00–06:00 local time.
|
|
10
|
+
- **Tool activity**: the running tool renders as `俏皮动词 + 参数细节 + 已耗时` (`跑个命令 npm test · 12s`); failed tools show `翻车了`-style copy in the done line.
|
|
11
|
+
- **Turn summary**: on `turn/end` the line becomes `搞定 ✓ · N 工具 · 想Xs 干Ys` (thinking/tool split), with the last tool's fragment pinned for a few seconds.
|
|
12
|
+
- **Minimal mode**: `phrases: false` renders plain functional labels (`思考中 · 总1m23s`, `bash npm test · 12s`).
|
|
13
|
+
|
|
14
|
+
Two optional sinks, both off by default only when their seam is absent:
|
|
15
|
+
|
|
16
|
+
1. **TUI prompt slot** — registers the `${activity}` template value on `ctx.tuiPrompt` when the TUI is composed. Add `${activity}` to `theme.leftPrompt` to see it next to `cwd`/`model`/`context`.
|
|
17
|
+
2. **Session events** — appends log-only `activity/status` events (never surface events: the model never sees them) for Web and other UI consumers; replay ignores them.
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
The package is a self-mounting bundle: it declares `dsh.bundle.patch`
|
|
22
|
+
(`cordis.patch.yml`), so the official CLI both installs it and appends it to
|
|
23
|
+
the profile's bundle layer stack:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
dsh plugin --profile <profile> add dsh-working-activity
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
At boot, app-boot applies the bundle's patch list over the profile root and
|
|
30
|
+
the package inserts its own `working-activity` row — no manual configuration
|
|
31
|
+
required. To tune a value, override the row's config by id in the profile's
|
|
32
|
+
user layer (`$DSH_HOME/profiles/<profile>/cordis.patch.yml`) instead of
|
|
33
|
+
inserting a second same-id row:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
- id: working-activity
|
|
37
|
+
config:
|
|
38
|
+
publishIntervalMs: 500
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## TUI usage
|
|
42
|
+
|
|
43
|
+
Install the plugin into a profile that composes the official `dsh-tui`, then
|
|
44
|
+
add the `${activity}` slot to the left prompt template in the profile's user
|
|
45
|
+
layer (`$DSH_HOME/profiles/<profile>/cordis.patch.yml`):
|
|
46
|
+
|
|
47
|
+
```yaml
|
|
48
|
+
- id: tui
|
|
49
|
+
config:
|
|
50
|
+
theme:
|
|
51
|
+
leftPrompt: '${cwd}${git/worktree}${activity}${model}${token_meter/cache_hit_rate}${context}'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
While a turn runs, the prompt line shows e.g. `dsh main 跑个命令 npm test · 12s deepseek-chat …`; while thinking, `嗯…让我捋捋 · 总1m23s`; after the turn, `搞定 ✓ · 4 工具 · 想12s 干11s` briefly. Without `${activity}` in the template, the plugin is inert in the TUI (the slot is unregistered values are omitted by the template renderer).
|
|
55
|
+
|
|
56
|
+
## Web usage
|
|
57
|
+
|
|
58
|
+
The Web client renders the live line two ways, both fed by the `activity/status` events:
|
|
59
|
+
|
|
60
|
+
- The turn-level status label (`TurnStatus`, formerly the static "Deep diving...") shows the live line while a turn runs, keeping its sweep animation.
|
|
61
|
+
- A working-line dock entry (`WorkingLine` on `conversation.input.dock`) renders the turn-end statistics (token/elapsed/tool summary) above the composer after a turn settles; live phases stay on the turn label.
|
|
62
|
+
|
|
63
|
+
Both fall back to the previous static label while the plugin is absent, so the Web UI is unaffected by disabling it.
|
|
64
|
+
|
|
65
|
+
## Configuration
|
|
66
|
+
|
|
67
|
+
| Key | Type | Default | Meaning |
|
|
68
|
+
|---|---|---|---|
|
|
69
|
+
| `phrases` | `boolean` | `true` | Playful copy pool; `false` renders plain functional labels |
|
|
70
|
+
| `publish` | `boolean` | `false` | Append `activity/status` session events for UI consumers. Off by default: appended events currently make session logs unresumable (see note below) |
|
|
71
|
+
| `tickMs` | `number` | `500` | Status render tick interval (100–5000) |
|
|
72
|
+
| `publishIntervalMs` | `number` | `2000` | Minimum interval between published events while the line is stable (500–30000) |
|
|
73
|
+
| `detailLimit` | `number` | `40` | Max displayed detail length (paths/commands/patterns), 8–120 |
|
|
74
|
+
| `customActions` | `object` | `{}` | Exact tool-name → action-copy pools, e.g. `{"my_deploy": ["部署一下", "上线中"]}` |
|
|
75
|
+
| `narrate` | `boolean` | `true` | Inject the `⏵` self-narration contract into the system prompt; the line is surfaced live and stripped from the chat body |
|
|
76
|
+
|
|
77
|
+
## Event contract
|
|
78
|
+
|
|
79
|
+
`activity/status` is a log-only session event (merge-extensible `SessionEventMap` member, no `surfaceOp`):
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
{
|
|
83
|
+
phase: 'idle' | 'waiting' | 'thinking' | 'tool' | 'done'
|
|
84
|
+
line: string // plain-text status line, no ANSI
|
|
85
|
+
label?: string // current work label (tool action / stage)
|
|
86
|
+
detail?: string // path / command / pattern fragment
|
|
87
|
+
phrase?: string // current playful phrase
|
|
88
|
+
toolCount: number // tools completed this turn
|
|
89
|
+
turnElapsedMs: number // ms since turn start
|
|
90
|
+
phaseStartedAt: number // epoch ms the phase started (animation anchor)
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
> **Why `publish` is off by default:** `session.append()` cannot mark events ignorable, and the resume read path refuses any log containing unknown non-ignorable event types — so with `publish: true`, every session that rendered a status line fails to resume. Re-enable only for a log-replaying consumer on a harness that supports ignorable appends. The live TUI prompt line is unaffected.
|
|
95
|
+
|
|
96
|
+
Publishing rules: line changes publish immediately; a stable line republishes at most every `publishIntervalMs` so a long tool's elapsed time stays live without flooding the log. All data is lossless JSON; optional fields are omitted when absent.
|
|
97
|
+
|
|
98
|
+
## Export shape
|
|
99
|
+
|
|
100
|
+
A function/namespace plugin: `name` / `Config` / `apply`, no default export. The state machine (`ActivityTracker`) and copy pools live in `./status` and `./phrases` (pure, clock-injected, unit-tested). The invariant companion registers under `./invariant`.
|
|
101
|
+
|
|
102
|
+
## Model Experience
|
|
103
|
+
|
|
104
|
+
### Prompt and tool surface
|
|
105
|
+
|
|
106
|
+
Nothing. The plugin injects no prompt sections, registers no tools, and appends no surface events. `activity/status` is UI state only: it never enters derived model history, so the model cannot see its own working line.
|
|
107
|
+
|
|
108
|
+
### Token effect
|
|
109
|
+
|
|
110
|
+
Zero per request.
|
|
111
|
+
|
|
112
|
+
### KV Cache effect
|
|
113
|
+
|
|
114
|
+
No system-prompt contribution, so no cache-stability effect.
|
|
115
|
+
|
|
116
|
+
## Known Limitations and Deferred Work
|
|
117
|
+
|
|
118
|
+
- **Single active line**: the plugin keeps one status line per session; the TUI slot shows the most recently active session.
|
|
119
|
+
- **Narration is opt-in**: the `⏵` self-narration contract (model writes a short status line at the top of each reply) is injected by default (`narrate: true`); set `narrate: false` for a purely event-derived line.
|
|
120
|
+
- **No progress percentages**: DSH has no tool progress events; a long tool shows elapsed time only.
|
|
121
|
+
- **No animated frames**: the TUI slot renders a static text fragment; frame animation (moon/comet/braille presets) is deferred until the prompt-slot contract supports a frame callback.
|
|
122
|
+
- **Web dock entry duplicates the turn label**: the input-dock `WorkingLine` and the chat `TurnStatus` show the same snapshot; the dock entry exists for session views where the turn label is not visible.
|
package/README.zh.md
CHANGED
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
# @deepseek-ai/dsh-working-activity
|
|
2
|
-
|
|
3
|
-
[English](README.md) | 中文
|
|
4
|
-
|
|
5
|
-
为 DeepSeek Harness 打造的一条实时 "工作状态行":模型的实时活动——俏皮思考文案、真正在跑的工具、已耗时、收尾摘要——在 agent 干活时展示出来。
|
|
6
|
-
|
|
7
|
-
## 功能
|
|
8
|
-
|
|
9
|
-
把持久会话流(`turn/start`、`assistant/chunk`、`tool/call`、`tool/result`、`turn/end`)和 `agent/status` 折叠成一条状态行,按渲染 tick 刷新:
|
|
10
|
-
|
|
11
|
-
- **思考中**:每隔几秒轮换一句短俏皮文案(`嗯…让我捋捋`、`盘一下盘一下`、`大脑转起来了`,穿插面无表情的 `lol` / `hm` / `ok`);想久了自动分档(30 秒 / 1 分钟 / 5 分钟);本地时间 00:00–06:00 混入深夜专属文案。
|
|
12
|
-
- **工具活动**:正在运行的工具渲染为 `俏皮动词 + 参数细节 + 已耗时`(`跑个命令 npm test · 12s`);失败工具在收尾行显示 `翻车了` 风格文案。
|
|
13
|
-
- **收尾摘要**:`turn/end` 后状态行变为 `搞定 ✓ · N 工具 · 想Xs 干Ys`(思考/干活耗时拆分),并短暂钉住最后一个工具的片段。
|
|
14
|
-
- **极简模式**:`phrases: false` 时渲染朴素功能标签(`思考中 · 总1m23s`、`bash npm test · 12s`)。
|
|
15
|
-
|
|
16
|
-
两个可选出口,只有对应接缝存在时才会生效:
|
|
17
|
-
|
|
18
|
-
1. **TUI prompt 槽位** —— TUI 组合存在时,在 `ctx.tuiPrompt` 上注册 `${activity}` 模板值。把 `${activity}` 加进 `theme.leftPrompt` 即可在 `cwd`/`model`/`context` 旁边看到它。
|
|
19
|
-
2. **会话事件** —— 追加只记日志的 `activity/status` 事件(绝不是 surface 事件:模型永远看不到),供 Web 与其他 UI 消费;回放时忽略它们。
|
|
20
|
-
|
|
21
|
-
## 安装
|
|
22
|
-
|
|
23
|
-
```yaml
|
|
24
|
-
# cordis.yml
|
|
25
|
-
plugins:
|
|
26
|
-
- id: working-activity
|
|
27
|
-
name: '@deepseek-ai/dsh-working-activity'
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## TUI 用法
|
|
31
|
-
|
|
32
|
-
与 `dsh-tui` 一起启用插件,并把槽位加进左侧 prompt 模板:
|
|
33
|
-
|
|
34
|
-
```yaml
|
|
35
|
-
plugins:
|
|
36
|
-
- id: tui
|
|
37
|
-
name: '@deepseek-ai/dsh-tui'
|
|
38
|
-
config:
|
|
39
|
-
theme:
|
|
40
|
-
leftPrompt: '${cwd}${git/worktree}${activity}${model}${token_meter/cache_hit_rate}${context}'
|
|
41
|
-
- id: working-activity
|
|
42
|
-
name: '@deepseek-ai/dsh-working-activity'
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
一轮进行中时,提示行显示例如 `dsh main 跑个命令 npm test · 12s deepseek-chat …`;思考时显示 `嗯…让我捋捋 · 总1m23s`;收尾后短暂显示 `搞定 ✓ · 4 工具 · 想12s 干11s`。模板里没有 `${activity}` 时,插件在 TUI 中不产生任何效果(槽位未注册的值会被模板渲染器省略)。
|
|
46
|
-
|
|
47
|
-
## Web 用法
|
|
48
|
-
|
|
49
|
-
Web 客户端通过 `activity/status` 事件以两种方式渲染实时状态行:
|
|
50
|
-
|
|
51
|
-
- 回合级状态标签(`TurnStatus`,原先是静态的 "Deep diving..."):回合进行中显示实时状态行,保留原有的流光扫过特效。
|
|
52
|
-
- 输入区上方的状态行条目(`WorkingLine`,挂在 `conversation.input.dock`):回合结束后渲染收工统计(token/耗时/工具摘要);活动阶段只在轮辑标签上显示。
|
|
53
|
-
|
|
54
|
-
插件缺席时两者都回退到原来的静态标签,禁用插件不影响 Web UI。
|
|
55
|
-
|
|
56
|
-
## 配置
|
|
57
|
-
|
|
58
|
-
| 键 | 类型 | 默认值 | 含义 |
|
|
59
|
-
|---|---|---|---|
|
|
60
|
-
| `phrases` | `boolean` | `true` | 俏皮文案池;`false` 渲染朴素功能标签 |
|
|
61
|
-
| `publish` | `boolean` | `false` | 为 UI 消费者追加 `activity/status` 会话事件。默认关闭:追加的事件目前会导致会话日志无法 resume(见下方说明) |
|
|
62
|
-
| `tickMs` | `number` | `500` | 状态渲染 tick 间隔(50–5000) |
|
|
63
|
-
| `publishIntervalMs` | `number` | `2000` | 状态行稳定时两次发布事件的最小间隔(500–30000) |
|
|
64
|
-
| `detailLimit` | `number` | `40` | 详情最大展示长度(路径/命令/模式),8–120 |
|
|
65
|
-
| `customActions` | `object` | `{}` | 工具名精确匹配 → 动作文案池,如 `{"my_deploy": ["部署一下", "上线中"]}` |
|
|
66
|
-
| `narrate` | `boolean` | `true` | 向 system prompt 注入 `⏵` 自述约定;该行实时展示并从聊天正文中过滤 |
|
|
67
|
-
|
|
68
|
-
## 事件契约
|
|
69
|
-
|
|
70
|
-
`activity/status` 是只记日志的会话事件(merge 可扩展的 `SessionEventMap` 成员,无 `surfaceOp`):
|
|
71
|
-
|
|
72
|
-
```ts
|
|
73
|
-
{
|
|
74
|
-
phase: 'idle' | 'waiting' | 'thinking' | 'tool' | 'done'
|
|
75
|
-
line: string // 纯文本状态行,无 ANSI
|
|
76
|
-
label?: string // 当前工作标签(工具动作/阶段)
|
|
77
|
-
detail?: string // 路径 / 命令 / 模式片段
|
|
78
|
-
phrase?: string // 当前俏皮文案
|
|
79
|
-
toolCount: number // 本轮已完成的工具数
|
|
80
|
-
turnElapsedMs: number // 距本轮开始毫秒数
|
|
81
|
-
phaseStartedAt: number // 相位开始的 epoch 毫秒(动画锚点)
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
> **为什么 `publish` 默认关闭:** `session.append()` 无法把事件标记为 ignorable,而 resume 的读取路径会拒绝包含未知且不可忽略事件类型的日志——开启 `publish` 后,凡是显示过状态行的会话都会 resume 失败。仅在日志重放消费者、且 harness 支持 ignorable append 时再打开。TUI 实时状态行不受影响。
|
|
86
|
-
|
|
87
|
-
发布规则:状态行变化立即发布;稳定行最多每 `publishIntervalMs` 重发一次,让长工具的已耗时保持实时而不刷爆日志。所有数据都是无损 JSON;可选字段缺省时省略。
|
|
88
|
-
|
|
89
|
-
## 导出形状
|
|
90
|
-
|
|
91
|
-
函数/命名空间插件:`name` / `Config` / `apply`,无默认导出。状态机(`ActivityTracker`)与文案池在 `./status` 和 `./phrases`(纯逻辑、时钟注入、有单测)。不变量伴生插件在 `./invariant` 注册。
|
|
92
|
-
|
|
93
|
-
## Model Experience
|
|
94
|
-
|
|
95
|
-
### 提示词与工具面
|
|
96
|
-
|
|
97
|
-
没有。插件不注入任何提示词段、不注册任何工具、不追加任何 surface 事件。`activity/status` 只是 UI 状态:永不进入派生模型历史,模型看不到自己的工作状态行。
|
|
98
|
-
|
|
99
|
-
### Token 影响
|
|
100
|
-
|
|
101
|
-
每次请求为零。
|
|
102
|
-
|
|
103
|
-
### KV 缓存影响
|
|
104
|
-
|
|
105
|
-
不贡献 system prompt,因此无缓存稳定性影响。
|
|
106
|
-
|
|
107
|
-
## Known Limitations and Deferred Work
|
|
108
|
-
|
|
109
|
-
- **单条活跃状态行**:插件按会话维护一条状态行;TUI 槽位显示最近活跃会话。
|
|
110
|
-
- **自述可选**:`⏵` 模型自述约定(每次回复顶部写一行短状态文案)默认注入(`narrate: true`);设 `narrate: false` 则只由事件推导。
|
|
111
|
-
- **无进度百分比**:DSH 没有工具进度事件;长工具只显示已耗时。
|
|
112
|
-
- **无动画帧**:TUI 槽位渲染静态文本片段;帧动画(moon/comet/braille 预设)要等 prompt 槽位契约支持帧回调后再做。
|
|
113
|
-
- **Web 双入口重复显示**:输入区 `WorkingLine` 与聊天区 `TurnStatus` 显示同一快照;dock 条目用于回合标签不可见的会话视图。
|
|
1
|
+
# @deepseek-ai/dsh-working-activity
|
|
2
|
+
|
|
3
|
+
[English](README.md) | 中文
|
|
4
|
+
|
|
5
|
+
为 DeepSeek Harness 打造的一条实时 "工作状态行":模型的实时活动——俏皮思考文案、真正在跑的工具、已耗时、收尾摘要——在 agent 干活时展示出来。
|
|
6
|
+
|
|
7
|
+
## 功能
|
|
8
|
+
|
|
9
|
+
把持久会话流(`turn/start`、`assistant/chunk`、`tool/call`、`tool/result`、`turn/end`)和 `agent/status` 折叠成一条状态行,按渲染 tick 刷新:
|
|
10
|
+
|
|
11
|
+
- **思考中**:每隔几秒轮换一句短俏皮文案(`嗯…让我捋捋`、`盘一下盘一下`、`大脑转起来了`,穿插面无表情的 `lol` / `hm` / `ok`);想久了自动分档(30 秒 / 1 分钟 / 5 分钟);本地时间 00:00–06:00 混入深夜专属文案。
|
|
12
|
+
- **工具活动**:正在运行的工具渲染为 `俏皮动词 + 参数细节 + 已耗时`(`跑个命令 npm test · 12s`);失败工具在收尾行显示 `翻车了` 风格文案。
|
|
13
|
+
- **收尾摘要**:`turn/end` 后状态行变为 `搞定 ✓ · N 工具 · 想Xs 干Ys`(思考/干活耗时拆分),并短暂钉住最后一个工具的片段。
|
|
14
|
+
- **极简模式**:`phrases: false` 时渲染朴素功能标签(`思考中 · 总1m23s`、`bash npm test · 12s`)。
|
|
15
|
+
|
|
16
|
+
两个可选出口,只有对应接缝存在时才会生效:
|
|
17
|
+
|
|
18
|
+
1. **TUI prompt 槽位** —— TUI 组合存在时,在 `ctx.tuiPrompt` 上注册 `${activity}` 模板值。把 `${activity}` 加进 `theme.leftPrompt` 即可在 `cwd`/`model`/`context` 旁边看到它。
|
|
19
|
+
2. **会话事件** —— 追加只记日志的 `activity/status` 事件(绝不是 surface 事件:模型永远看不到),供 Web 与其他 UI 消费;回放时忽略它们。
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
# cordis.yml
|
|
25
|
+
plugins:
|
|
26
|
+
- id: working-activity
|
|
27
|
+
name: '@deepseek-ai/dsh-working-activity'
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## TUI 用法
|
|
31
|
+
|
|
32
|
+
与 `dsh-tui` 一起启用插件,并把槽位加进左侧 prompt 模板:
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
plugins:
|
|
36
|
+
- id: tui
|
|
37
|
+
name: '@deepseek-ai/dsh-tui'
|
|
38
|
+
config:
|
|
39
|
+
theme:
|
|
40
|
+
leftPrompt: '${cwd}${git/worktree}${activity}${model}${token_meter/cache_hit_rate}${context}'
|
|
41
|
+
- id: working-activity
|
|
42
|
+
name: '@deepseek-ai/dsh-working-activity'
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
一轮进行中时,提示行显示例如 `dsh main 跑个命令 npm test · 12s deepseek-chat …`;思考时显示 `嗯…让我捋捋 · 总1m23s`;收尾后短暂显示 `搞定 ✓ · 4 工具 · 想12s 干11s`。模板里没有 `${activity}` 时,插件在 TUI 中不产生任何效果(槽位未注册的值会被模板渲染器省略)。
|
|
46
|
+
|
|
47
|
+
## Web 用法
|
|
48
|
+
|
|
49
|
+
Web 客户端通过 `activity/status` 事件以两种方式渲染实时状态行:
|
|
50
|
+
|
|
51
|
+
- 回合级状态标签(`TurnStatus`,原先是静态的 "Deep diving..."):回合进行中显示实时状态行,保留原有的流光扫过特效。
|
|
52
|
+
- 输入区上方的状态行条目(`WorkingLine`,挂在 `conversation.input.dock`):回合结束后渲染收工统计(token/耗时/工具摘要);活动阶段只在轮辑标签上显示。
|
|
53
|
+
|
|
54
|
+
插件缺席时两者都回退到原来的静态标签,禁用插件不影响 Web UI。
|
|
55
|
+
|
|
56
|
+
## 配置
|
|
57
|
+
|
|
58
|
+
| 键 | 类型 | 默认值 | 含义 |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| `phrases` | `boolean` | `true` | 俏皮文案池;`false` 渲染朴素功能标签 |
|
|
61
|
+
| `publish` | `boolean` | `false` | 为 UI 消费者追加 `activity/status` 会话事件。默认关闭:追加的事件目前会导致会话日志无法 resume(见下方说明) |
|
|
62
|
+
| `tickMs` | `number` | `500` | 状态渲染 tick 间隔(50–5000) |
|
|
63
|
+
| `publishIntervalMs` | `number` | `2000` | 状态行稳定时两次发布事件的最小间隔(500–30000) |
|
|
64
|
+
| `detailLimit` | `number` | `40` | 详情最大展示长度(路径/命令/模式),8–120 |
|
|
65
|
+
| `customActions` | `object` | `{}` | 工具名精确匹配 → 动作文案池,如 `{"my_deploy": ["部署一下", "上线中"]}` |
|
|
66
|
+
| `narrate` | `boolean` | `true` | 向 system prompt 注入 `⏵` 自述约定;该行实时展示并从聊天正文中过滤 |
|
|
67
|
+
|
|
68
|
+
## 事件契约
|
|
69
|
+
|
|
70
|
+
`activity/status` 是只记日志的会话事件(merge 可扩展的 `SessionEventMap` 成员,无 `surfaceOp`):
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
{
|
|
74
|
+
phase: 'idle' | 'waiting' | 'thinking' | 'tool' | 'done'
|
|
75
|
+
line: string // 纯文本状态行,无 ANSI
|
|
76
|
+
label?: string // 当前工作标签(工具动作/阶段)
|
|
77
|
+
detail?: string // 路径 / 命令 / 模式片段
|
|
78
|
+
phrase?: string // 当前俏皮文案
|
|
79
|
+
toolCount: number // 本轮已完成的工具数
|
|
80
|
+
turnElapsedMs: number // 距本轮开始毫秒数
|
|
81
|
+
phaseStartedAt: number // 相位开始的 epoch 毫秒(动画锚点)
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
> **为什么 `publish` 默认关闭:** `session.append()` 无法把事件标记为 ignorable,而 resume 的读取路径会拒绝包含未知且不可忽略事件类型的日志——开启 `publish` 后,凡是显示过状态行的会话都会 resume 失败。仅在日志重放消费者、且 harness 支持 ignorable append 时再打开。TUI 实时状态行不受影响。
|
|
86
|
+
|
|
87
|
+
发布规则:状态行变化立即发布;稳定行最多每 `publishIntervalMs` 重发一次,让长工具的已耗时保持实时而不刷爆日志。所有数据都是无损 JSON;可选字段缺省时省略。
|
|
88
|
+
|
|
89
|
+
## 导出形状
|
|
90
|
+
|
|
91
|
+
函数/命名空间插件:`name` / `Config` / `apply`,无默认导出。状态机(`ActivityTracker`)与文案池在 `./status` 和 `./phrases`(纯逻辑、时钟注入、有单测)。不变量伴生插件在 `./invariant` 注册。
|
|
92
|
+
|
|
93
|
+
## Model Experience
|
|
94
|
+
|
|
95
|
+
### 提示词与工具面
|
|
96
|
+
|
|
97
|
+
没有。插件不注入任何提示词段、不注册任何工具、不追加任何 surface 事件。`activity/status` 只是 UI 状态:永不进入派生模型历史,模型看不到自己的工作状态行。
|
|
98
|
+
|
|
99
|
+
### Token 影响
|
|
100
|
+
|
|
101
|
+
每次请求为零。
|
|
102
|
+
|
|
103
|
+
### KV 缓存影响
|
|
104
|
+
|
|
105
|
+
不贡献 system prompt,因此无缓存稳定性影响。
|
|
106
|
+
|
|
107
|
+
## Known Limitations and Deferred Work
|
|
108
|
+
|
|
109
|
+
- **单条活跃状态行**:插件按会话维护一条状态行;TUI 槽位显示最近活跃会话。
|
|
110
|
+
- **自述可选**:`⏵` 模型自述约定(每次回复顶部写一行短状态文案)默认注入(`narrate: true`);设 `narrate: false` 则只由事件推导。
|
|
111
|
+
- **无进度百分比**:DSH 没有工具进度事件;长工具只显示已耗时。
|
|
112
|
+
- **无动画帧**:TUI 槽位渲染静态文本片段;帧动画(moon/comet/braille 预设)要等 prompt 槽位契约支持帧回调后再做。
|
|
113
|
+
- **Web 双入口重复显示**:输入区 `WorkingLine` 与聊天区 `TurnStatus` 显示同一快照;dock 条目用于回合标签不可见的会话视图。
|
package/cordis.patch.yml
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
# dsh-working-activity bundle patch: mount the plugin itself into the
|
|
2
|
-
# profile composition tree.
|
|
3
|
-
#
|
|
4
|
-
# `dsh plugin --profile <name> add dsh-working-activity` auto-initializes the
|
|
5
|
-
# profile (first layer @deepseek-ai/dsh-base), pnpm-installs this package into
|
|
6
|
-
# the profile, and the CLI's reconcile step appends it to the profile's
|
|
7
|
-
# dsh.profile.bundles because this package.json declares `dsh.bundle.patch`.
|
|
8
|
-
# At boot, app-boot applies every bundle's patch list in bundle order over the
|
|
9
|
-
# empty root; this insert list is what actually mounts the working-activity
|
|
10
|
-
# row — no manual configuration is needed.
|
|
11
|
-
#
|
|
12
|
-
# All row config stays at schema defaults (phrases/publish/tickMs/
|
|
13
|
-
# publishIntervalMs/detailLimit/customActions/narrate). To tune a value (for
|
|
14
|
-
# dsh-cc, set publishIntervalMs to 500), override this row's config by id in
|
|
15
|
-
# the profile's own cordis.patch.yml user layer — do NOT insert a second
|
|
16
|
-
# same-id row.
|
|
17
|
-
- insert:
|
|
18
|
-
- id: working-activity
|
|
19
|
-
name: 'dsh-working-activity'
|
|
1
|
+
# dsh-working-activity bundle patch: mount the plugin itself into the
|
|
2
|
+
# profile composition tree.
|
|
3
|
+
#
|
|
4
|
+
# `dsh plugin --profile <name> add dsh-working-activity` auto-initializes the
|
|
5
|
+
# profile (first layer @deepseek-ai/dsh-base), pnpm-installs this package into
|
|
6
|
+
# the profile, and the CLI's reconcile step appends it to the profile's
|
|
7
|
+
# dsh.profile.bundles because this package.json declares `dsh.bundle.patch`.
|
|
8
|
+
# At boot, app-boot applies every bundle's patch list in bundle order over the
|
|
9
|
+
# empty root; this insert list is what actually mounts the working-activity
|
|
10
|
+
# row — no manual configuration is needed.
|
|
11
|
+
#
|
|
12
|
+
# All row config stays at schema defaults (phrases/publish/tickMs/
|
|
13
|
+
# publishIntervalMs/detailLimit/customActions/narrate). To tune a value (for
|
|
14
|
+
# dsh-cc, set publishIntervalMs to 500), override this row's config by id in
|
|
15
|
+
# the profile's own cordis.patch.yml user layer — do NOT insert a second
|
|
16
|
+
# same-id row.
|
|
17
|
+
- insert:
|
|
18
|
+
- id: working-activity
|
|
19
|
+
name: 'dsh-working-activity'
|
package/lib/client.js
CHANGED
|
@@ -6,7 +6,7 @@ window.__ModuleLoader__.load({
|
|
|
6
6
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
//#region \0dsh-css:src/client/WorkingLine.module.css.mjs
|
|
9
|
-
const css = ".
|
|
9
|
+
const css = ".TG_uoa_line{box-sizing:border-box;width:100%;max-width:var(--dsh-composer-card-max-width);font-family:var(--dsw-font-family);color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin:0 auto;padding:4px 16px 0;font-size:13px;line-height:18px;display:flex}.TG_uoa_marker{background:var(--dsw-alias-label-tertiary);border-radius:50%;flex:none;width:7px;height:7px;animation:1.6s ease-in-out infinite TG_uoa_working-pulse}.TG_uoa_line[data-activity-phase=done] .TG_uoa_marker{background:var(--dsw-alias-state-business-primary);animation:none}.TG_uoa_line[data-activity-phase=tool] .TG_uoa_marker{background:var(--dsw-alias-state-business-primary)}.TG_uoa_line[data-activity-phase=waiting] .TG_uoa_marker{background:var(--dsw-alias-label-tertiary);opacity:.6}.TG_uoa_text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.TG_uoa_tools{background:var(--dsw-alias-surface-tertiary);min-width:18px;color:var(--dsw-alias-label-secondary);text-align:center;border-radius:9px;flex:none;padding:0 5px;font-size:11px;line-height:18px}@keyframes TG_uoa_working-pulse{0%,to{opacity:1}50%{opacity:.35}}";
|
|
10
10
|
const tagId = "dsh-working-activity/WorkingLine.module.css";
|
|
11
11
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
12
12
|
const tag = document.createElement("style");
|
|
@@ -16,11 +16,11 @@ window.__ModuleLoader__.load({
|
|
|
16
16
|
document.head.appendChild(tag);
|
|
17
17
|
}
|
|
18
18
|
var WorkingLine_module_css_default = {
|
|
19
|
-
"working-pulse": "
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
19
|
+
"working-pulse": "TG_uoa_working-pulse",
|
|
20
|
+
"tools": "TG_uoa_tools",
|
|
21
|
+
"line": "TG_uoa_line",
|
|
22
|
+
"text": "TG_uoa_text",
|
|
23
|
+
"marker": "TG_uoa_marker"
|
|
24
24
|
};
|
|
25
25
|
//#endregion
|
|
26
26
|
//#region src/client/WorkingLine.tsx
|