dsh-ssh-tui 0.8.1 → 0.8.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/CHANGELOG.md +158 -0
- package/README.en.md +118 -15
- package/README.md +78 -13
- package/docs/release-notes-0.7.4.md +91 -0
- package/docs/release-notes-0.8.0.md +56 -0
- package/docs/release-notes-0.8.1.md +79 -0
- package/docs/release-notes-0.8.2-rc.1.md +159 -0
- package/docs/release-notes-0.8.2.md +62 -0
- package/docs/screenshots/reconnect.gif +0 -0
- package/docs/terminals.md +23 -0
- package/docs/windows.md +13 -0
- package/lib/approval-state.js +148 -0
- package/lib/approval-state.js.map +1 -0
- package/lib/auth-failure.js +38 -0
- package/lib/auth-failure.js.map +1 -1
- package/lib/color-depth.js +26 -0
- package/lib/color-depth.js.map +1 -1
- package/lib/copy-text.js +30 -8
- package/lib/copy-text.js.map +1 -1
- package/lib/dialogs.js +81 -0
- package/lib/dialogs.js.map +1 -1
- package/lib/display-sock.js +138 -23
- package/lib/display-sock.js.map +1 -1
- package/lib/footer-accents.js +28 -0
- package/lib/footer-accents.js.map +1 -0
- package/lib/footer-budget.js +328 -0
- package/lib/footer-budget.js.map +1 -0
- package/lib/footer-format.js +433 -0
- package/lib/footer-format.js.map +1 -0
- package/lib/footer-layout.js +407 -0
- package/lib/footer-layout.js.map +1 -0
- package/lib/footer-meters.js +185 -0
- package/lib/footer-meters.js.map +1 -0
- package/lib/footer.js +19 -558
- package/lib/footer.js.map +1 -1
- package/lib/i18n/en.js +65 -5
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/zh.js +67 -5
- package/lib/i18n/zh.js.map +1 -1
- package/lib/paint.js +53 -8
- package/lib/paint.js.map +1 -1
- package/lib/plan-projection.js +291 -0
- package/lib/plan-projection.js.map +1 -0
- package/lib/plan.js +50 -0
- package/lib/plan.js.map +1 -1
- package/lib/question-state.js +83 -0
- package/lib/question-state.js.map +1 -0
- package/lib/representation.js +283 -0
- package/lib/representation.js.map +1 -0
- package/lib/screen.js +105 -0
- package/lib/screen.js.map +1 -0
- package/lib/selection.js +5 -3
- package/lib/selection.js.map +1 -1
- package/lib/startup.js +49 -0
- package/lib/startup.js.map +1 -1
- package/lib/stats.js +101 -3
- package/lib/stats.js.map +1 -1
- package/lib/term-text.js +154 -55
- package/lib/term-text.js.map +1 -1
- package/lib/theme.js +20 -3
- package/lib/theme.js.map +1 -1
- package/lib/throughput.js +305 -0
- package/lib/throughput.js.map +1 -0
- package/lib/tool-present.js +57 -7
- package/lib/tool-present.js.map +1 -1
- package/lib/tui.js +3776 -1105
- package/lib/tui.js.map +1 -1
- package/lib/types/approval-state.d.ts +75 -0
- package/lib/types/auth-failure.d.ts +25 -0
- package/lib/types/color-depth.d.ts +21 -0
- package/lib/types/copy-text.d.ts +18 -1
- package/lib/types/dialogs.d.ts +111 -1
- package/lib/types/display-sock.d.ts +15 -0
- package/lib/types/footer-accents.d.ts +22 -0
- package/lib/types/footer-budget.d.ts +204 -0
- package/lib/types/footer-format.d.ts +221 -0
- package/lib/types/footer-layout.d.ts +292 -0
- package/lib/types/footer-meters.d.ts +151 -0
- package/lib/types/footer.d.ts +19 -269
- package/lib/types/paint.d.ts +48 -0
- package/lib/types/plan-projection.d.ts +162 -0
- package/lib/types/plan.d.ts +13 -0
- package/lib/types/question-state.d.ts +96 -0
- package/lib/types/representation.d.ts +498 -0
- package/lib/types/screen.d.ts +126 -0
- package/lib/types/startup.d.ts +24 -0
- package/lib/types/stats.d.ts +64 -1
- package/lib/types/term-text.d.ts +45 -1
- package/lib/types/throughput.d.ts +163 -0
- package/lib/types/tool-present.d.ts +41 -0
- package/lib/types/transcript-types.d.ts +63 -2
- package/lib/types/tui.d.ts +862 -11
- package/package.json +16 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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"}
|
package/lib/selection.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* selection that touches either half includes the whole glyph. Surrogate pairs
|
|
19
19
|
* (emoji) are treated the same way.
|
|
20
20
|
*/
|
|
21
|
-
import { displayWidth } from './term-text.js';
|
|
21
|
+
import { ambiguousPolicy, charCellWidth, displayWidth } from './term-text.js';
|
|
22
22
|
/**
|
|
23
23
|
* Characters at the start of a line that cover its gutter.
|
|
24
24
|
*
|
|
@@ -85,6 +85,7 @@ function lineWidth(text) {
|
|
|
85
85
|
export function offsetAtColumn(text, column) {
|
|
86
86
|
if (column <= 0)
|
|
87
87
|
return 0;
|
|
88
|
+
const policy = ambiguousPolicy();
|
|
88
89
|
let used = 0;
|
|
89
90
|
let index = 0;
|
|
90
91
|
while (index < text.length) {
|
|
@@ -92,7 +93,7 @@ export function offsetAtColumn(text, column) {
|
|
|
92
93
|
if (cp === undefined)
|
|
93
94
|
break;
|
|
94
95
|
const char = String.fromCodePoint(cp);
|
|
95
|
-
const width =
|
|
96
|
+
const width = charCellWidth(cp, policy);
|
|
96
97
|
if (used + width > column)
|
|
97
98
|
return index;
|
|
98
99
|
used += width;
|
|
@@ -110,6 +111,7 @@ export function offsetAtColumn(text, column) {
|
|
|
110
111
|
export function offsetAfterColumn(text, column) {
|
|
111
112
|
if (column <= 0)
|
|
112
113
|
return 0;
|
|
114
|
+
const policy = ambiguousPolicy();
|
|
113
115
|
let used = 0;
|
|
114
116
|
let index = 0;
|
|
115
117
|
while (index < text.length) {
|
|
@@ -117,7 +119,7 @@ export function offsetAfterColumn(text, column) {
|
|
|
117
119
|
if (cp === undefined)
|
|
118
120
|
break;
|
|
119
121
|
const char = String.fromCodePoint(cp);
|
|
120
|
-
const width =
|
|
122
|
+
const width = charCellWidth(cp, policy);
|
|
121
123
|
// A boundary exactly at a glyph's first cell excludes that glyph; only a
|
|
122
124
|
// boundary strictly inside one (a wide glyph's second cell) includes it.
|
|
123
125
|
if (used === column)
|
package/lib/selection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"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"}
|
package/lib/startup.js
CHANGED
|
@@ -11,12 +11,56 @@ import { CONFIGURED_AGENT_IDENTITIES_KEY } from '@deepseek-ai/dsh-agent-loop';
|
|
|
11
11
|
import { SessionId } from '@deepseek-ai/dsh-session';
|
|
12
12
|
import { detachFromSshSession } from './display-sock.js';
|
|
13
13
|
import { parseDisplayMode } from './display-mode.js';
|
|
14
|
+
import { desktopLauncher } from './platform.js';
|
|
14
15
|
/** Service key under which the parsed TUI launch options are provided. */
|
|
15
16
|
export const SSH_TUI_STARTUP_SERVICE = 'sshTuiStartup';
|
|
16
17
|
/** Config `id` of the agent-loop entry the TUI drives. */
|
|
17
18
|
export const MAIN_AGENT_ID = 'main';
|
|
18
19
|
export const name = 'ssh-tui-startup';
|
|
19
20
|
export const inject = ['cmdlineArgs'];
|
|
21
|
+
/**
|
|
22
|
+
* Whether another application already owns this profile's command line.
|
|
23
|
+
*
|
|
24
|
+
* `@deepseek-ai/dsh-cmdline` has **no arbitration between apps**: every app plugin is
|
|
25
|
+
* handed the same argv and parses it with its own grammar, and an unknown flag is
|
|
26
|
+
* `program.error`, which exits the process. A profile that hosts two apps therefore
|
|
27
|
+
* requires the second one to understand the first one's flags — and the desktop
|
|
28
|
+
* application passes `--no-open` (the web app's own flag) to its host, so this row's
|
|
29
|
+
* grammar rejected it: the host exited 1, the application reported
|
|
30
|
+
* `dsh desktop host exited with 1: error: unknown option '--no-open'` and died. Only
|
|
31
|
+
* the *startup* row did that; the TUI row never ran, which is why 0.8.1's inert-when-
|
|
32
|
+
* headless fix could not have caught it.
|
|
33
|
+
*
|
|
34
|
+
* The signals are two, and they overlap on purpose:
|
|
35
|
+
*
|
|
36
|
+
* - the launcher facts (`desktopLauncher`): an Electron host, `DeepSeek Harness.exe`,
|
|
37
|
+
* or `app.asar` in argv — true whatever the profile's row order is;
|
|
38
|
+
* - `webStartup`: the web app provides it as soon as it has parsed, and a `web`
|
|
39
|
+
* profile is not a terminal profile in any case.
|
|
40
|
+
*
|
|
41
|
+
* Stepping aside is not a degraded mode: the TUI row `inject`s `sshTuiStartup`, so
|
|
42
|
+
* nothing of this plugin activates and the host keeps its own grammar and its own app.
|
|
43
|
+
*/
|
|
44
|
+
export function anotherAppOwnsCommandLine(ctx) {
|
|
45
|
+
if (desktopLauncher({
|
|
46
|
+
electron: process.versions.electron,
|
|
47
|
+
execPath: process.execPath,
|
|
48
|
+
argv: process.argv,
|
|
49
|
+
}))
|
|
50
|
+
return true;
|
|
51
|
+
return ctx.get('webStartup') !== undefined;
|
|
52
|
+
}
|
|
53
|
+
/** One line, the way the plugin's other inert paths report themselves. */
|
|
54
|
+
function sayInactive(ctx) {
|
|
55
|
+
const line = 'not enabled here: this profile\'s command line belongs to another app '
|
|
56
|
+
+ '(the desktop or web host), so the TUI leaves the arguments alone';
|
|
57
|
+
const logger = ctx.logger;
|
|
58
|
+
const named = typeof logger === 'function' ? logger('ssh-tui') : undefined;
|
|
59
|
+
if (typeof named?.info === 'function')
|
|
60
|
+
named.info(line);
|
|
61
|
+
else
|
|
62
|
+
process.stderr.write(`dsh-ssh-tui: ${line}\n`);
|
|
63
|
+
}
|
|
20
64
|
/**
|
|
21
65
|
* Build the TUI command grammar and provide the session identity for the
|
|
22
66
|
* agent-loop row plus the {@link SshTuiStartup} service. On `--help` or a
|
|
@@ -24,6 +68,11 @@ export const inject = ['cmdlineArgs'];
|
|
|
24
68
|
* process exits through the cmdline exit seam.
|
|
25
69
|
*/
|
|
26
70
|
export function apply(ctx) {
|
|
71
|
+
// Never claim a command line that is not ours to claim — see the function below.
|
|
72
|
+
if (anotherAppOwnsCommandLine(ctx)) {
|
|
73
|
+
sayInactive(ctx);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
27
76
|
const program = new Command()
|
|
28
77
|
.name('dsh --profile tui')
|
|
29
78
|
.description('SSH-friendly interactive terminal session over DeepSeek Harness')
|
package/lib/startup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAA;AAE7E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAoB,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
|
package/lib/stats.js
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
|
+
import { ThroughputTracker, } from './throughput.js';
|
|
2
|
+
/**
|
|
3
|
+
* How many tokens this session has moved, on the accounting the harness
|
|
4
|
+
* published.
|
|
5
|
+
*
|
|
6
|
+
* The harness is the authority: a `totalTokens` it reports is a full-call total
|
|
7
|
+
* whose parts are defined provider by provider — pi-ai's own adapters build it
|
|
8
|
+
* as prompt + output + cache read + cache write — and re-deriving one from the
|
|
9
|
+
* three prompt counters plus output is exactly the arithmetic that
|
|
10
|
+
* double-counts on a provider that folds cache into its prompt count. So
|
|
11
|
+
* reported totals are summed, and only a step that reported none contributes
|
|
12
|
+
* its billed parts. The basis says which happened, and `/status` prints it.
|
|
13
|
+
*/
|
|
14
|
+
export function sessionTokenTotal(usage) {
|
|
15
|
+
if (usage.reportedSteps === 0 && usage.inputTokens === 0 && usage.outputTokens === 0)
|
|
16
|
+
return undefined;
|
|
17
|
+
const billed = usage.inputTokens + usage.cacheReadTokens + usage.cacheWriteTokens + usage.outputTokens;
|
|
18
|
+
if (usage.unreportedSteps === 0 && usage.reportedSteps > 0) {
|
|
19
|
+
return { tokens: usage.reportedTokens, basis: 'harness' };
|
|
20
|
+
}
|
|
21
|
+
if (usage.reportedSteps === 0)
|
|
22
|
+
return { tokens: billed, basis: 'sum' };
|
|
23
|
+
return { tokens: usage.reportedTokens + billed, basis: 'sum' };
|
|
24
|
+
}
|
|
1
25
|
export function emptySessionUsage() {
|
|
2
|
-
return {
|
|
26
|
+
return {
|
|
27
|
+
inputTokens: 0,
|
|
28
|
+
outputTokens: 0,
|
|
29
|
+
reportedTokens: 0,
|
|
30
|
+
reportedSteps: 0,
|
|
31
|
+
unreportedSteps: 0,
|
|
32
|
+
cacheReadTokens: 0,
|
|
33
|
+
cacheWriteTokens: 0,
|
|
34
|
+
};
|
|
3
35
|
}
|
|
4
36
|
export function emptySessionStats() {
|
|
5
37
|
return {
|
|
@@ -11,11 +43,16 @@ export function emptySessionStats() {
|
|
|
11
43
|
ttftSteps: 0,
|
|
12
44
|
decodeMs: 0,
|
|
13
45
|
decodeTokens: 0,
|
|
46
|
+
lastDecodeMs: 0,
|
|
47
|
+
lastDecodeTokens: 0,
|
|
48
|
+
settledDecodeMs: 0,
|
|
49
|
+
settledDecodeTokens: 0,
|
|
14
50
|
usage: emptySessionUsage(),
|
|
15
51
|
};
|
|
16
52
|
}
|
|
17
|
-
/** Flatten a snapshot into the
|
|
53
|
+
/** Flatten a snapshot into the legacy stats-row shape. */
|
|
18
54
|
export function statsRowOf(stats) {
|
|
55
|
+
const total = sessionTokenTotal(stats.usage);
|
|
19
56
|
return {
|
|
20
57
|
turns: stats.turns,
|
|
21
58
|
steps: stats.steps,
|
|
@@ -29,6 +66,7 @@ export function statsRowOf(stats) {
|
|
|
29
66
|
outputTokens: stats.usage.outputTokens,
|
|
30
67
|
cacheReadTokens: stats.usage.cacheReadTokens,
|
|
31
68
|
cacheWriteTokens: stats.usage.cacheWriteTokens,
|
|
69
|
+
totalTokens: total?.tokens ?? 0,
|
|
32
70
|
};
|
|
33
71
|
}
|
|
34
72
|
/**
|
|
@@ -42,14 +80,49 @@ export class SessionStatsTracker {
|
|
|
42
80
|
usageByStep = new Map();
|
|
43
81
|
pendingToolTimes = new Map();
|
|
44
82
|
lastTurn = null;
|
|
83
|
+
/** Live decode estimate for the step currently streaming. */
|
|
84
|
+
live = new ThroughputTracker();
|
|
45
85
|
/** The step a live chunk belongs to when the host frame carried none. */
|
|
46
86
|
currentStep() {
|
|
47
87
|
const open = this.openStep;
|
|
48
88
|
return open === undefined ? undefined : { turn: open.turn, step: open.step };
|
|
49
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* The open step's two clocks, for the status row's elapsed suffix.
|
|
92
|
+
*
|
|
93
|
+
* Both are host wall clocks, so a caller may subtract them from `Date.now()`
|
|
94
|
+
* without a translation. `firstTokenAt` is absent until the step's first
|
|
95
|
+
* delta, which is exactly the difference between "the request is out" and
|
|
96
|
+
* "the model is talking".
|
|
97
|
+
*/
|
|
98
|
+
stepClocks() {
|
|
99
|
+
const open = this.openStep;
|
|
100
|
+
if (open === undefined)
|
|
101
|
+
return {};
|
|
102
|
+
return {
|
|
103
|
+
startedAt: open.startTime,
|
|
104
|
+
...(open.firstTokenTime === null ? {} : { firstTokenAt: open.firstTokenTime }),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
50
107
|
/** `step/start`: opens the clock LLM time, TTFT and decode are measured from. */
|
|
51
108
|
noteStepStart(turn, step, time) {
|
|
52
109
|
this.openStep = { turn, step, startTime: time, firstTokenTime: null };
|
|
110
|
+
this.live.reset();
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A live fragment of model output, for the running throughput estimate.
|
|
114
|
+
*
|
|
115
|
+
* The text itself travels: the estimate is tokens per character, and how many
|
|
116
|
+
* tokens a character is worth depends on the script the fragment is written in.
|
|
117
|
+
* @param text - the fragment.
|
|
118
|
+
* @param time - wall clock the fragment arrived at.
|
|
119
|
+
*/
|
|
120
|
+
noteDelta(text, time = Date.now()) {
|
|
121
|
+
this.live.note(text, time);
|
|
122
|
+
}
|
|
123
|
+
/** The running throughput estimate, settled value included. */
|
|
124
|
+
throughput(now = Date.now()) {
|
|
125
|
+
return this.live.view(now);
|
|
53
126
|
}
|
|
54
127
|
/** The first token delta of the open step latches its TTFT clock. */
|
|
55
128
|
noteFirstToken(turn, step, time) {
|
|
@@ -62,9 +135,13 @@ export class SessionStatsTracker {
|
|
|
62
135
|
/** Replace one step's usage sample so a repeated report never double counts. */
|
|
63
136
|
recordUsage(turn, step, usage) {
|
|
64
137
|
const key = `${turn}:${step}`;
|
|
138
|
+
const total = usage.totalTokens;
|
|
65
139
|
const next = {
|
|
66
140
|
inputTokens: usage.inputTokens,
|
|
67
141
|
outputTokens: usage.outputTokens,
|
|
142
|
+
reportedTokens: typeof total === 'number' && Number.isFinite(total) && total >= 0 ? total : 0,
|
|
143
|
+
reportedSteps: typeof total === 'number' && Number.isFinite(total) && total >= 0 ? 1 : 0,
|
|
144
|
+
unreportedSteps: typeof total === 'number' && Number.isFinite(total) && total >= 0 ? 0 : 1,
|
|
68
145
|
cacheReadTokens: usage.cacheReadTokens ?? 0,
|
|
69
146
|
cacheWriteTokens: usage.cacheWriteTokens ?? 0,
|
|
70
147
|
};
|
|
@@ -73,6 +150,9 @@ export class SessionStatsTracker {
|
|
|
73
150
|
this.stats.usage = {
|
|
74
151
|
inputTokens: totals.inputTokens - (previous?.inputTokens ?? 0) + next.inputTokens,
|
|
75
152
|
outputTokens: totals.outputTokens - (previous?.outputTokens ?? 0) + next.outputTokens,
|
|
153
|
+
reportedTokens: totals.reportedTokens - (previous?.reportedTokens ?? 0) + next.reportedTokens,
|
|
154
|
+
reportedSteps: totals.reportedSteps - (previous?.reportedSteps ?? 0) + next.reportedSteps,
|
|
155
|
+
unreportedSteps: totals.unreportedSteps - (previous?.unreportedSteps ?? 0) + next.unreportedSteps,
|
|
76
156
|
cacheReadTokens: totals.cacheReadTokens - (previous?.cacheReadTokens ?? 0) + next.cacheReadTokens,
|
|
77
157
|
cacheWriteTokens: totals.cacheWriteTokens - (previous?.cacheWriteTokens ?? 0) + next.cacheWriteTokens,
|
|
78
158
|
};
|
|
@@ -93,10 +173,23 @@ export class SessionStatsTracker {
|
|
|
93
173
|
this.stats.ttftSteps += 1;
|
|
94
174
|
const outputTokens = input.outputTokens;
|
|
95
175
|
if (typeof outputTokens === 'number' && Number.isFinite(outputTokens) && outputTokens >= 0) {
|
|
96
|
-
|
|
176
|
+
const decodeMs = Math.max(0, input.time - firstTokenTime);
|
|
177
|
+
this.stats.decodeMs += decodeMs;
|
|
97
178
|
this.stats.decodeTokens += outputTokens;
|
|
179
|
+
this.stats.lastDecodeMs = decodeMs;
|
|
180
|
+
this.stats.lastDecodeTokens = outputTokens;
|
|
181
|
+
this.stats.settledDecodeMs += decodeMs;
|
|
182
|
+
this.stats.settledDecodeTokens += outputTokens;
|
|
183
|
+
// The estimate is only as good as the last exact measurement: fold
|
|
184
|
+
// this step's real ratio in before the next one starts streaming.
|
|
185
|
+
this.live.settle(outputTokens, decodeMs);
|
|
186
|
+
this.openStep = undefined;
|
|
187
|
+
return;
|
|
98
188
|
}
|
|
99
189
|
}
|
|
190
|
+
this.stats.lastDecodeMs = 0;
|
|
191
|
+
this.stats.lastDecodeTokens = 0;
|
|
192
|
+
this.live.settle(0, 0);
|
|
100
193
|
this.openStep = undefined;
|
|
101
194
|
}
|
|
102
195
|
}
|
|
@@ -104,6 +197,10 @@ export class SessionStatsTracker {
|
|
|
104
197
|
noteToolStart(callId, time) {
|
|
105
198
|
this.pendingToolTimes.set(callId, time);
|
|
106
199
|
}
|
|
200
|
+
/** When a still-open tool call started, for the status row's elapsed suffix. */
|
|
201
|
+
toolStartedAt(callId) {
|
|
202
|
+
return this.pendingToolTimes.get(callId);
|
|
203
|
+
}
|
|
107
204
|
/** `tool/result`: add the elapsed tool time, once. */
|
|
108
205
|
noteToolEnd(callId, time) {
|
|
109
206
|
const dispatchedAt = this.pendingToolTimes.get(callId);
|
|
@@ -120,6 +217,7 @@ export class SessionStatsTracker {
|
|
|
120
217
|
}
|
|
121
218
|
this.stats.steps += 1;
|
|
122
219
|
this.openStep = undefined;
|
|
220
|
+
this.live.reset();
|
|
123
221
|
// Usage accounting is complete for this step; the map only exists to
|
|
124
222
|
// deduplicate repeated usage reports during the step.
|
|
125
223
|
this.usageByStep.delete(`${turn}:${step}`);
|
package/lib/stats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"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"}
|