@dsh-cc/tui 0.5.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/LICENSE +201 -0
- package/README.md +144 -0
- package/lib/bash-history.d.ts +31 -0
- package/lib/bash-history.d.ts.map +1 -0
- package/lib/bash-history.js +94 -0
- package/lib/bash-history.js.map +1 -0
- package/lib/compact-fold.d.ts +35 -0
- package/lib/compact-fold.d.ts.map +1 -0
- package/lib/compact-fold.js +60 -0
- package/lib/compact-fold.js.map +1 -0
- package/lib/components/arg-completers.d.ts +22 -0
- package/lib/components/arg-completers.d.ts.map +1 -0
- package/lib/components/arg-completers.js +75 -0
- package/lib/components/arg-completers.js.map +1 -0
- package/lib/components/code-theme.d.ts +25 -0
- package/lib/components/code-theme.d.ts.map +1 -0
- package/lib/components/code-theme.js +137 -0
- package/lib/components/code-theme.js.map +1 -0
- package/lib/components/completion.d.ts +50 -0
- package/lib/components/completion.d.ts.map +1 -0
- package/lib/components/completion.js +279 -0
- package/lib/components/completion.js.map +1 -0
- package/lib/components/diff-card.d.ts +29 -0
- package/lib/components/diff-card.d.ts.map +1 -0
- package/lib/components/diff-card.js +175 -0
- package/lib/components/diff-card.js.map +1 -0
- package/lib/components/diff-hunks.d.ts +44 -0
- package/lib/components/diff-hunks.d.ts.map +1 -0
- package/lib/components/diff-hunks.js +188 -0
- package/lib/components/diff-hunks.js.map +1 -0
- package/lib/components/editor-history.d.ts +23 -0
- package/lib/components/editor-history.d.ts.map +1 -0
- package/lib/components/editor-history.js +29 -0
- package/lib/components/editor-history.js.map +1 -0
- package/lib/components/markdown-theme.d.ts +11 -0
- package/lib/components/markdown-theme.d.ts.map +1 -0
- package/lib/components/markdown-theme.js +29 -0
- package/lib/components/markdown-theme.js.map +1 -0
- package/lib/components/masked-input.d.ts +24 -0
- package/lib/components/masked-input.d.ts.map +1 -0
- package/lib/components/masked-input.js +168 -0
- package/lib/components/masked-input.js.map +1 -0
- package/lib/components/overlay-host.d.ts +31 -0
- package/lib/components/overlay-host.d.ts.map +1 -0
- package/lib/components/overlay-host.js +128 -0
- package/lib/components/overlay-host.js.map +1 -0
- package/lib/components/overlays.d.ts +94 -0
- package/lib/components/overlays.d.ts.map +1 -0
- package/lib/components/overlays.js +450 -0
- package/lib/components/overlays.js.map +1 -0
- package/lib/components/provider-box.d.ts +23 -0
- package/lib/components/provider-box.d.ts.map +1 -0
- package/lib/components/provider-box.js +164 -0
- package/lib/components/provider-box.js.map +1 -0
- package/lib/components/read-group.d.ts +51 -0
- package/lib/components/read-group.d.ts.map +1 -0
- package/lib/components/read-group.js +105 -0
- package/lib/components/read-group.js.map +1 -0
- package/lib/components/root-bash.d.ts +36 -0
- package/lib/components/root-bash.d.ts.map +1 -0
- package/lib/components/root-bash.js +112 -0
- package/lib/components/root-bash.js.map +1 -0
- package/lib/components/root-types.d.ts +42 -0
- package/lib/components/root-types.d.ts.map +1 -0
- package/lib/components/root-types.js +8 -0
- package/lib/components/root-types.js.map +1 -0
- package/lib/components/root-utils.d.ts +22 -0
- package/lib/components/root-utils.d.ts.map +1 -0
- package/lib/components/root-utils.js +45 -0
- package/lib/components/root-utils.js.map +1 -0
- package/lib/components/root.d.ts +25 -0
- package/lib/components/root.d.ts.map +1 -0
- package/lib/components/root.js +357 -0
- package/lib/components/root.js.map +1 -0
- package/lib/components/theme.d.ts +61 -0
- package/lib/components/theme.d.ts.map +1 -0
- package/lib/components/theme.js +99 -0
- package/lib/components/theme.js.map +1 -0
- package/lib/components/transcript.d.ts +43 -0
- package/lib/components/transcript.d.ts.map +1 -0
- package/lib/components/transcript.js +203 -0
- package/lib/components/transcript.js.map +1 -0
- package/lib/components/working-line.d.ts +35 -0
- package/lib/components/working-line.d.ts.map +1 -0
- package/lib/components/working-line.js +66 -0
- package/lib/components/working-line.js.map +1 -0
- package/lib/effort-catalog.d.ts +27 -0
- package/lib/effort-catalog.d.ts.map +1 -0
- package/lib/effort-catalog.js +36 -0
- package/lib/effort-catalog.js.map +1 -0
- package/lib/export-markdown.d.ts +18 -0
- package/lib/export-markdown.d.ts.map +1 -0
- package/lib/export-markdown.js +124 -0
- package/lib/export-markdown.js.map +1 -0
- package/lib/harness/approval-preview.d.ts +33 -0
- package/lib/harness/approval-preview.d.ts.map +1 -0
- package/lib/harness/approval-preview.js +179 -0
- package/lib/harness/approval-preview.js.map +1 -0
- package/lib/harness/boot-banner.d.ts +14 -0
- package/lib/harness/boot-banner.d.ts.map +1 -0
- package/lib/harness/boot-banner.js +89 -0
- package/lib/harness/boot-banner.js.map +1 -0
- package/lib/harness/driver-agent.d.ts +78 -0
- package/lib/harness/driver-agent.d.ts.map +1 -0
- package/lib/harness/driver-agent.js +314 -0
- package/lib/harness/driver-agent.js.map +1 -0
- package/lib/harness/driver-agents.d.ts +20 -0
- package/lib/harness/driver-agents.d.ts.map +1 -0
- package/lib/harness/driver-agents.js +123 -0
- package/lib/harness/driver-agents.js.map +1 -0
- package/lib/harness/driver-approvals.d.ts +38 -0
- package/lib/harness/driver-approvals.d.ts.map +1 -0
- package/lib/harness/driver-approvals.js +277 -0
- package/lib/harness/driver-approvals.js.map +1 -0
- package/lib/harness/driver-bash.d.ts +15 -0
- package/lib/harness/driver-bash.d.ts.map +1 -0
- package/lib/harness/driver-bash.js +73 -0
- package/lib/harness/driver-bash.js.map +1 -0
- package/lib/harness/driver-catalog.d.ts +84 -0
- package/lib/harness/driver-catalog.d.ts.map +1 -0
- package/lib/harness/driver-catalog.js +256 -0
- package/lib/harness/driver-catalog.js.map +1 -0
- package/lib/harness/driver-ctx.d.ts +462 -0
- package/lib/harness/driver-ctx.d.ts.map +1 -0
- package/lib/harness/driver-ctx.js +11 -0
- package/lib/harness/driver-ctx.js.map +1 -0
- package/lib/harness/driver-hud.d.ts +31 -0
- package/lib/harness/driver-hud.d.ts.map +1 -0
- package/lib/harness/driver-hud.js +204 -0
- package/lib/harness/driver-hud.js.map +1 -0
- package/lib/harness/driver-live.d.ts +36 -0
- package/lib/harness/driver-live.d.ts.map +1 -0
- package/lib/harness/driver-live.js +44 -0
- package/lib/harness/driver-live.js.map +1 -0
- package/lib/harness/driver-modal.d.ts +52 -0
- package/lib/harness/driver-modal.d.ts.map +1 -0
- package/lib/harness/driver-modal.js +78 -0
- package/lib/harness/driver-modal.js.map +1 -0
- package/lib/harness/driver-mode.d.ts +35 -0
- package/lib/harness/driver-mode.d.ts.map +1 -0
- package/lib/harness/driver-mode.js +84 -0
- package/lib/harness/driver-mode.js.map +1 -0
- package/lib/harness/driver-pickers.d.ts +48 -0
- package/lib/harness/driver-pickers.d.ts.map +1 -0
- package/lib/harness/driver-pickers.js +249 -0
- package/lib/harness/driver-pickers.js.map +1 -0
- package/lib/harness/driver-promote.d.ts +29 -0
- package/lib/harness/driver-promote.d.ts.map +1 -0
- package/lib/harness/driver-promote.js +36 -0
- package/lib/harness/driver-promote.js.map +1 -0
- package/lib/harness/driver-queue.d.ts +19 -0
- package/lib/harness/driver-queue.d.ts.map +1 -0
- package/lib/harness/driver-queue.js +281 -0
- package/lib/harness/driver-queue.js.map +1 -0
- package/lib/harness/driver-run-local.d.ts +32 -0
- package/lib/harness/driver-run-local.d.ts.map +1 -0
- package/lib/harness/driver-run-local.js +366 -0
- package/lib/harness/driver-run-local.js.map +1 -0
- package/lib/harness/driver-sessions.d.ts +28 -0
- package/lib/harness/driver-sessions.d.ts.map +1 -0
- package/lib/harness/driver-sessions.js +386 -0
- package/lib/harness/driver-sessions.js.map +1 -0
- package/lib/harness/driver.d.ts +22 -0
- package/lib/harness/driver.d.ts.map +1 -0
- package/lib/harness/driver.js +459 -0
- package/lib/harness/driver.js.map +1 -0
- package/lib/harness/preset.d.ts +32 -0
- package/lib/harness/preset.d.ts.map +1 -0
- package/lib/harness/preset.js +34 -0
- package/lib/harness/preset.js.map +1 -0
- package/lib/harness/session-list.d.ts +65 -0
- package/lib/harness/session-list.d.ts.map +1 -0
- package/lib/harness/session-list.js +91 -0
- package/lib/harness/session-list.js.map +1 -0
- package/lib/harness/shell-output.d.ts +44 -0
- package/lib/harness/shell-output.d.ts.map +1 -0
- package/lib/harness/shell-output.js +90 -0
- package/lib/harness/shell-output.js.map +1 -0
- package/lib/harness/statusline-cc-transcript.d.ts +51 -0
- package/lib/harness/statusline-cc-transcript.d.ts.map +1 -0
- package/lib/harness/statusline-cc-transcript.js +191 -0
- package/lib/harness/statusline-cc-transcript.js.map +1 -0
- package/lib/harness/statusline-command.d.ts +54 -0
- package/lib/harness/statusline-command.d.ts.map +1 -0
- package/lib/harness/statusline-command.js +161 -0
- package/lib/harness/statusline-command.js.map +1 -0
- package/lib/harness/statusline-payload.d.ts +79 -0
- package/lib/harness/statusline-payload.d.ts.map +1 -0
- package/lib/harness/statusline-payload.js +93 -0
- package/lib/harness/statusline-payload.js.map +1 -0
- package/lib/harness/statusline-settings.d.ts +47 -0
- package/lib/harness/statusline-settings.d.ts.map +1 -0
- package/lib/harness/statusline-settings.js +57 -0
- package/lib/harness/statusline-settings.js.map +1 -0
- package/lib/harness/statusline-wiring.d.ts +45 -0
- package/lib/harness/statusline-wiring.d.ts.map +1 -0
- package/lib/harness/statusline-wiring.js +247 -0
- package/lib/harness/statusline-wiring.js.map +1 -0
- package/lib/harness/usage-view.d.ts +84 -0
- package/lib/harness/usage-view.d.ts.map +1 -0
- package/lib/harness/usage-view.js +199 -0
- package/lib/harness/usage-view.js.map +1 -0
- package/lib/harness/worktree-exit.d.ts +105 -0
- package/lib/harness/worktree-exit.d.ts.map +1 -0
- package/lib/harness/worktree-exit.js +168 -0
- package/lib/harness/worktree-exit.js.map +1 -0
- package/lib/history.d.ts +50 -0
- package/lib/history.d.ts.map +1 -0
- package/lib/history.js +139 -0
- package/lib/history.js.map +1 -0
- package/lib/index.d.ts +63 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +54 -0
- package/lib/index.js.map +1 -0
- package/lib/input.d.ts +158 -0
- package/lib/input.d.ts.map +1 -0
- package/lib/input.js +400 -0
- package/lib/input.js.map +1 -0
- package/lib/invariant.d.ts +14 -0
- package/lib/invariant.d.ts.map +1 -0
- package/lib/invariant.js +20 -0
- package/lib/invariant.js.map +1 -0
- package/lib/mode-cycle.d.ts +22 -0
- package/lib/mode-cycle.d.ts.map +1 -0
- package/lib/mode-cycle.js +32 -0
- package/lib/mode-cycle.js.map +1 -0
- package/lib/model-catalog.d.ts +22 -0
- package/lib/model-catalog.d.ts.map +1 -0
- package/lib/model-catalog.js +45 -0
- package/lib/model-catalog.js.map +1 -0
- package/lib/packaged-preset.d.ts +32 -0
- package/lib/packaged-preset.d.ts.map +1 -0
- package/lib/packaged-preset.js +94 -0
- package/lib/packaged-preset.js.map +1 -0
- package/lib/plugin.d.ts +11 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +88 -0
- package/lib/plugin.js.map +1 -0
- package/lib/profile.d.ts +4 -0
- package/lib/profile.d.ts.map +1 -0
- package/lib/profile.js +7 -0
- package/lib/profile.js.map +1 -0
- package/lib/project-sessions.d.ts +29 -0
- package/lib/project-sessions.d.ts.map +1 -0
- package/lib/project-sessions.js +60 -0
- package/lib/project-sessions.js.map +1 -0
- package/lib/project.d.ts +75 -0
- package/lib/project.d.ts.map +1 -0
- package/lib/project.js +196 -0
- package/lib/project.js.map +1 -0
- package/lib/provider-actions.d.ts +37 -0
- package/lib/provider-actions.d.ts.map +1 -0
- package/lib/provider-actions.js +417 -0
- package/lib/provider-actions.js.map +1 -0
- package/lib/provider-command.d.ts +109 -0
- package/lib/provider-command.d.ts.map +1 -0
- package/lib/provider-command.js +220 -0
- package/lib/provider-command.js.map +1 -0
- package/lib/provider-detail.d.ts +15 -0
- package/lib/provider-detail.d.ts.map +1 -0
- package/lib/provider-detail.js +201 -0
- package/lib/provider-detail.js.map +1 -0
- package/lib/provider-flow.d.ts +191 -0
- package/lib/provider-flow.d.ts.map +1 -0
- package/lib/provider-flow.js +192 -0
- package/lib/provider-flow.js.map +1 -0
- package/lib/provider-presets.d.ts +32 -0
- package/lib/provider-presets.d.ts.map +1 -0
- package/lib/provider-presets.js +105 -0
- package/lib/provider-presets.js.map +1 -0
- package/lib/provider-read.d.ts +63 -0
- package/lib/provider-read.d.ts.map +1 -0
- package/lib/provider-read.js +115 -0
- package/lib/provider-read.js.map +1 -0
- package/lib/provider-settings.d.ts +30 -0
- package/lib/provider-settings.d.ts.map +1 -0
- package/lib/provider-settings.js +65 -0
- package/lib/provider-settings.js.map +1 -0
- package/lib/resume-target.d.ts +59 -0
- package/lib/resume-target.d.ts.map +1 -0
- package/lib/resume-target.js +143 -0
- package/lib/resume-target.js.map +1 -0
- package/lib/slash.d.ts +44 -0
- package/lib/slash.d.ts.map +1 -0
- package/lib/slash.js +81 -0
- package/lib/slash.js.map +1 -0
- package/lib/state/driver-types.d.ts +505 -0
- package/lib/state/driver-types.d.ts.map +1 -0
- package/lib/state/driver-types.js +8 -0
- package/lib/state/driver-types.js.map +1 -0
- package/lib/state/driver-usage-types.d.ts +59 -0
- package/lib/state/driver-usage-types.d.ts.map +1 -0
- package/lib/state/driver-usage-types.js +8 -0
- package/lib/state/driver-usage-types.js.map +1 -0
- package/lib/statusline.d.ts +63 -0
- package/lib/statusline.d.ts.map +1 -0
- package/lib/statusline.js +97 -0
- package/lib/statusline.js.map +1 -0
- package/lib/store/pickers.d.ts +34 -0
- package/lib/store/pickers.d.ts.map +1 -0
- package/lib/store/pickers.js +111 -0
- package/lib/store/pickers.js.map +1 -0
- package/lib/store/provider-panel.d.ts +107 -0
- package/lib/store/provider-panel.d.ts.map +1 -0
- package/lib/store/provider-panel.js +151 -0
- package/lib/store/provider-panel.js.map +1 -0
- package/lib/store/question.d.ts +21 -0
- package/lib/store/question.d.ts.map +1 -0
- package/lib/store/question.js +59 -0
- package/lib/store/question.js.map +1 -0
- package/lib/store/queue.d.ts +27 -0
- package/lib/store/queue.d.ts.map +1 -0
- package/lib/store/queue.js +34 -0
- package/lib/store/queue.js.map +1 -0
- package/lib/store/session.d.ts +73 -0
- package/lib/store/session.d.ts.map +1 -0
- package/lib/store/session.js +172 -0
- package/lib/store/session.js.map +1 -0
- package/lib/store/subagents.d.ts +16 -0
- package/lib/store/subagents.d.ts.map +1 -0
- package/lib/store/subagents.js +44 -0
- package/lib/store/subagents.js.map +1 -0
- package/lib/store/todos.d.ts +35 -0
- package/lib/store/todos.d.ts.map +1 -0
- package/lib/store/todos.js +68 -0
- package/lib/store/todos.js.map +1 -0
- package/lib/store/usage.d.ts +15 -0
- package/lib/store/usage.d.ts.map +1 -0
- package/lib/store/usage.js +27 -0
- package/lib/store/usage.js.map +1 -0
- package/lib/store/views.d.ts +419 -0
- package/lib/store/views.d.ts.map +1 -0
- package/lib/store/views.js +3 -0
- package/lib/store/views.js.map +1 -0
- package/lib/store.d.ts +19 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +10 -0
- package/lib/store.js.map +1 -0
- package/lib/terminal/lease.d.ts +33 -0
- package/lib/terminal/lease.d.ts.map +1 -0
- package/lib/terminal/lease.js +99 -0
- package/lib/terminal/lease.js.map +1 -0
- package/lib/tool-card.d.ts +75 -0
- package/lib/tool-card.d.ts.map +1 -0
- package/lib/tool-card.js +109 -0
- package/lib/tool-card.js.map +1 -0
- package/lib/tool-verbs.d.ts +12 -0
- package/lib/tool-verbs.d.ts.map +1 -0
- package/lib/tool-verbs.js +29 -0
- package/lib/tool-verbs.js.map +1 -0
- package/lib/transcript.d.ts +40 -0
- package/lib/transcript.d.ts.map +1 -0
- package/lib/transcript.js +413 -0
- package/lib/transcript.js.map +1 -0
- package/lib/working-line.d.ts +44 -0
- package/lib/working-line.d.ts.map +1 -0
- package/lib/working-line.js +56 -0
- package/lib/working-line.js.map +1 -0
- package/package.json +72 -0
- package/presets/cc/.dsh-cc-managed.json +5 -0
- package/presets/cc/agent.cordis.yml +524 -0
- package/presets/cc/preset.yml +3 -0
- package/scripts/stage-preset.mjs +26 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Driver wiring for the custom status line (plan §4/Slice 4): settings
|
|
3
|
+
* registration (`statusline` namespace via installSettingsSection, tolerant
|
|
4
|
+
* when no settings provider is mounted), the lazily-created command runner,
|
|
5
|
+
* the refreshInterval timer (owned here — a documented deviation from the
|
|
6
|
+
* plan's "inside the runner" phrasing; same observable behavior, and the
|
|
7
|
+
* runner stays timer-free beyond its own debounce/cap), payload assembly at
|
|
8
|
+
* fire time from live state, and the trigger seams: projections onChanged +
|
|
9
|
+
* boot/rebind (hooked by driver-hud.ts), and the emit-diff wrapper (S1) over
|
|
10
|
+
* the driver's listener fan-out diffing permissionMode and the model/effort
|
|
11
|
+
* selection. Feature stays inert when the shell service is absent (D6/N3 —
|
|
12
|
+
* never the execFileAsync fallback).
|
|
13
|
+
* @module @dsh-cc/tui/harness/statusline-wiring
|
|
14
|
+
*/
|
|
15
|
+
import { installSettingsSection } from '@deepseek-ai/dsh-settings';
|
|
16
|
+
import { lastBucketsOf, tokensOf } from "./usage-view.js";
|
|
17
|
+
import { createStatusLineCommand } from "./statusline-command.js";
|
|
18
|
+
import { buildStatusLinePayload } from "./statusline-payload.js";
|
|
19
|
+
import { createCcTranscriptMirror } from "./statusline-cc-transcript.js";
|
|
20
|
+
import { STATUSLINE_SECTION_SCHEMA, STATUSLINE_SETTINGS_NAMESPACE, describeStatusLine, statusLineSectionSchema, } from "./statusline-settings.js";
|
|
21
|
+
/** Fallback terminal dimensions when stdout is not a TTY. */
|
|
22
|
+
const FALLBACK_COLUMNS = 80;
|
|
23
|
+
const FALLBACK_ROWS = 24;
|
|
24
|
+
export function createStatusLineWiring(rt, options = {}) {
|
|
25
|
+
const { state, emit, ctx, cwd, current, selection } = rt;
|
|
26
|
+
const executor = ctx.get('shell');
|
|
27
|
+
const projections = ctx.get('sessionProjections');
|
|
28
|
+
const bindTimeMs = Date.now();
|
|
29
|
+
let description = { active: false };
|
|
30
|
+
let runner;
|
|
31
|
+
let refreshTimer;
|
|
32
|
+
let source;
|
|
33
|
+
// The session id the runner was last fired for — a /resume-style rebind
|
|
34
|
+
// re-runs only when it actually changed (the boot-time seedHud call must
|
|
35
|
+
// not discard the initial activation's run via the generation guard).
|
|
36
|
+
let boundSessionId = String(current.agent.session.id);
|
|
37
|
+
// The CC transcript mirror (Slice C) — created lazily on first activation so
|
|
38
|
+
// users without a statusline never write files.
|
|
39
|
+
let mirror;
|
|
40
|
+
let unsubscribeEvents;
|
|
41
|
+
/**
|
|
42
|
+
* Bind the transcript mirror to the CURRENT session: subscribe the live
|
|
43
|
+
* event tap (guarded by session id), snapshot + rebuild from the full event
|
|
44
|
+
* log, then re-drain the tail so a live append landing between snapshot and
|
|
45
|
+
* subscribe (or to the old inode before rename) is not lost — append is
|
|
46
|
+
* idempotent under the seq watermark guard. Idempotent; safe on rebind.
|
|
47
|
+
*/
|
|
48
|
+
function bindTranscriptMirror() {
|
|
49
|
+
const sessionId = String(current.agent.session.id);
|
|
50
|
+
if (mirror === undefined) {
|
|
51
|
+
mirror = options.transcriptDir === undefined
|
|
52
|
+
? createCcTranscriptMirror()
|
|
53
|
+
: createCcTranscriptMirror({ dir: options.transcriptDir });
|
|
54
|
+
}
|
|
55
|
+
unsubscribeEvents?.();
|
|
56
|
+
unsubscribeEvents = undefined;
|
|
57
|
+
unsubscribeEvents = ctx.on('session/event', (session, event) => {
|
|
58
|
+
// Guard against late events from a disposed/rebound session.
|
|
59
|
+
if (String(session?.id) !== String(current.agent.session.id))
|
|
60
|
+
return;
|
|
61
|
+
mirror?.append(event);
|
|
62
|
+
});
|
|
63
|
+
const eventsOf = () => {
|
|
64
|
+
const events = current.agent.session.events;
|
|
65
|
+
return Array.isArray(events) ? events : [];
|
|
66
|
+
};
|
|
67
|
+
// Snapshot, rebuild, then re-drain: the watermark was taken at snapshot
|
|
68
|
+
// time inside rebind, so any event appended since (live tap raced the
|
|
69
|
+
// snapshot, or wrote to the pre-rename inode) re-flows through append.
|
|
70
|
+
const snapshot = eventsOf();
|
|
71
|
+
mirror.rebind(sessionId, snapshot);
|
|
72
|
+
for (const event of eventsOf())
|
|
73
|
+
mirror.append(event);
|
|
74
|
+
}
|
|
75
|
+
/** Assemble the CC-shaped payload at fire time from live state (§3.4). */
|
|
76
|
+
function payloadFor() {
|
|
77
|
+
const session = current.agent.session;
|
|
78
|
+
const header = session.header;
|
|
79
|
+
const pressure = projections?.stateOf(session, 'contextPressure');
|
|
80
|
+
// One read of the tokenUsage projection feeds both the cumulative totals
|
|
81
|
+
// and the last step's buckets (the CC current_usage source).
|
|
82
|
+
const tokenUsage = projections?.stateOf(session, 'tokenUsage');
|
|
83
|
+
const tokens = tokensOf(tokenUsage);
|
|
84
|
+
const currentUsage = lastBucketsOf(tokenUsage);
|
|
85
|
+
const sessionCwd = header.cwd ?? cwd;
|
|
86
|
+
// transcript_path is advertised only while the CC-shape mirror is ready
|
|
87
|
+
// (an unreadable/empty file would yield all-zeros that shadow the stdin
|
|
88
|
+
// fallbacks above — ccstatusline's `??` chain passes zeros through).
|
|
89
|
+
const model = selection.current?.model;
|
|
90
|
+
const effort = selection.current?.reasoningEffort;
|
|
91
|
+
return buildStatusLinePayload({
|
|
92
|
+
driverCwd: cwd,
|
|
93
|
+
sessionCwd,
|
|
94
|
+
projectDir: cwd,
|
|
95
|
+
sessionId: String(session.id),
|
|
96
|
+
...(model === undefined ? {} : { model }),
|
|
97
|
+
...(effort === undefined ? {} : { effort }),
|
|
98
|
+
...(tokens === undefined ? {} : { inputTokens: tokens.input, outputTokens: tokens.output }),
|
|
99
|
+
...(currentUsage === undefined ? {} : { currentUsage }),
|
|
100
|
+
...(pressure?.contextWindow === undefined ? {} : { contextWindowTokens: pressure.contextWindow }),
|
|
101
|
+
...(pressure?.pressureTokens === undefined ? {} : { pressureTokens: pressure.pressureTokens }),
|
|
102
|
+
...(mirror?.isReady() === true && mirror.getPath() !== undefined
|
|
103
|
+
? { transcriptPath: mirror.getPath() }
|
|
104
|
+
: {}),
|
|
105
|
+
...(header.createdAt === undefined ? {} : { sessionCreatedAtMs: header.createdAt }),
|
|
106
|
+
bindTimeMs,
|
|
107
|
+
nowMs: Date.now(),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/** Trigger a run with a fresh payload (no-op while inactive). */
|
|
111
|
+
function fire(options) {
|
|
112
|
+
if (runner === undefined || !description.active)
|
|
113
|
+
return;
|
|
114
|
+
runner.update({ command: description.command }, payloadFor(), {
|
|
115
|
+
...(options?.immediate === true ? { immediate: true } : {}),
|
|
116
|
+
workdir: current.agent.session.header.cwd ?? cwd,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function clearRefreshTimer() {
|
|
120
|
+
if (refreshTimer !== undefined) {
|
|
121
|
+
clearInterval(refreshTimer);
|
|
122
|
+
refreshTimer = undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Arm exactly one SECONDS-based refresh interval while active. */
|
|
126
|
+
function restartRefreshTimer() {
|
|
127
|
+
clearRefreshTimer();
|
|
128
|
+
if (!description.active || description.refreshIntervalSec === undefined)
|
|
129
|
+
return;
|
|
130
|
+
refreshTimer = setInterval(() => fire(), description.refreshIntervalSec * 1000);
|
|
131
|
+
}
|
|
132
|
+
/** Tear the runner down (deactivation or dispose) and restore the built-in line. */
|
|
133
|
+
function deactivate(reEmit = true) {
|
|
134
|
+
clearRefreshTimer();
|
|
135
|
+
unsubscribeEvents?.();
|
|
136
|
+
unsubscribeEvents = undefined;
|
|
137
|
+
runner?.dispose();
|
|
138
|
+
runner = undefined;
|
|
139
|
+
// Same-reference re-emit so root re-reads the built-in lane; suppressed
|
|
140
|
+
// on dispose — teardown must not produce emissions.
|
|
141
|
+
if (reEmit)
|
|
142
|
+
emit(state());
|
|
143
|
+
}
|
|
144
|
+
function activate() {
|
|
145
|
+
runner = createStatusLineCommand({
|
|
146
|
+
executor: executor,
|
|
147
|
+
terminalSize: () => ({
|
|
148
|
+
columns: process.stdout.columns ?? FALLBACK_COLUMNS,
|
|
149
|
+
rows: process.stdout.rows ?? FALLBACK_ROWS,
|
|
150
|
+
}),
|
|
151
|
+
onSettled: () => {
|
|
152
|
+
// Same store→emit path the HUD uses (R6): a same-reference re-emit
|
|
153
|
+
// re-notifies subscribers so root re-reads statusLineIn.
|
|
154
|
+
if (description.active)
|
|
155
|
+
emit(state());
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
restartRefreshTimer();
|
|
159
|
+
// Mirror first, then the first frame (immediate fire) reads a ready path.
|
|
160
|
+
bindTranscriptMirror();
|
|
161
|
+
// Session start runs once, immediately (C4/C5).
|
|
162
|
+
fire({ immediate: true });
|
|
163
|
+
}
|
|
164
|
+
/** Re-judge the live description; drives the whole activation state machine. */
|
|
165
|
+
function resolve() {
|
|
166
|
+
const next = executor === undefined
|
|
167
|
+
? { active: false }
|
|
168
|
+
: describeStatusLine(statusLineSectionOf(source?.()));
|
|
169
|
+
const prev = description;
|
|
170
|
+
description = next;
|
|
171
|
+
if (!next.active) {
|
|
172
|
+
if (prev.active)
|
|
173
|
+
deactivate();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (!prev.active) {
|
|
177
|
+
activate();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (prev.command !== next.command) {
|
|
181
|
+
// A command change skips the debounce (C5).
|
|
182
|
+
restartRefreshTimer();
|
|
183
|
+
fire({ immediate: true });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
restartRefreshTimer();
|
|
187
|
+
fire();
|
|
188
|
+
}
|
|
189
|
+
// Settings registration (D5): tolerated when no settings provider is
|
|
190
|
+
// mounted — installSettingsSection only wires while a provider exists, and
|
|
191
|
+
// test/host ctxs without `inject` keep the feature fully inert.
|
|
192
|
+
if (typeof ctx.inject === 'function') {
|
|
193
|
+
installSettingsSection(ctx, STATUSLINE_SETTINGS_NAMESPACE, STATUSLINE_SECTION_SCHEMA, {}, {
|
|
194
|
+
setSource: (currentSection) => {
|
|
195
|
+
source = () => currentSection();
|
|
196
|
+
},
|
|
197
|
+
onChange: () => resolve(),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// S1 emit-diff seam: fire on permission-mode and model/effort changes by
|
|
201
|
+
// diffing across each emission (fires for every emit path by construction).
|
|
202
|
+
let seenEmit = false;
|
|
203
|
+
let lastMode;
|
|
204
|
+
let lastSelection;
|
|
205
|
+
rt.listeners.add((_) => {
|
|
206
|
+
const mode = state().permissionMode;
|
|
207
|
+
const currentSelection = selection.current;
|
|
208
|
+
if (seenEmit && (mode !== lastMode || currentSelection !== lastSelection))
|
|
209
|
+
fire();
|
|
210
|
+
seenEmit = true;
|
|
211
|
+
lastMode = mode;
|
|
212
|
+
lastSelection = currentSelection;
|
|
213
|
+
});
|
|
214
|
+
return {
|
|
215
|
+
override() {
|
|
216
|
+
if (!description.active || runner === undefined)
|
|
217
|
+
return undefined;
|
|
218
|
+
// Pad each content row (multi-row runner output, plan D2); the
|
|
219
|
+
// client-drawn mode row is never padded (added in driver-hud).
|
|
220
|
+
const pad = ' '.repeat(description.padding);
|
|
221
|
+
return runner.latest().split('\n').map(row => pad + row).join('\n');
|
|
222
|
+
},
|
|
223
|
+
onProjection(_key) {
|
|
224
|
+
fire();
|
|
225
|
+
},
|
|
226
|
+
onRebind() {
|
|
227
|
+
const sessionId = String(current.agent.session.id);
|
|
228
|
+
if (sessionId === boundSessionId)
|
|
229
|
+
return;
|
|
230
|
+
boundSessionId = sessionId;
|
|
231
|
+
// Rebind the transcript mirror to the NEW session before firing so the
|
|
232
|
+
// re-run's payload advertises the new session's mirror, not the old one.
|
|
233
|
+
if (mirror !== undefined && runner !== undefined)
|
|
234
|
+
bindTranscriptMirror();
|
|
235
|
+
if (runner !== undefined)
|
|
236
|
+
fire();
|
|
237
|
+
},
|
|
238
|
+
dispose() {
|
|
239
|
+
deactivate(false);
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/** Tolerant re-parse of the live source into the known section shape. */
|
|
244
|
+
function statusLineSectionOf(raw) {
|
|
245
|
+
return statusLineSectionSchema(typeof raw === 'object' && raw !== null ? raw : undefined);
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=statusline-wiring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline-wiring.js","sourceRoot":"","sources":["../../src/harness/statusline-wiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure projection→view mappers for the statusline HUD and the `/usage`
|
|
3
|
+
* panel, extracted from harness/driver.ts. Structural reads over projection
|
|
4
|
+
* state plus field-wise equality — no I/O and no harness state.
|
|
5
|
+
* @module @dsh-cc/tui/harness/usage-view
|
|
6
|
+
*/
|
|
7
|
+
import type { ContextPressureStateLike, TokenUsageStateLike, TokenUsageTotals } from '../state/driver-types.ts';
|
|
8
|
+
import type { TodoItemView, UsageBreakdownView, UsageView } from '../store.ts';
|
|
9
|
+
/** Pull cumulative token totals out of a `tokenUsage` state value. */
|
|
10
|
+
export declare function totalsOf(usage: TokenUsageStateLike | undefined): TokenUsageTotals | undefined;
|
|
11
|
+
/** HUD-shaped subset of {@link totalsOf} (input/output only). */
|
|
12
|
+
export declare function tokensOf(usage: TokenUsageStateLike | undefined): {
|
|
13
|
+
input: number;
|
|
14
|
+
output: number;
|
|
15
|
+
} | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Most recent API step's token buckets (the CC `current_usage` semantics)
|
|
18
|
+
* out of a `tokenUsage` state value. Returns undefined unless both the
|
|
19
|
+
* input (`uncachedInputTokens ?? inputTokens`) and output are finite
|
|
20
|
+
* numbers; the cache fields are included only when finite numbers, so a
|
|
21
|
+
* partial bucket degrades to its known members instead of NaNs.
|
|
22
|
+
*/
|
|
23
|
+
export declare function lastBucketsOf(usage: TokenUsageStateLike | undefined): {
|
|
24
|
+
inputTokens: number;
|
|
25
|
+
outputTokens: number;
|
|
26
|
+
cacheReadTokens?: number;
|
|
27
|
+
cacheWriteTokens?: number;
|
|
28
|
+
} | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* `/cost` report: token counts with thousands separators, cache lines only
|
|
31
|
+
* when non-zero, a `cache hit` percent (`cacheRead / (input + cacheRead)`,
|
|
32
|
+
* clamped at 100, shown only when `cacheRead` exists and the denominator is
|
|
33
|
+
* positive), and an explicit note that no price table is configured —
|
|
34
|
+
* the harness reports usage only, so no monetary amounts are claimed.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatCostReport(totals: TokenUsageTotals | undefined): string;
|
|
37
|
+
/**
|
|
38
|
+
* Map a `todos` projection value (`TodoItem[] | null`) onto view items.
|
|
39
|
+
* Non-arrays (including the pre-first-write `null`) map to undefined (no
|
|
40
|
+
* strip); malformed entries inside an array are dropped defensively so one
|
|
41
|
+
* bad item degrades to a shorter list instead of a crash.
|
|
42
|
+
*/
|
|
43
|
+
export declare function todosOf(value: unknown): readonly TodoItemView[] | undefined;
|
|
44
|
+
/** Structural equality for two optional todo lists. */
|
|
45
|
+
export declare function sameTodos(a: readonly TodoItemView[] | undefined, b: readonly TodoItemView[] | undefined): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Raw context-window occupancy behind {@link percentOf}: the latest sample
|
|
48
|
+
* plus the surface's movement since that sample was taken (the projection's
|
|
49
|
+
* anchor adjustment), falling back to the bare sample when no anchor exists.
|
|
50
|
+
* `window` is undefined — the result still being usable for exact-token
|
|
51
|
+
* display — when the projection does not expose a positive window. Callers
|
|
52
|
+
* must render from these raw counts, never back-derive them from the rounded
|
|
53
|
+
* percent.
|
|
54
|
+
*/
|
|
55
|
+
export declare function occupancyOf(pressure: ContextPressureStateLike | undefined): {
|
|
56
|
+
used: number;
|
|
57
|
+
window?: number;
|
|
58
|
+
} | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Context-occupancy percent (0-100 int) from a `contextPressure` state
|
|
61
|
+
* value. Undefined until both numerator and denominator are known.
|
|
62
|
+
*/
|
|
63
|
+
export declare function percentOf(pressure: ContextPressureStateLike | undefined): number | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Map a `contextBreakdown` projection value onto the usage panel's three role
|
|
66
|
+
* counts. Absent or malformed fields (shape drift, a partial value) degrade
|
|
67
|
+
* to no breakdown — the panel renders the whole section `n/a` instead of a
|
|
68
|
+
* misleading subset of numbers.
|
|
69
|
+
*/
|
|
70
|
+
export declare function breakdownOf(value: unknown): UsageBreakdownView | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Assemble the usage panel's view from the three projection reads. Absent
|
|
73
|
+
* sections stay absent (the panel renders each `n/a` independently); an
|
|
74
|
+
* all-absent read yields undefined so no empty snapshot is parked in state.
|
|
75
|
+
*/
|
|
76
|
+
export declare function usageViewOf(totals: TokenUsageTotals | undefined, occupancy: {
|
|
77
|
+
used: number;
|
|
78
|
+
window?: number;
|
|
79
|
+
} | undefined, breakdown: UsageBreakdownView | undefined): UsageView | undefined;
|
|
80
|
+
/** Structural equality for two usage breakdowns. */
|
|
81
|
+
export declare function sameBreakdown(a: UsageBreakdownView | undefined, b: UsageBreakdownView | undefined): boolean;
|
|
82
|
+
/** Structural equality for two usage snapshots (all sections field-wise). */
|
|
83
|
+
export declare function sameUsage(a: UsageView | undefined, b: UsageView): boolean;
|
|
84
|
+
//# sourceMappingURL=usage-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-view.d.ts","sourceRoot":"","sources":["../../src/harness/usage-view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEV,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE9E,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAU7F;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAG9G;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,mBAAmB,GAAG,SAAS,GACrC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAehH;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAoB7E;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,YAAY,EAAE,GAAG,SAAS,CAY3E;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CACvB,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,EACtC,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,GACrC,OAAO,CAIT;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,wBAAwB,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAWzH;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,wBAAwB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI5F;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAQ1E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACxD,SAAS,EAAE,kBAAkB,GAAG,SAAS,GACxC,SAAS,GAAG,SAAS,CAUvB;AASD,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,kBAAkB,GAAG,SAAS,EAAE,CAAC,EAAE,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAG3G;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAMzE"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure projection→view mappers for the statusline HUD and the `/usage`
|
|
3
|
+
* panel, extracted from harness/driver.ts. Structural reads over projection
|
|
4
|
+
* state plus field-wise equality — no I/O and no harness state.
|
|
5
|
+
* @module @dsh-cc/tui/harness/usage-view
|
|
6
|
+
*/
|
|
7
|
+
/** Pull cumulative token totals out of a `tokenUsage` state value. */
|
|
8
|
+
export function totalsOf(usage) {
|
|
9
|
+
const totals = usage?.totals;
|
|
10
|
+
const input = totals?.uncachedInputTokens ?? totals?.inputTokens;
|
|
11
|
+
if (typeof input !== 'number' || typeof totals?.outputTokens !== 'number')
|
|
12
|
+
return undefined;
|
|
13
|
+
return {
|
|
14
|
+
input,
|
|
15
|
+
output: totals.outputTokens,
|
|
16
|
+
...typeof totals.cacheReadTokens === 'number' ? { cacheRead: totals.cacheReadTokens } : {},
|
|
17
|
+
...typeof totals.cacheWriteTokens === 'number' ? { cacheWrite: totals.cacheWriteTokens } : {},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** HUD-shaped subset of {@link totalsOf} (input/output only). */
|
|
21
|
+
export function tokensOf(usage) {
|
|
22
|
+
const totals = totalsOf(usage);
|
|
23
|
+
return totals === undefined ? undefined : { input: totals.input, output: totals.output };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Most recent API step's token buckets (the CC `current_usage` semantics)
|
|
27
|
+
* out of a `tokenUsage` state value. Returns undefined unless both the
|
|
28
|
+
* input (`uncachedInputTokens ?? inputTokens`) and output are finite
|
|
29
|
+
* numbers; the cache fields are included only when finite numbers, so a
|
|
30
|
+
* partial bucket degrades to its known members instead of NaNs.
|
|
31
|
+
*/
|
|
32
|
+
export function lastBucketsOf(usage) {
|
|
33
|
+
const buckets = usage?.last?.buckets;
|
|
34
|
+
const input = buckets?.uncachedInputTokens ?? buckets?.inputTokens;
|
|
35
|
+
if (typeof input !== 'number' || !Number.isFinite(input))
|
|
36
|
+
return undefined;
|
|
37
|
+
if (typeof buckets?.outputTokens !== 'number' || !Number.isFinite(buckets.outputTokens))
|
|
38
|
+
return undefined;
|
|
39
|
+
return {
|
|
40
|
+
inputTokens: input,
|
|
41
|
+
outputTokens: buckets.outputTokens,
|
|
42
|
+
...typeof buckets.cacheReadTokens === 'number' && Number.isFinite(buckets.cacheReadTokens)
|
|
43
|
+
? { cacheReadTokens: buckets.cacheReadTokens }
|
|
44
|
+
: {},
|
|
45
|
+
...typeof buckets.cacheWriteTokens === 'number' && Number.isFinite(buckets.cacheWriteTokens)
|
|
46
|
+
? { cacheWriteTokens: buckets.cacheWriteTokens }
|
|
47
|
+
: {},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* `/cost` report: token counts with thousands separators, cache lines only
|
|
52
|
+
* when non-zero, a `cache hit` percent (`cacheRead / (input + cacheRead)`,
|
|
53
|
+
* clamped at 100, shown only when `cacheRead` exists and the denominator is
|
|
54
|
+
* positive), and an explicit note that no price table is configured —
|
|
55
|
+
* the harness reports usage only, so no monetary amounts are claimed.
|
|
56
|
+
*/
|
|
57
|
+
export function formatCostReport(totals) {
|
|
58
|
+
if (totals === undefined)
|
|
59
|
+
return 'No token usage recorded yet.';
|
|
60
|
+
const row = (label, value) => ` ${label.padEnd(9)}${value.toLocaleString('en-US').padStart(6)}`;
|
|
61
|
+
const lines = [
|
|
62
|
+
'Token usage this session:',
|
|
63
|
+
row('input', totals.input),
|
|
64
|
+
row('output', totals.output),
|
|
65
|
+
];
|
|
66
|
+
if ((totals.cacheRead ?? 0) > 0)
|
|
67
|
+
lines.push(row('cache r', totals.cacheRead));
|
|
68
|
+
if ((totals.cacheWrite ?? 0) > 0)
|
|
69
|
+
lines.push(row('cache w', totals.cacheWrite));
|
|
70
|
+
if (totals.cacheRead !== undefined) {
|
|
71
|
+
const denominator = totals.input + totals.cacheRead;
|
|
72
|
+
if (denominator > 0) {
|
|
73
|
+
const percent = Math.max(0, Math.min(100, Math.round((totals.cacheRead / denominator) * 100)));
|
|
74
|
+
lines.push(` ${'cache hit'.padEnd(9)}${`${percent}%`.padStart(6)}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
lines.push(' Pricing is not configured — costs are not computed.');
|
|
78
|
+
return lines.join('\n');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Map a `todos` projection value (`TodoItem[] | null`) onto view items.
|
|
82
|
+
* Non-arrays (including the pre-first-write `null`) map to undefined (no
|
|
83
|
+
* strip); malformed entries inside an array are dropped defensively so one
|
|
84
|
+
* bad item degrades to a shorter list instead of a crash.
|
|
85
|
+
*/
|
|
86
|
+
export function todosOf(value) {
|
|
87
|
+
if (!Array.isArray(value))
|
|
88
|
+
return undefined;
|
|
89
|
+
const views = [];
|
|
90
|
+
for (const item of value) {
|
|
91
|
+
if (item === null || typeof item !== 'object')
|
|
92
|
+
continue;
|
|
93
|
+
const content = item.content;
|
|
94
|
+
const status = item.status;
|
|
95
|
+
if (typeof content !== 'string')
|
|
96
|
+
continue;
|
|
97
|
+
if (status !== 'pending' && status !== 'in_progress' && status !== 'completed')
|
|
98
|
+
continue;
|
|
99
|
+
views.push({ content, status });
|
|
100
|
+
}
|
|
101
|
+
return views;
|
|
102
|
+
}
|
|
103
|
+
/** Structural equality for two optional todo lists. */
|
|
104
|
+
export function sameTodos(a, b) {
|
|
105
|
+
if (a === b)
|
|
106
|
+
return true;
|
|
107
|
+
if (a === undefined || b === undefined || a.length !== b.length)
|
|
108
|
+
return false;
|
|
109
|
+
return a.every((item, i) => item.content === b[i].content && item.status === b[i].status);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Raw context-window occupancy behind {@link percentOf}: the latest sample
|
|
113
|
+
* plus the surface's movement since that sample was taken (the projection's
|
|
114
|
+
* anchor adjustment), falling back to the bare sample when no anchor exists.
|
|
115
|
+
* `window` is undefined — the result still being usable for exact-token
|
|
116
|
+
* display — when the projection does not expose a positive window. Callers
|
|
117
|
+
* must render from these raw counts, never back-derive them from the rounded
|
|
118
|
+
* percent.
|
|
119
|
+
*/
|
|
120
|
+
export function occupancyOf(pressure) {
|
|
121
|
+
const sample = pressure?.pressureTokens;
|
|
122
|
+
if (typeof sample !== 'number')
|
|
123
|
+
return undefined;
|
|
124
|
+
const { surfaceTokens, sampledSurfaceTokens } = pressure ?? {};
|
|
125
|
+
const used = typeof surfaceTokens === 'number' && typeof sampledSurfaceTokens === 'number'
|
|
126
|
+
? Math.max(0, sample + surfaceTokens - sampledSurfaceTokens)
|
|
127
|
+
: sample;
|
|
128
|
+
const contextWindow = pressure?.contextWindow;
|
|
129
|
+
const window = typeof contextWindow === 'number' && contextWindow > 0 ? contextWindow : undefined;
|
|
130
|
+
// exactOptionalPropertyTypes: `window` must be absent, not explicitly undefined.
|
|
131
|
+
return window === undefined ? { used } : { used, window };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Context-occupancy percent (0-100 int) from a `contextPressure` state
|
|
135
|
+
* value. Undefined until both numerator and denominator are known.
|
|
136
|
+
*/
|
|
137
|
+
export function percentOf(pressure) {
|
|
138
|
+
const occupancy = occupancyOf(pressure);
|
|
139
|
+
if (occupancy === undefined || occupancy.window === undefined)
|
|
140
|
+
return undefined;
|
|
141
|
+
return Math.max(0, Math.min(100, Math.round((occupancy.used / occupancy.window) * 100)));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Map a `contextBreakdown` projection value onto the usage panel's three role
|
|
145
|
+
* counts. Absent or malformed fields (shape drift, a partial value) degrade
|
|
146
|
+
* to no breakdown — the panel renders the whole section `n/a` instead of a
|
|
147
|
+
* misleading subset of numbers.
|
|
148
|
+
*/
|
|
149
|
+
export function breakdownOf(value) {
|
|
150
|
+
const raw = value;
|
|
151
|
+
if (raw === null || typeof raw !== 'object')
|
|
152
|
+
return undefined;
|
|
153
|
+
const { system, tools, messages } = raw;
|
|
154
|
+
if (typeof system !== 'number' || typeof tools !== 'number' || typeof messages !== 'number') {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
return { system, tools, messages };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Assemble the usage panel's view from the three projection reads. Absent
|
|
161
|
+
* sections stay absent (the panel renders each `n/a` independently); an
|
|
162
|
+
* all-absent read yields undefined so no empty snapshot is parked in state.
|
|
163
|
+
*/
|
|
164
|
+
export function usageViewOf(totals, occupancy, breakdown) {
|
|
165
|
+
const view = {};
|
|
166
|
+
if (totals !== undefined)
|
|
167
|
+
view.totals = totals;
|
|
168
|
+
if (occupancy !== undefined) {
|
|
169
|
+
view.contextUsed = occupancy.used;
|
|
170
|
+
if (occupancy.window !== undefined)
|
|
171
|
+
view.contextWindow = occupancy.window;
|
|
172
|
+
}
|
|
173
|
+
if (breakdown !== undefined)
|
|
174
|
+
view.breakdown = breakdown;
|
|
175
|
+
const empty = view.totals === undefined && view.contextUsed === undefined && view.breakdown === undefined;
|
|
176
|
+
return empty ? undefined : view;
|
|
177
|
+
}
|
|
178
|
+
/** Structural equality for two usage token-total sets. */
|
|
179
|
+
function sameTotals(a, b) {
|
|
180
|
+
if (a === undefined || b === undefined)
|
|
181
|
+
return a === b;
|
|
182
|
+
return a.input === b.input && a.output === b.output
|
|
183
|
+
&& a.cacheRead === b.cacheRead && a.cacheWrite === b.cacheWrite;
|
|
184
|
+
}
|
|
185
|
+
/** Structural equality for two usage breakdowns. */
|
|
186
|
+
export function sameBreakdown(a, b) {
|
|
187
|
+
if (a === undefined || b === undefined)
|
|
188
|
+
return a === b;
|
|
189
|
+
return a.system === b.system && a.tools === b.tools && a.messages === b.messages;
|
|
190
|
+
}
|
|
191
|
+
/** Structural equality for two usage snapshots (all sections field-wise). */
|
|
192
|
+
export function sameUsage(a, b) {
|
|
193
|
+
return a !== undefined
|
|
194
|
+
&& sameTotals(a.totals, b.totals)
|
|
195
|
+
&& a.contextUsed === b.contextUsed
|
|
196
|
+
&& a.contextWindow === b.contextWindow
|
|
197
|
+
&& sameBreakdown(a.breakdown, b.breakdown);
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=usage-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-view.js","sourceRoot":"","sources":["../../src/harness/usage-view.ts"],"names":[],"mappings":"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"}
|