dsh-working-activity 0.1.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/README.i18n.yaml +6 -0
- package/README.md +109 -0
- package/README.zh.md +111 -0
- package/lib/types/events.d.ts +42 -0
- package/lib/types/events.d.ts.map +1 -0
- package/lib/types/events.js +9 -0
- package/lib/types/index.d.ts +61 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +151 -0
- package/lib/types/invariant.d.ts +16 -0
- package/lib/types/invariant.d.ts.map +1 -0
- package/lib/types/invariant.js +61 -0
- package/lib/types/phrases.d.ts +55 -0
- package/lib/types/phrases.d.ts.map +1 -0
- package/lib/types/phrases.js +163 -0
- package/lib/types/status.d.ts +110 -0
- package/lib/types/status.d.ts.map +1 -0
- package/lib/types/status.js +440 -0
- package/package.json +61 -0
- package/src/events.ts +45 -0
- package/src/index.ts +211 -0
- package/src/invariant.ts +69 -0
- package/src/phrases.ts +180 -0
- package/src/status.ts +501 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy pools for the working-activity status line: short, colloquial, playful
|
|
3
|
+
* Chinese fragments with deadpan English one-liners mixed in, matching the
|
|
4
|
+
* pi-working-activity tone. Everything here is pure data + pure pickers.
|
|
5
|
+
* @module @deepseek-ai/dsh-working-activity/phrases
|
|
6
|
+
*/
|
|
7
|
+
/** Pick one random entry; repeated draws avoid the previous entry when possible. */
|
|
8
|
+
export function pickPhrase(entries, previous) {
|
|
9
|
+
if (entries.length === 0)
|
|
10
|
+
throw new Error('pickPhrase() requires a non-empty pool');
|
|
11
|
+
if (entries.length === 1)
|
|
12
|
+
return entries[0];
|
|
13
|
+
let next = entries[Math.floor(Math.random() * entries.length)];
|
|
14
|
+
let guard = 0;
|
|
15
|
+
while (next === previous && guard++ < 8) {
|
|
16
|
+
next = entries[Math.floor(Math.random() * entries.length)];
|
|
17
|
+
}
|
|
18
|
+
return next;
|
|
19
|
+
}
|
|
20
|
+
/** Thinking phrases while the model works without a tool. */
|
|
21
|
+
export const THINKING_PHRASES = [
|
|
22
|
+
'嗯…让我捋捋', '盘一下盘一下', '大脑转起来了', '思考.gif', '给我一秒', '脑子在冒烟',
|
|
23
|
+
'想呢想呢', '别催别催', '啾,让我想想', '让我琢磨下', '嗯…等一下哦', '正在盘逻辑',
|
|
24
|
+
'小脑瓜动一下', '嗯?哦…', '让我理理', '翻翻脑子', '回想中', '等一下下', '让我嗅嗅',
|
|
25
|
+
'脑内风暴中', '嗯…让我品品', '滴滴滴思考中', '稍等,在想', '盘明白了么', '挠头…',
|
|
26
|
+
'让子弹飞一会', '让我脑补一下', '加载中', '你说 我在听', '噢…是这样', '让我嚼一嚼',
|
|
27
|
+
'嗯…有点意思', '搓搓手想想', '等下,在想', '让我康康', '想好了告诉你', '脑子转圈圈',
|
|
28
|
+
'嗯…让我反应下', '等下下嘛', '思路加载中', '琢磨中', '嗯…让我拆一下', '盘,都可以盘',
|
|
29
|
+
'让我嗅探一下', '脑内跑火车', '嗯…让我缓一下', '滴滴,想呢', '思索.jpg', '嗯…有点东西',
|
|
30
|
+
'让我品', '小跑一下思路', '等下,有画面了', '让我咀嚼', '嗯…发会儿呆', '思考泡泡',
|
|
31
|
+
'脑电波传输中', '嗯…转转', '等下,盘好了', '让我回味', '滴滴滴', '思考的鱼',
|
|
32
|
+
'嗯…让我摸一下', '脑子在煮咖啡', '等下,我打个腹稿', '嗯…重启一下', '让我挠墙',
|
|
33
|
+
'嗯,来了来了', '脑子冒泡泡', '嗯…有点烫', '思考猫猫', '让我咕噜一下', '嗯…盘它',
|
|
34
|
+
'等下,我闪个思路', '脑子在蹦迪', '嗯…', '让我想想', '盘一下', '啾', 'lol', 'hm', 'oh',
|
|
35
|
+
'ok', 'um', 'heh', 'uh', 'nah', 'mm', 'wow', 'nice', 'rgrg', 'okk', 'hhh', 'emm', 'emmm',
|
|
36
|
+
'CPU烧了', '让我打个log看看', '先跑一下试试', '定位一下', '排查一下', '看看日志',
|
|
37
|
+
'loading 99%', '让我捋一下逻辑',
|
|
38
|
+
];
|
|
39
|
+
/** Tiered phrases when thinking runs long (elapsed >= threshold). */
|
|
40
|
+
export const THINKING_TIERS = [
|
|
41
|
+
{ atMs: 30_000, pool: ['嗯,让我细想想', '30秒了,还在盘', '等下,快好了', '别急,就快出结果了', '让我再捋一捋', '嗯…思路没断', '30秒,快了', '等等,有眉目了', '有点久…', '转圈圈…', '马上马上', '快了快了', '别走,就快好了', '在盘了呢', '还在定位', '快复现了'] },
|
|
42
|
+
{ atMs: 60_000, pool: ['1分钟,还在想', '这题有点东西', '让我再钻研下', '嗯…问题不简单', '1分钟,别走开', '盘得有点深', '脑细胞在燃烧', '等等,快盘清了', '还在努力…', '这个有点绕…', '烧脑中…', '别走,快了', '一分钟了,再等等', '这题值得盘', '还在排查', '这个有点复杂'] },
|
|
43
|
+
{ atMs: 300_000, pool: ['5分钟,大工程', '这把我得认真', '确实有点绕', '等等,我在修仙', '快好了,真的', '盘了一大圈', '别慌,在收尾', '给我一首歌的时间', '还没放弃…', '这题真的硬…', '我给跪了…', '憋大招中', '5分钟了,等值了', '快了,真快了', '这个需求很简单', '能跑就别动'] },
|
|
44
|
+
];
|
|
45
|
+
/** Phrases shown while waiting for the first streamed token. */
|
|
46
|
+
export const WAITING_PHRASES = [
|
|
47
|
+
'呼叫模型…', '模型在路上了', '等它开口…', '稍等,它有点慢', '模型加载中', '嗯…等它一下',
|
|
48
|
+
'它在组织语言', '等等我嘛', '模型醒了么', '等它伸懒腰', '它打了个哈欠', '模型:来了来了',
|
|
49
|
+
'等它出字', '别急,在等', '它磨蹭呢', '模型说等一下', '等它滴一声', '模型在咕噜',
|
|
50
|
+
'等它反应过来', '嗯…等它', '模型在喝水', '它说再等一下', '等它喘口气', '模型:快了快了',
|
|
51
|
+
'别急别急', '来了来了', '等它跑完', '还在排队', '马上出结果', '等它热身', '模型在酝酿',
|
|
52
|
+
'它翻了个身', '模型:马上', '等它开机', '它卡了一下', '模型在冥想', '等它眨个眼',
|
|
53
|
+
'它说稍等', '模型在查资料', '等它缓一缓', '模型在数数', '等它回神', '它终于动了',
|
|
54
|
+
];
|
|
55
|
+
/** Tool-name patterns mapped to playful action verbs. */
|
|
56
|
+
export const ACTION_MAP = [
|
|
57
|
+
{ test: /^(read|read_file|cat)$/i, actions: ['翻翻文档', '让我康康', '读一下', '看一眼', '翻阅中', '读读看', '翻翻', '看看', '瞄一眼', '康康', '翻一页'] },
|
|
58
|
+
{ test: /^(write|write_file|create_file)$/i, actions: ['写写写', '下笔中', '码字呢', '写一段', '记录一下', '写一下', '记下来', '落笔', '开写', '存个文件'] },
|
|
59
|
+
{ test: /^(edit|edit_file|str_replace|apply_patch|search_replace)$/i, actions: ['改改', '修修补补', '润色一下', '编辑中', '调整调整', '改一改', '修一下', '改两行', '调一下', '补一刀'] },
|
|
60
|
+
{ test: /^(bash|shell|run|exec|powershell|cmd)$/i, actions: ['跑个命令', 'bash一下', '敲敲指令', '命令行走起', '执行一下', '敲回车', '跑一下', '敲个命令', '跑命令', '使唤终端'] },
|
|
61
|
+
{ test: /^(grep|rg|search|search_in_files)$/i, actions: ['搜搜东西', 'grep 一下', '找找匹配', '关键词走你', '过滤中', '搜搜看', '搜一下', '找找', '扫一眼', '挖一挖'] },
|
|
62
|
+
{ test: /^(find|glob)$/i, actions: ['找找文件', '找一下', '寻宝中', '找啊找', '文件在哪', '查找中', '搜搜目录'] },
|
|
63
|
+
{ test: /^(ls|list_dir|list)$/i, actions: ['列个清单', '看看目录', 'ls 看一眼', '瞄一下文件', '目录走起', '列出来', '列一下', '瞟一眼', '翻翻'] },
|
|
64
|
+
{ test: /^(web_search|search_web|brave|tavily|exa)$/i, actions: ['网上搜搜', '搜一下', '网络冲浪', '查找资料', '上网瞄瞄', '上网搜搜', '查查', '搜一圈', '打听一下'] },
|
|
65
|
+
{ test: /^(web_fetch|fetch|fetch_content)$/i, actions: ['抓个页面', '拉取一下', 'fetch 中', '扒拉网页', '取点内容', '抓取资料', '扒一下', '打开看看'] },
|
|
66
|
+
{ test: /^(mcp)/i, actions: ['mcp 连一下', '调个服务', '接个工具', 'mcp 走你', '调接口', '连一下', '喊外援', '接一下'] },
|
|
67
|
+
{ test: /^(subagent|agent|task)$/i, actions: ['派个小弟', '小助手出动', '支个 agent', '让小弟跑腿', '代理干活', '子任务起飞', '分个任务', '交给小弟', '派出去'] },
|
|
68
|
+
{ test: /^(todo|manage_todo_list)$/i, actions: ['列个待办', '写个清单', 'todo 安排', '记一下', '待办走起', '清单一下', '记个待办', '打个勾'] },
|
|
69
|
+
{ test: /^(browser|chrome|playwright)/i, actions: ['开个浏览器', '浏览器跑腿', '网页操作', '浏览器干活', '开网页', '点点页面'] },
|
|
70
|
+
{ test: /^(git|gh|github)/i, actions: ['git 操作', '提交一下', '版本控制', 'git 走你', '提交代码', '管个仓库', 'git 一下'] },
|
|
71
|
+
{ test: /^(ask_user_question|ask)$/i, actions: ['提问中', '问一个问题', 'ask 一下', '请教一下', '问问看', '问你个事', '确认一下'] },
|
|
72
|
+
{ test: /^(goal_complete|goal_blocked)$/i, actions: ['定个目标', '设定目标', 'goal 设置', '目标走起', '规划一下', '更新进度'] },
|
|
73
|
+
{ test: /^(todo_write)$/i, actions: ['记个待办', '划个清单', '打个勾'] },
|
|
74
|
+
];
|
|
75
|
+
/** Fallback verbs for unknown tools. */
|
|
76
|
+
export const FALLBACK_ACTIONS = ['干活', '调用', '整一下', '搞一下', '动动手', '备选方案', '换条路'];
|
|
77
|
+
/** Tool failure phrases, replacing a bare ✗. */
|
|
78
|
+
export const FAIL_PHRASES = [
|
|
79
|
+
'翻车了', '哎呀', '掉了', '没跑通', '摔了一跤', '再来一次', '这不对', '出岔子了', '不灵了',
|
|
80
|
+
'坏消息', '权限不对?', '连不上?', '404了', '不太对', '有点问题', '再看看', '没接住', '漏了',
|
|
81
|
+
'我本地能跑啊', '昨天还能跑', '重启试试', '清一下缓存', '删了重装', '你刷新一下', '环境问题',
|
|
82
|
+
'少了个分号', '拼错了', '没保存', '又不是不能用', '绷不住了', '难绷', '卒', '裂开',
|
|
83
|
+
'血压上来了', '缓存害我', '再给我一次机会', '这波大意了', '手滑', '回滚重来', '换个姿势',
|
|
84
|
+
];
|
|
85
|
+
/** Turn-completion phrases. */
|
|
86
|
+
export const DONE_PHRASES = [
|
|
87
|
+
'交差!', '搞定,下一个', '好了,收工', '完成啦', '交作业', '结束,完美', '完工咯', '搞定啦',
|
|
88
|
+
'任务完成', '好了,歇会儿', '搞定', '收工', '妥了', '完事', '交差', '齐活', '拿下', '收工!',
|
|
89
|
+
'搞定收工', '收!', '完事!', '下一题', '能跑!', '没报错', '过了', '上线!', '稳了', '6',
|
|
90
|
+
'完工!', '完美收场', '这波不亏', '一次过', '收工摸鱼', '漂亮', '全绿', '干净利落',
|
|
91
|
+
'手到擒来', '水到渠成', '下班!', '歇口气', '交接完成', '工单关闭', '收尾完毕',
|
|
92
|
+
];
|
|
93
|
+
/** Night-owl phrases mixed in between 00:00 and 06:00 local time. */
|
|
94
|
+
export const NIGHT_PHRASES = [
|
|
95
|
+
'修仙中…', '深夜冒泡', '你也是夜猫子呀', '月亮不睡我不睡', '夜里脑子慢,谅解', '晚安?还早呢',
|
|
96
|
+
'深夜盘东西', '熬夜冠军上线', '困了,但能行', '过了零点照样肝', '夜猫子出没', '深夜档营业',
|
|
97
|
+
'星星都睡了', '凌晨还在盘', '深夜上线', '凌晨部署', '通宵了',
|
|
98
|
+
];
|
|
99
|
+
/** Common git tool names / bash commands containing `git `. */
|
|
100
|
+
export const GIT_TOOL_RE = /^(?:git|git_diff|git_commit|git_push|git_pull|git_checkout|git_branch|git_merge|git_rebase|github|gh)$/i;
|
|
101
|
+
/** Detect the 00:00–06:00 night window (local time). */
|
|
102
|
+
export function isNight(hour) {
|
|
103
|
+
return hour >= 0 && hour < 6;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Pick a thinking phrase appropriate for the elapsed thinking time.
|
|
107
|
+
* @param elapsedMs - Milliseconds spent thinking in the current phase.
|
|
108
|
+
* @param previous - Previously shown phrase, to avoid repeats.
|
|
109
|
+
* @param night - Mix night-owl copy into the pool.
|
|
110
|
+
*/
|
|
111
|
+
export function thinkingPhrase(elapsedMs, previous, night = false) {
|
|
112
|
+
let pool = THINKING_PHRASES;
|
|
113
|
+
for (const tier of THINKING_TIERS) {
|
|
114
|
+
if (elapsedMs >= tier.atMs) {
|
|
115
|
+
pool = tier.pool;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (night && pool === THINKING_PHRASES) {
|
|
120
|
+
return pickPhrase([...pool, ...NIGHT_PHRASES], previous);
|
|
121
|
+
}
|
|
122
|
+
return pickPhrase(pool, previous);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Map a tool name to a playful action verb.
|
|
126
|
+
* @param toolName - Registry tool name (unqualified).
|
|
127
|
+
* @param custom - Exact-name custom action pools, matched case-insensitively.
|
|
128
|
+
*/
|
|
129
|
+
export function actionFor(toolName, custom) {
|
|
130
|
+
const normalized = toolName.trim().toLowerCase();
|
|
131
|
+
const customPool = custom?.[normalized];
|
|
132
|
+
if (customPool !== undefined && customPool.length > 0)
|
|
133
|
+
return pickPhrase(customPool);
|
|
134
|
+
for (const { test, actions } of ACTION_MAP) {
|
|
135
|
+
if (test.test(normalized))
|
|
136
|
+
return pickPhrase(actions);
|
|
137
|
+
}
|
|
138
|
+
return pickPhrase(FALLBACK_ACTIONS);
|
|
139
|
+
}
|
|
140
|
+
/** Whether a tool is a git operation (name match, or a shell command containing `git `). */
|
|
141
|
+
export function isGitTool(toolName, args) {
|
|
142
|
+
if (GIT_TOOL_RE.test(toolName.trim()))
|
|
143
|
+
return true;
|
|
144
|
+
if (/^(?:bash|shell|cmd|powershell|pwsh)$/i.test(toolName.trim())) {
|
|
145
|
+
const command = args?.command ?? args?.cmdline;
|
|
146
|
+
return typeof command === 'string' && /\bgit\s+/.test(command);
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
/** Format milliseconds as a compact human duration (`1m23s`). */
|
|
151
|
+
export function fmtDuration(ms) {
|
|
152
|
+
if (ms < 1000)
|
|
153
|
+
return '0s';
|
|
154
|
+
const total = Math.floor(ms / 1000);
|
|
155
|
+
if (total < 60)
|
|
156
|
+
return `${total}s`;
|
|
157
|
+
const minutes = Math.floor(total / 60);
|
|
158
|
+
const seconds = total % 60;
|
|
159
|
+
if (minutes < 60)
|
|
160
|
+
return `${minutes}m${seconds}s`;
|
|
161
|
+
const hours = Math.floor(minutes / 60);
|
|
162
|
+
return `${hours}h${minutes % 60}m`;
|
|
163
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure activity state machine for the working-activity status line. Consumes
|
|
3
|
+
* session events (turn/step/tool/stream) plus agent running/idle transitions
|
|
4
|
+
* and renders a human-readable status line at any wall-clock instant. No I/O,
|
|
5
|
+
* no timers, no cordis — deterministic given the event stream and a clock.
|
|
6
|
+
* @module @deepseek-ai/dsh-working-activity/status
|
|
7
|
+
*/
|
|
8
|
+
import type { SessionEvent } from '@deepseek-ai/dsh-session';
|
|
9
|
+
/** Public status phases a UI can render. */
|
|
10
|
+
export type ActivityPhase = 'idle' | 'waiting' | 'thinking' | 'tool' | 'done';
|
|
11
|
+
/** One snapshot of the model's activity, renderable by any UI. */
|
|
12
|
+
export interface ActivityState {
|
|
13
|
+
/** Which activity phase the model is in right now. */
|
|
14
|
+
readonly phase: ActivityPhase;
|
|
15
|
+
/** Full human-readable status line (plain text, no ANSI). */
|
|
16
|
+
readonly line: string;
|
|
17
|
+
/** Short label of the current work (tool action or stage), when any. */
|
|
18
|
+
readonly label?: string;
|
|
19
|
+
/** Detail fragment (path / command / search pattern), when any. */
|
|
20
|
+
readonly detail?: string;
|
|
21
|
+
/** The playful phrase currently shown. */
|
|
22
|
+
readonly phrase?: string;
|
|
23
|
+
/** Tools completed in the current turn. */
|
|
24
|
+
readonly toolCount: number;
|
|
25
|
+
/** Wall-clock milliseconds since the current turn started (0 when idle). */
|
|
26
|
+
readonly turnElapsedMs: number;
|
|
27
|
+
/** Wall-clock time the current phase started, for animations. */
|
|
28
|
+
readonly phaseStartedAt: number;
|
|
29
|
+
}
|
|
30
|
+
/** Per-turn thinking/tooling split, exposed for done summaries and stats. */
|
|
31
|
+
export interface TurnStats {
|
|
32
|
+
/** Milliseconds the model was thinking (between turn start and first tool / turn end). */
|
|
33
|
+
readonly thinkingMs: number;
|
|
34
|
+
/** Milliseconds spent inside tool executions. */
|
|
35
|
+
readonly toolMs: number;
|
|
36
|
+
/** Tools completed in the turn. */
|
|
37
|
+
readonly toolCount: number;
|
|
38
|
+
}
|
|
39
|
+
/** Configuration knobs for the state machine (subset of plugin Config). */
|
|
40
|
+
export interface TrackerConfig {
|
|
41
|
+
/** Playful copy pool on/off; false renders plain functional labels. */
|
|
42
|
+
readonly phrases: boolean;
|
|
43
|
+
/** Maximum characters of a detail fragment (paths/commands). */
|
|
44
|
+
readonly detailLimit: number;
|
|
45
|
+
/** Hide the status line while idle. */
|
|
46
|
+
readonly showIdle: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extract a displayable detail fragment from a tool call's parsed arguments.
|
|
50
|
+
* @param toolName - Registry tool name.
|
|
51
|
+
* @param args - Parsed tool arguments (lossless JSON by registry contract).
|
|
52
|
+
*/
|
|
53
|
+
export declare function detailFor(toolName: string, args: Readonly<Record<string, unknown>> | undefined, limit: number): string;
|
|
54
|
+
/**
|
|
55
|
+
* Track one agent's activity from its durable session events. Events from
|
|
56
|
+
* other sessions are ignored (the owning plugin feeds only the agent it
|
|
57
|
+
* displays). The tracker is deliberately single-agent: multi-session UIs
|
|
58
|
+
* instantiate one tracker per agent.
|
|
59
|
+
*/
|
|
60
|
+
export declare class ActivityTracker {
|
|
61
|
+
private readonly config;
|
|
62
|
+
private readonly now;
|
|
63
|
+
private readonly customActions?;
|
|
64
|
+
private phase;
|
|
65
|
+
private phaseStartedAt;
|
|
66
|
+
private turnStartedAt;
|
|
67
|
+
private thinkingStartedAt;
|
|
68
|
+
private thinkingMs;
|
|
69
|
+
private toolMs;
|
|
70
|
+
private toolCount;
|
|
71
|
+
private activeTools;
|
|
72
|
+
private doneQueue;
|
|
73
|
+
private previousPhrase;
|
|
74
|
+
private phraseChangedAt;
|
|
75
|
+
private waitingFirstToken;
|
|
76
|
+
/** Latest `⏵` self-narration line extracted from the stream, or null. */
|
|
77
|
+
private narratedText;
|
|
78
|
+
/** Wall-clock time of the most recent stream delta (narration freshness). */
|
|
79
|
+
private lastChunkAt;
|
|
80
|
+
/** Rolling stream buffer (reasoning + text deltas) for `⏵` extraction. */
|
|
81
|
+
private recentStream;
|
|
82
|
+
/** Total tokens reported across the turn's assistant messages. */
|
|
83
|
+
private turnTokens;
|
|
84
|
+
/** Completion prefix drawn ONCE at turn end so the done line stays stable. */
|
|
85
|
+
private donePrefix;
|
|
86
|
+
/**
|
|
87
|
+
* @param config - Behavioral knobs.
|
|
88
|
+
* @param now - Wall-clock supplier (injectable for tests).
|
|
89
|
+
* @param customActions - Exact-name custom action pools for {@link actionFor}.
|
|
90
|
+
*/
|
|
91
|
+
constructor(config: TrackerConfig, now?: () => number, customActions?: Readonly<Record<string, readonly string[]>> | undefined);
|
|
92
|
+
/** Agent transitioned to running/idle. */
|
|
93
|
+
onAgentStatus(status: 'idle' | 'running'): void;
|
|
94
|
+
/** Consume one durable session event (turn/step/tool/stream). */
|
|
95
|
+
onSessionEvent(event: SessionEvent): void;
|
|
96
|
+
/** Render the current status snapshot at a wall-clock instant. */
|
|
97
|
+
render(nowMs?: number): ActivityState;
|
|
98
|
+
/** Per-turn thinking/tooling split for stats consumers. */
|
|
99
|
+
stats(): TurnStats;
|
|
100
|
+
private renderThinking;
|
|
101
|
+
private doneSummary;
|
|
102
|
+
/** The fresh self-narration line, or null once the stream has been quiet. */
|
|
103
|
+
private freshNarration;
|
|
104
|
+
private primaryTool;
|
|
105
|
+
private turnElapsedMs;
|
|
106
|
+
private setPhase;
|
|
107
|
+
}
|
|
108
|
+
/** Extract the latest `⏵` self-narration line from a stream buffer. */
|
|
109
|
+
export declare function extractNarration(buffer: string): string | null;
|
|
110
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/status.ts"],"names":[],"mappings":"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"}
|