dsh-working-activity 0.3.0 → 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/lib/client.js +3 -3
- 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 +13 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +24 -2
- package/lib/types/lang.d.ts +10 -0
- package/lib/types/lang.d.ts.map +1 -1
- package/lib/types/lang.js +4 -0
- package/lib/types/phrases.d.ts +86 -1
- package/lib/types/phrases.d.ts.map +1 -1
- package/lib/types/phrases.js +247 -16
- package/lib/types/status.d.ts +62 -0
- package/lib/types/status.d.ts.map +1 -1
- package/lib/types/status.js +183 -13
- package/package.json +127 -119
- package/src/config.ts +174 -0
- package/src/frames.ts +138 -0
- package/src/index.ts +43 -2
- package/src/lang.ts +4 -0
- package/src/phrases.ts +294 -16
- package/src/status.ts +209 -14
package/lib/types/status.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* no timers, no cordis — deterministic given the event stream and a clock.
|
|
6
6
|
* @module @deepseek-ai/dsh-working-activity/status
|
|
7
7
|
*/
|
|
8
|
-
import { actionFor, donePhrase, failPhrase, fmtDuration, isGitTool, isNight, thinkingPhrase, waitingPhrase, } from './phrases.js';
|
|
8
|
+
import { actionFor, compactPhrase, continuePhrase, donePhrase, failPhrase, fmtDuration, holidayPhrase, isGitTool, isNight, isWeekend, modelQuip, overflowPhrase, rarePhrase, RARE_CHANCE, RARE_PHRASES, EN_RARE_PHRASES, thinkingPhrase, weekendPhrase, waitingPhrase, } from './phrases.js';
|
|
9
9
|
import { t } from './lang.js';
|
|
10
10
|
/** Format one tool into its display fragment (`跑个命令 npm test`). */
|
|
11
11
|
function toolFragment(tool) {
|
|
@@ -96,6 +96,27 @@ export class ActivityTracker {
|
|
|
96
96
|
turnTokens = 0;
|
|
97
97
|
/** Completion prefix drawn ONCE at turn end so the done line stays stable. */
|
|
98
98
|
donePrefix = t('done-prefix');
|
|
99
|
+
/** Easter eggs shown once per turn (holiday / rare / weekend). */
|
|
100
|
+
holidayShown = false;
|
|
101
|
+
rareShown = false;
|
|
102
|
+
weekendShown = false;
|
|
103
|
+
/** One-off copy pinned by an external event (interrupt / model switch /
|
|
104
|
+
* compaction / work reminder), shown until it expires. */
|
|
105
|
+
pendingPhrase = null;
|
|
106
|
+
pendingUntil = 0;
|
|
107
|
+
/** Git branch of the session cwd (fed by the host, best-effort). */
|
|
108
|
+
gitBranch;
|
|
109
|
+
/** Consecutive fast tool streak (combo). */
|
|
110
|
+
streak = 0;
|
|
111
|
+
lastToolEndAt = 0;
|
|
112
|
+
maxStreak = 0;
|
|
113
|
+
/** Subagent (agent/task) calls in the current turn. */
|
|
114
|
+
subagentCount = 0;
|
|
115
|
+
/** Work-reminder fired once per turn. */
|
|
116
|
+
reminded = false;
|
|
117
|
+
/** Streaming token estimate for the tps prefix. */
|
|
118
|
+
tokBuf = 0;
|
|
119
|
+
tokWindowStart = 0;
|
|
99
120
|
/**
|
|
100
121
|
* @param config - Behavioral knobs.
|
|
101
122
|
* @param now - Wall-clock supplier (injectable for tests).
|
|
@@ -121,6 +142,34 @@ export class ActivityTracker {
|
|
|
121
142
|
this.waitingFirstToken = true;
|
|
122
143
|
}
|
|
123
144
|
}
|
|
145
|
+
/** The user interrupted the running turn: show a comeback quip next. */
|
|
146
|
+
onInterrupted() {
|
|
147
|
+
if (!this.config.phrases)
|
|
148
|
+
return;
|
|
149
|
+
this.pendingPhrase = continuePhrase();
|
|
150
|
+
this.pendingUntil = this.now() + PENDING_MS;
|
|
151
|
+
}
|
|
152
|
+
/** The model was switched: quip for the new model id. */
|
|
153
|
+
onModelSwitch(modelId) {
|
|
154
|
+
if (!this.config.phrases)
|
|
155
|
+
return;
|
|
156
|
+
const quip = modelQuip(modelId);
|
|
157
|
+
if (quip !== null) {
|
|
158
|
+
this.pendingPhrase = quip;
|
|
159
|
+
this.pendingUntil = this.now() + PENDING_MS;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** A context compaction finished (or overflowed): quip about it. */
|
|
163
|
+
onCompact(kind) {
|
|
164
|
+
if (!this.config.phrases)
|
|
165
|
+
return;
|
|
166
|
+
this.pendingPhrase = kind === 'overflow' ? overflowPhrase() : compactPhrase();
|
|
167
|
+
this.pendingUntil = this.now() + PENDING_MS;
|
|
168
|
+
}
|
|
169
|
+
/** Feed the session cwd's git branch (best-effort, host-resolved). */
|
|
170
|
+
onGitBranch(branch) {
|
|
171
|
+
this.gitBranch = branch;
|
|
172
|
+
}
|
|
124
173
|
/** Consume one durable session event (turn/step/tool/stream). */
|
|
125
174
|
onSessionEvent(event) {
|
|
126
175
|
switch (event.type) {
|
|
@@ -138,6 +187,18 @@ export class ActivityTracker {
|
|
|
138
187
|
this.narratedText = null;
|
|
139
188
|
this.lastChunkAt = 0;
|
|
140
189
|
this.recentStream = '';
|
|
190
|
+
// Easter eggs are once-per-turn: a fresh turn can roll them again.
|
|
191
|
+
this.holidayShown = false;
|
|
192
|
+
this.rareShown = false;
|
|
193
|
+
this.weekendShown = false;
|
|
194
|
+
// Per-turn stats reset; the pending quip (interrupt/model/compact)
|
|
195
|
+
// survives across the turn boundary so it shows on the next think.
|
|
196
|
+
this.streak = 0;
|
|
197
|
+
this.maxStreak = 0;
|
|
198
|
+
this.subagentCount = 0;
|
|
199
|
+
this.reminded = false;
|
|
200
|
+
this.tokBuf = 0;
|
|
201
|
+
this.tokWindowStart = at;
|
|
141
202
|
this.setPhase('waiting', at);
|
|
142
203
|
return;
|
|
143
204
|
}
|
|
@@ -159,6 +220,8 @@ export class ActivityTracker {
|
|
|
159
220
|
const narration = extractNarration(this.recentStream);
|
|
160
221
|
if (narration !== null)
|
|
161
222
|
this.narratedText = narration;
|
|
223
|
+
// Streaming token estimate for the tps prefix (pi parity).
|
|
224
|
+
this.tokBuf += estimateTokens(chunk.text);
|
|
162
225
|
}
|
|
163
226
|
return;
|
|
164
227
|
}
|
|
@@ -175,6 +238,14 @@ export class ActivityTracker {
|
|
|
175
238
|
if (this.phase === 'thinking' || this.phase === 'waiting') {
|
|
176
239
|
this.thinkingMs += at - this.thinkingStartedAt;
|
|
177
240
|
}
|
|
241
|
+
// Combo streak: consecutive tools within COMBO_GAP_MS count up.
|
|
242
|
+
this.streak = (this.lastToolEndAt > 0 && at - this.lastToolEndAt <= COMBO_GAP_MS)
|
|
243
|
+
? this.streak + 1
|
|
244
|
+
: 1;
|
|
245
|
+
if (this.streak > this.maxStreak)
|
|
246
|
+
this.maxStreak = this.streak;
|
|
247
|
+
if (/^(?:subagent|agent|task)$/i.test(event.data.name))
|
|
248
|
+
this.subagentCount += 1;
|
|
178
249
|
const parsed = parseArguments(event.data.arguments);
|
|
179
250
|
const action = this.config.phrases ? actionFor(event.data.name, this.customActions) : event.data.name;
|
|
180
251
|
const detail = detailFor(event.data.name, parsed, this.config.detailLimit);
|
|
@@ -203,6 +274,7 @@ export class ActivityTracker {
|
|
|
203
274
|
active.endedAt = at;
|
|
204
275
|
this.toolMs += at - active.startedAt;
|
|
205
276
|
this.toolCount += 1;
|
|
277
|
+
this.lastToolEndAt = at;
|
|
206
278
|
this.doneQueue.push({
|
|
207
279
|
action: active.action,
|
|
208
280
|
detail: active.detail,
|
|
@@ -278,11 +350,14 @@ export class ActivityTracker {
|
|
|
278
350
|
}
|
|
279
351
|
const fragment = toolFragment(tool);
|
|
280
352
|
const elapsed = fmtDuration(Math.max(0, nowMs - tool.startedAt));
|
|
281
|
-
const git = tool.isGit
|
|
353
|
+
const git = tool.isGit
|
|
354
|
+
? (this.gitBranch !== undefined ? ` · git ${this.gitBranch}` : ' · git')
|
|
355
|
+
: '';
|
|
356
|
+
const combo = this.streak >= COMBO_SHOW_AT ? ` · 🔥x${this.streak}` : '';
|
|
282
357
|
const narration = this.freshNarration(nowMs);
|
|
283
358
|
const line = narration === null
|
|
284
|
-
? `${fragment} · ${elapsed}${git}`
|
|
285
|
-
: `⏵ ${narration} · ${fragment} · ${elapsed}${git}`;
|
|
359
|
+
? `${fragment} · ${elapsed}${git}${combo}`
|
|
360
|
+
: `⏵ ${narration} · ${fragment} · ${elapsed}${git}${combo}`;
|
|
286
361
|
return {
|
|
287
362
|
phase: 'tool',
|
|
288
363
|
line,
|
|
@@ -330,21 +405,34 @@ export class ActivityTracker {
|
|
|
330
405
|
};
|
|
331
406
|
}
|
|
332
407
|
if (this.config.phrases) {
|
|
333
|
-
|
|
408
|
+
const pending = this.pendingPhraseAt(nowMs);
|
|
409
|
+
// Rare eggs linger longer (pi RARE_PHRASE_TICKS ≈ 7.5s).
|
|
410
|
+
const rotateMs = this.previousPhrase !== undefined && this.isRarePhrase(this.previousPhrase)
|
|
411
|
+
? RARE_ROTATE_MS
|
|
412
|
+
: PHRASE_ROTATE_MS;
|
|
413
|
+
if (pending !== null) {
|
|
414
|
+
this.previousPhrase = pending;
|
|
415
|
+
this.phraseChangedAt = nowMs;
|
|
416
|
+
}
|
|
417
|
+
else if (nowMs - this.phraseChangedAt >= rotateMs) {
|
|
334
418
|
// Waiting (pre-first-token) draws from the waiting pool; thinking
|
|
335
|
-
// rotates the
|
|
336
|
-
// language-aware, so a `/lang` switch shows
|
|
419
|
+
// rotates the egg-aware lively pool (holiday / rare / weekend /
|
|
420
|
+
// night). Both pools are language-aware, so a `/lang` switch shows
|
|
421
|
+
// on the next rotation.
|
|
337
422
|
this.previousPhrase = this.phase === 'waiting'
|
|
338
423
|
? waitingPhrase(this.previousPhrase)
|
|
339
|
-
:
|
|
424
|
+
: this.livelyPhrase(thinkingMs, nowMs);
|
|
340
425
|
this.phraseChangedAt = nowMs;
|
|
341
426
|
}
|
|
342
427
|
const phrase = this.previousPhrase ?? (this.phase === 'waiting'
|
|
343
428
|
? waitingPhrase()
|
|
344
|
-
:
|
|
429
|
+
: this.livelyPhrase(thinkingMs, nowMs));
|
|
430
|
+
// Ellipsis breathing (pi DOT_FRAMES) + optional estimated tps prefix.
|
|
431
|
+
const dots = DOT_FRAMES[Math.floor(nowMs / TICK_MS) % DOT_FRAMES.length];
|
|
432
|
+
const tps = this.tpsPrefix(nowMs);
|
|
345
433
|
return {
|
|
346
434
|
phase: this.phase,
|
|
347
|
-
line: `${phrase} · ${elapsedLine}`,
|
|
435
|
+
line: `${tps}${phrase}${dots} · ${elapsedLine}`,
|
|
348
436
|
phrase,
|
|
349
437
|
toolCount: this.toolCount,
|
|
350
438
|
turnElapsedMs: this.turnElapsedMs(nowMs),
|
|
@@ -361,9 +449,69 @@ export class ActivityTracker {
|
|
|
361
449
|
phaseStartedAt: this.phaseStartedAt,
|
|
362
450
|
};
|
|
363
451
|
}
|
|
452
|
+
/**
|
|
453
|
+
* Pick the next thinking phrase with the pi extension's egg order:
|
|
454
|
+
* holiday (once per turn) → rare 1/150 (once per turn) → weekend greeting
|
|
455
|
+
* (once per turn) → elapsed-time tiers with night mixing. Every egg is
|
|
456
|
+
* gated by `config.features` (absent flags default to on).
|
|
457
|
+
*/
|
|
458
|
+
livelyPhrase(thinkingMs, nowMs) {
|
|
459
|
+
const features = this.config.features ?? {};
|
|
460
|
+
const now = new Date(nowMs);
|
|
461
|
+
if (features.holidays !== false && !this.holidayShown) {
|
|
462
|
+
const holiday = holidayPhrase(now);
|
|
463
|
+
if (holiday !== null) {
|
|
464
|
+
this.holidayShown = true;
|
|
465
|
+
return holiday;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
if (features.rareEggs !== false && !this.rareShown && Math.random() < RARE_CHANCE) {
|
|
469
|
+
this.rareShown = true;
|
|
470
|
+
return rarePhrase(this.previousPhrase);
|
|
471
|
+
}
|
|
472
|
+
if (features.weekend !== false && !this.weekendShown && isWeekend(now)) {
|
|
473
|
+
this.weekendShown = true;
|
|
474
|
+
return weekendPhrase(this.previousPhrase);
|
|
475
|
+
}
|
|
476
|
+
return thinkingPhrase(thinkingMs, this.previousPhrase, features.nightPhrases !== false && isNight(now.getHours()), this.config.customPhrases);
|
|
477
|
+
}
|
|
478
|
+
/** The pending one-off quip (interrupt / model / compact / work reminder)
|
|
479
|
+
* while it is still fresh; expired pending is cleared here. */
|
|
480
|
+
pendingPhraseAt(nowMs) {
|
|
481
|
+
if (this.pendingPhrase !== null) {
|
|
482
|
+
if (nowMs < this.pendingUntil)
|
|
483
|
+
return this.pendingPhrase;
|
|
484
|
+
this.pendingPhrase = null;
|
|
485
|
+
}
|
|
486
|
+
const remindAt = this.config.workRemindAt ?? 0;
|
|
487
|
+
if (!this.reminded && remindAt > 0) {
|
|
488
|
+
const hours = this.turnElapsedMs(nowMs) / 3_600_000;
|
|
489
|
+
if (hours >= remindAt) {
|
|
490
|
+
this.reminded = true;
|
|
491
|
+
return t('work-remind', { hours: Math.floor(hours) });
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return null;
|
|
495
|
+
}
|
|
496
|
+
/** Whether a phrase comes from the rare pool (longer display window). */
|
|
497
|
+
isRarePhrase(phrase) {
|
|
498
|
+
return RARE_PHRASES.includes(phrase) || EN_RARE_PHRASES.includes(phrase);
|
|
499
|
+
}
|
|
500
|
+
/** Estimated tokens/s while the stream is fresh (pi parity, opt-in). */
|
|
501
|
+
tpsPrefix(nowMs) {
|
|
502
|
+
if (!this.config.showTokPerSec || this.tokBuf <= 0)
|
|
503
|
+
return '';
|
|
504
|
+
if (nowMs - this.lastChunkAt > TPS_WINDOW_MS)
|
|
505
|
+
return '';
|
|
506
|
+
const windowSec = Math.max(1, (nowMs - this.tokWindowStart) / 1000);
|
|
507
|
+
const tps = Math.round(this.tokBuf / windowSec);
|
|
508
|
+
return tps > 0 ? `~${tps} tok/s · ` : '';
|
|
509
|
+
}
|
|
364
510
|
doneSummary(nowMs) {
|
|
365
511
|
const { thinkingMs, toolMs, toolCount } = this.stats();
|
|
366
512
|
const tokens = this.turnTokens > 0 ? ` · 🔥 ${fmtTokens(this.turnTokens)}` : '';
|
|
513
|
+
const sub = this.subagentCount > 0 ? ` · ${t('subagent-count', { count: this.subagentCount })}` : '';
|
|
514
|
+
const combo = this.maxStreak >= COMBO_SHOW_AT ? ` · 🔥x${this.maxStreak}` : '';
|
|
367
515
|
const tools = t(toolCount === 1 ? 'tool-count-one' : 'tool-count-many', { count: toolCount });
|
|
368
516
|
const summary = t('done-summary', {
|
|
369
517
|
tools,
|
|
@@ -371,14 +519,14 @@ export class ActivityTracker {
|
|
|
371
519
|
tooling: fmtDuration(toolMs),
|
|
372
520
|
});
|
|
373
521
|
if (!this.config.phrases) {
|
|
374
|
-
return { line: `${t('done-prefix')} · ${summary}${tokens}` };
|
|
522
|
+
return { line: `${t('done-prefix')} · ${summary}${sub}${combo}${tokens}` };
|
|
375
523
|
}
|
|
376
524
|
const last = this.doneQueue.at(-1);
|
|
377
525
|
if (last !== undefined && nowMs - last.endedAt < DONE_FRAGMENT_MS) {
|
|
378
526
|
const fragment = toolFragment(last);
|
|
379
|
-
return { line: `${this.donePrefix} · ${fragment} · ${tools}${tokens}`, phrase: this.donePrefix };
|
|
527
|
+
return { line: `${this.donePrefix} · ${fragment} · ${tools}${sub}${combo}${tokens}`, phrase: this.donePrefix };
|
|
380
528
|
}
|
|
381
|
-
return { line: `${this.donePrefix} · ${summary}${tokens}`, phrase: this.donePrefix };
|
|
529
|
+
return { line: `${this.donePrefix} · ${summary}${sub}${combo}${tokens}`, phrase: this.donePrefix };
|
|
382
530
|
}
|
|
383
531
|
/** The fresh self-narration line, or null once the stream has been quiet. */
|
|
384
532
|
freshNarration(nowMs) {
|
|
@@ -406,6 +554,20 @@ export class ActivityTracker {
|
|
|
406
554
|
}
|
|
407
555
|
/** Rotate the thinking phrase every N render ticks (render cadence ≈ 500ms → ~4s). */
|
|
408
556
|
const PHRASE_ROTATE_MS = 4000;
|
|
557
|
+
/** Rare easter-egg phrases linger this long before rotation (pi ≈ 7.5s). */
|
|
558
|
+
const RARE_ROTATE_MS = 7500;
|
|
559
|
+
/** One-off quips (interrupt / model / compact) display window. */
|
|
560
|
+
const PENDING_MS = 6000;
|
|
561
|
+
/** Tools closer than this count as one combo streak. */
|
|
562
|
+
const COMBO_GAP_MS = 10_000;
|
|
563
|
+
/** Streak at which the combo badge shows. */
|
|
564
|
+
const COMBO_SHOW_AT = 2;
|
|
565
|
+
/** The tps estimate stays fresh this long after the last chunk. */
|
|
566
|
+
const TPS_WINDOW_MS = 3500;
|
|
567
|
+
/** Render tick cadence (matches the TUI's 500ms activity timer). */
|
|
568
|
+
const TICK_MS = 500;
|
|
569
|
+
/** Ellipsis breathing frames appended to thinking lines (pi parity). */
|
|
570
|
+
const DOT_FRAMES = ['', ' ·', ' ··', ' ···', ' ··', ' ·'];
|
|
409
571
|
/** Cap on replayed done cards; older entries drop. */
|
|
410
572
|
const DONE_QUEUE_MAX = 6;
|
|
411
573
|
/** Show the last tool's fragment in the done line for this long after it ends. */
|
|
@@ -433,6 +595,14 @@ function fmtTokens(tokens) {
|
|
|
433
595
|
return `${(tokens / 1000).toFixed(1)}k`;
|
|
434
596
|
return String(tokens);
|
|
435
597
|
}
|
|
598
|
+
/** Coarse streaming token estimate (pi parity: CJK ×1.5, others ÷4). */
|
|
599
|
+
function estimateTokens(text) {
|
|
600
|
+
const compact = text.replace(/\s/g, '');
|
|
601
|
+
if (compact.length === 0)
|
|
602
|
+
return 0;
|
|
603
|
+
const cjkCount = (compact.match(/[\u3400-\u9fff]/g) ?? []).length;
|
|
604
|
+
return Math.max(1, Math.ceil(cjkCount * 1.5 + (compact.length - cjkCount) / 4));
|
|
605
|
+
}
|
|
436
606
|
/** Parse a tool call's raw arguments JSON defensively. */
|
|
437
607
|
function parseArguments(raw) {
|
|
438
608
|
if (raw.trim().length === 0)
|
package/package.json
CHANGED
|
@@ -1,119 +1,127 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-working-activity",
|
|
3
|
-
"description": "Live model working-status line: playful copy, running tool, turn elapsed — for TUI prompt and Web UI",
|
|
4
|
-
"version": "0.3.
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "lib/types/index.js",
|
|
7
|
-
"types": "lib/types/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"types": "./lib/types/index.d.ts",
|
|
11
|
-
"default": "./lib/types/index.js"
|
|
12
|
-
},
|
|
13
|
-
"./client": {
|
|
14
|
-
"types": "./lib/types/client/index.d.ts",
|
|
15
|
-
"default": "./lib/client.js"
|
|
16
|
-
},
|
|
17
|
-
"./
|
|
18
|
-
"types": "./lib/types/
|
|
19
|
-
"default": "./lib/types/
|
|
20
|
-
},
|
|
21
|
-
"./
|
|
22
|
-
"types": "./lib/types/
|
|
23
|
-
"default": "./lib/types/
|
|
24
|
-
},
|
|
25
|
-
"./
|
|
26
|
-
"types": "./lib/types/
|
|
27
|
-
"default": "./lib/types/
|
|
28
|
-
},
|
|
29
|
-
"./
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"
|
|
40
|
-
},
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
},
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"
|
|
56
|
-
},
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
"@deepseek-ai/
|
|
81
|
-
"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"@deepseek-ai/
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
"@deepseek-ai/dsh-
|
|
88
|
-
"@deepseek-ai/
|
|
89
|
-
"
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
"@deepseek-ai/
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/dsh-
|
|
95
|
-
"@deepseek-ai/dsh-
|
|
96
|
-
"@deepseek-ai/
|
|
97
|
-
"@
|
|
98
|
-
"@
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
"@
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
"
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-working-activity",
|
|
3
|
+
"description": "Live model working-status line: playful copy, running tool, turn elapsed — for TUI prompt and Web UI",
|
|
4
|
+
"version": "0.3.2",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/types/index.js",
|
|
7
|
+
"types": "lib/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"default": "./lib/types/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./client": {
|
|
14
|
+
"types": "./lib/types/client/index.d.ts",
|
|
15
|
+
"default": "./lib/client.js"
|
|
16
|
+
},
|
|
17
|
+
"./config": {
|
|
18
|
+
"types": "./lib/types/config.d.ts",
|
|
19
|
+
"default": "./lib/types/config.js"
|
|
20
|
+
},
|
|
21
|
+
"./events": {
|
|
22
|
+
"types": "./lib/types/events.d.ts",
|
|
23
|
+
"default": "./lib/types/events.js"
|
|
24
|
+
},
|
|
25
|
+
"./frames": {
|
|
26
|
+
"types": "./lib/types/frames.d.ts",
|
|
27
|
+
"default": "./lib/types/frames.js"
|
|
28
|
+
},
|
|
29
|
+
"./invariant": {
|
|
30
|
+
"types": "./lib/types/invariant.d.ts",
|
|
31
|
+
"default": "./lib/types/invariant.js"
|
|
32
|
+
},
|
|
33
|
+
"./status": {
|
|
34
|
+
"types": "./lib/types/status.d.ts",
|
|
35
|
+
"default": "./lib/types/status.js"
|
|
36
|
+
},
|
|
37
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
38
|
+
"./src/*": "./src/*",
|
|
39
|
+
"./package.json": "./package.json"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"lib",
|
|
43
|
+
"src",
|
|
44
|
+
"cordis.patch.yml"
|
|
45
|
+
],
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": "^22.19 || >=24"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -p tsconfig.json && tsc -p tsconfig.client.json",
|
|
51
|
+
"build:client": "tsdown -c tsdown.config.ts",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"verify:deps": "node scripts/verify-manifest-deps.mjs",
|
|
54
|
+
"verify:lockfiles": "node scripts/verify-lockfiles.mjs",
|
|
55
|
+
"prepublishOnly": "npm run verify:deps && npm run verify:lockfiles && npm run build && npm run build:client"
|
|
56
|
+
},
|
|
57
|
+
"license": "BSD-3-Clause",
|
|
58
|
+
"repository": {
|
|
59
|
+
"type": "git",
|
|
60
|
+
"url": "git+https://github.com/ccch1mneyyy/working-activity.git"
|
|
61
|
+
},
|
|
62
|
+
"bugs": {
|
|
63
|
+
"url": "https://github.com/ccch1mneyyy/working-activity/issues"
|
|
64
|
+
},
|
|
65
|
+
"homepage": "https://github.com/ccch1mneyyy/working-activity#readme",
|
|
66
|
+
"dsh": {
|
|
67
|
+
"bundle": {
|
|
68
|
+
"patch": "./cordis.patch.yml"
|
|
69
|
+
},
|
|
70
|
+
"client": {
|
|
71
|
+
"platform": "web",
|
|
72
|
+
"inject": [
|
|
73
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
74
|
+
"@deepseek-ai/dsh-client-ui-conversation",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-slots"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"peerDependencies": {
|
|
80
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
81
|
+
"@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
|
|
82
|
+
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6",
|
|
83
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.6",
|
|
84
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6",
|
|
85
|
+
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
|
|
86
|
+
"@deepseek-ai/dsh-session": "^0.1.0-rc.6",
|
|
87
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
|
|
88
|
+
"@deepseek-ai/schemastery": "^3.18.1",
|
|
89
|
+
"react": "^18.2.0"
|
|
90
|
+
},
|
|
91
|
+
"devDependencies": {
|
|
92
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
93
|
+
"@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
|
|
94
|
+
"@deepseek-ai/dsh-agent-loop": "^0.1.0-rc.6",
|
|
95
|
+
"@deepseek-ai/dsh-agent-loop-testkit": "^0.1.0-rc.6",
|
|
96
|
+
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6",
|
|
97
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.6",
|
|
98
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6",
|
|
99
|
+
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
|
|
100
|
+
"@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
|
|
101
|
+
"@deepseek-ai/dsh-session": "^0.1.0-rc.6",
|
|
102
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
|
|
103
|
+
"@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
|
|
104
|
+
"@deepseek-ai/schemastery": "^3.18.1",
|
|
105
|
+
"@types/node": "^22.0.0",
|
|
106
|
+
"@types/react": "~18.3.1",
|
|
107
|
+
"lightningcss": "^1.32.0",
|
|
108
|
+
"react": "^18.2.0",
|
|
109
|
+
"tsdown": "^0.22.2",
|
|
110
|
+
"typescript": "^6.0.3",
|
|
111
|
+
"vitest": "^3.2.4"
|
|
112
|
+
},
|
|
113
|
+
"peerDependenciesMeta": {
|
|
114
|
+
"@deepseek-ai/dsh-client-runtime": {
|
|
115
|
+
"optional": true
|
|
116
|
+
},
|
|
117
|
+
"@deepseek-ai/dsh-client-ui-conversation": {
|
|
118
|
+
"optional": true
|
|
119
|
+
},
|
|
120
|
+
"@deepseek-ai/dsh-client-ui-slots": {
|
|
121
|
+
"optional": true
|
|
122
|
+
},
|
|
123
|
+
"react": {
|
|
124
|
+
"optional": true
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|