@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.
Files changed (363) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +144 -0
  3. package/lib/bash-history.d.ts +31 -0
  4. package/lib/bash-history.d.ts.map +1 -0
  5. package/lib/bash-history.js +94 -0
  6. package/lib/bash-history.js.map +1 -0
  7. package/lib/compact-fold.d.ts +35 -0
  8. package/lib/compact-fold.d.ts.map +1 -0
  9. package/lib/compact-fold.js +60 -0
  10. package/lib/compact-fold.js.map +1 -0
  11. package/lib/components/arg-completers.d.ts +22 -0
  12. package/lib/components/arg-completers.d.ts.map +1 -0
  13. package/lib/components/arg-completers.js +75 -0
  14. package/lib/components/arg-completers.js.map +1 -0
  15. package/lib/components/code-theme.d.ts +25 -0
  16. package/lib/components/code-theme.d.ts.map +1 -0
  17. package/lib/components/code-theme.js +137 -0
  18. package/lib/components/code-theme.js.map +1 -0
  19. package/lib/components/completion.d.ts +50 -0
  20. package/lib/components/completion.d.ts.map +1 -0
  21. package/lib/components/completion.js +279 -0
  22. package/lib/components/completion.js.map +1 -0
  23. package/lib/components/diff-card.d.ts +29 -0
  24. package/lib/components/diff-card.d.ts.map +1 -0
  25. package/lib/components/diff-card.js +175 -0
  26. package/lib/components/diff-card.js.map +1 -0
  27. package/lib/components/diff-hunks.d.ts +44 -0
  28. package/lib/components/diff-hunks.d.ts.map +1 -0
  29. package/lib/components/diff-hunks.js +188 -0
  30. package/lib/components/diff-hunks.js.map +1 -0
  31. package/lib/components/editor-history.d.ts +23 -0
  32. package/lib/components/editor-history.d.ts.map +1 -0
  33. package/lib/components/editor-history.js +29 -0
  34. package/lib/components/editor-history.js.map +1 -0
  35. package/lib/components/markdown-theme.d.ts +11 -0
  36. package/lib/components/markdown-theme.d.ts.map +1 -0
  37. package/lib/components/markdown-theme.js +29 -0
  38. package/lib/components/markdown-theme.js.map +1 -0
  39. package/lib/components/masked-input.d.ts +24 -0
  40. package/lib/components/masked-input.d.ts.map +1 -0
  41. package/lib/components/masked-input.js +168 -0
  42. package/lib/components/masked-input.js.map +1 -0
  43. package/lib/components/overlay-host.d.ts +31 -0
  44. package/lib/components/overlay-host.d.ts.map +1 -0
  45. package/lib/components/overlay-host.js +128 -0
  46. package/lib/components/overlay-host.js.map +1 -0
  47. package/lib/components/overlays.d.ts +94 -0
  48. package/lib/components/overlays.d.ts.map +1 -0
  49. package/lib/components/overlays.js +450 -0
  50. package/lib/components/overlays.js.map +1 -0
  51. package/lib/components/provider-box.d.ts +23 -0
  52. package/lib/components/provider-box.d.ts.map +1 -0
  53. package/lib/components/provider-box.js +164 -0
  54. package/lib/components/provider-box.js.map +1 -0
  55. package/lib/components/read-group.d.ts +51 -0
  56. package/lib/components/read-group.d.ts.map +1 -0
  57. package/lib/components/read-group.js +105 -0
  58. package/lib/components/read-group.js.map +1 -0
  59. package/lib/components/root-bash.d.ts +36 -0
  60. package/lib/components/root-bash.d.ts.map +1 -0
  61. package/lib/components/root-bash.js +112 -0
  62. package/lib/components/root-bash.js.map +1 -0
  63. package/lib/components/root-types.d.ts +42 -0
  64. package/lib/components/root-types.d.ts.map +1 -0
  65. package/lib/components/root-types.js +8 -0
  66. package/lib/components/root-types.js.map +1 -0
  67. package/lib/components/root-utils.d.ts +22 -0
  68. package/lib/components/root-utils.d.ts.map +1 -0
  69. package/lib/components/root-utils.js +45 -0
  70. package/lib/components/root-utils.js.map +1 -0
  71. package/lib/components/root.d.ts +25 -0
  72. package/lib/components/root.d.ts.map +1 -0
  73. package/lib/components/root.js +357 -0
  74. package/lib/components/root.js.map +1 -0
  75. package/lib/components/theme.d.ts +61 -0
  76. package/lib/components/theme.d.ts.map +1 -0
  77. package/lib/components/theme.js +99 -0
  78. package/lib/components/theme.js.map +1 -0
  79. package/lib/components/transcript.d.ts +43 -0
  80. package/lib/components/transcript.d.ts.map +1 -0
  81. package/lib/components/transcript.js +203 -0
  82. package/lib/components/transcript.js.map +1 -0
  83. package/lib/components/working-line.d.ts +35 -0
  84. package/lib/components/working-line.d.ts.map +1 -0
  85. package/lib/components/working-line.js +66 -0
  86. package/lib/components/working-line.js.map +1 -0
  87. package/lib/effort-catalog.d.ts +27 -0
  88. package/lib/effort-catalog.d.ts.map +1 -0
  89. package/lib/effort-catalog.js +36 -0
  90. package/lib/effort-catalog.js.map +1 -0
  91. package/lib/export-markdown.d.ts +18 -0
  92. package/lib/export-markdown.d.ts.map +1 -0
  93. package/lib/export-markdown.js +124 -0
  94. package/lib/export-markdown.js.map +1 -0
  95. package/lib/harness/approval-preview.d.ts +33 -0
  96. package/lib/harness/approval-preview.d.ts.map +1 -0
  97. package/lib/harness/approval-preview.js +179 -0
  98. package/lib/harness/approval-preview.js.map +1 -0
  99. package/lib/harness/boot-banner.d.ts +14 -0
  100. package/lib/harness/boot-banner.d.ts.map +1 -0
  101. package/lib/harness/boot-banner.js +89 -0
  102. package/lib/harness/boot-banner.js.map +1 -0
  103. package/lib/harness/driver-agent.d.ts +78 -0
  104. package/lib/harness/driver-agent.d.ts.map +1 -0
  105. package/lib/harness/driver-agent.js +314 -0
  106. package/lib/harness/driver-agent.js.map +1 -0
  107. package/lib/harness/driver-agents.d.ts +20 -0
  108. package/lib/harness/driver-agents.d.ts.map +1 -0
  109. package/lib/harness/driver-agents.js +123 -0
  110. package/lib/harness/driver-agents.js.map +1 -0
  111. package/lib/harness/driver-approvals.d.ts +38 -0
  112. package/lib/harness/driver-approvals.d.ts.map +1 -0
  113. package/lib/harness/driver-approvals.js +277 -0
  114. package/lib/harness/driver-approvals.js.map +1 -0
  115. package/lib/harness/driver-bash.d.ts +15 -0
  116. package/lib/harness/driver-bash.d.ts.map +1 -0
  117. package/lib/harness/driver-bash.js +73 -0
  118. package/lib/harness/driver-bash.js.map +1 -0
  119. package/lib/harness/driver-catalog.d.ts +84 -0
  120. package/lib/harness/driver-catalog.d.ts.map +1 -0
  121. package/lib/harness/driver-catalog.js +256 -0
  122. package/lib/harness/driver-catalog.js.map +1 -0
  123. package/lib/harness/driver-ctx.d.ts +462 -0
  124. package/lib/harness/driver-ctx.d.ts.map +1 -0
  125. package/lib/harness/driver-ctx.js +11 -0
  126. package/lib/harness/driver-ctx.js.map +1 -0
  127. package/lib/harness/driver-hud.d.ts +31 -0
  128. package/lib/harness/driver-hud.d.ts.map +1 -0
  129. package/lib/harness/driver-hud.js +204 -0
  130. package/lib/harness/driver-hud.js.map +1 -0
  131. package/lib/harness/driver-live.d.ts +36 -0
  132. package/lib/harness/driver-live.d.ts.map +1 -0
  133. package/lib/harness/driver-live.js +44 -0
  134. package/lib/harness/driver-live.js.map +1 -0
  135. package/lib/harness/driver-modal.d.ts +52 -0
  136. package/lib/harness/driver-modal.d.ts.map +1 -0
  137. package/lib/harness/driver-modal.js +78 -0
  138. package/lib/harness/driver-modal.js.map +1 -0
  139. package/lib/harness/driver-mode.d.ts +35 -0
  140. package/lib/harness/driver-mode.d.ts.map +1 -0
  141. package/lib/harness/driver-mode.js +84 -0
  142. package/lib/harness/driver-mode.js.map +1 -0
  143. package/lib/harness/driver-pickers.d.ts +48 -0
  144. package/lib/harness/driver-pickers.d.ts.map +1 -0
  145. package/lib/harness/driver-pickers.js +249 -0
  146. package/lib/harness/driver-pickers.js.map +1 -0
  147. package/lib/harness/driver-promote.d.ts +29 -0
  148. package/lib/harness/driver-promote.d.ts.map +1 -0
  149. package/lib/harness/driver-promote.js +36 -0
  150. package/lib/harness/driver-promote.js.map +1 -0
  151. package/lib/harness/driver-queue.d.ts +19 -0
  152. package/lib/harness/driver-queue.d.ts.map +1 -0
  153. package/lib/harness/driver-queue.js +281 -0
  154. package/lib/harness/driver-queue.js.map +1 -0
  155. package/lib/harness/driver-run-local.d.ts +32 -0
  156. package/lib/harness/driver-run-local.d.ts.map +1 -0
  157. package/lib/harness/driver-run-local.js +366 -0
  158. package/lib/harness/driver-run-local.js.map +1 -0
  159. package/lib/harness/driver-sessions.d.ts +28 -0
  160. package/lib/harness/driver-sessions.d.ts.map +1 -0
  161. package/lib/harness/driver-sessions.js +386 -0
  162. package/lib/harness/driver-sessions.js.map +1 -0
  163. package/lib/harness/driver.d.ts +22 -0
  164. package/lib/harness/driver.d.ts.map +1 -0
  165. package/lib/harness/driver.js +459 -0
  166. package/lib/harness/driver.js.map +1 -0
  167. package/lib/harness/preset.d.ts +32 -0
  168. package/lib/harness/preset.d.ts.map +1 -0
  169. package/lib/harness/preset.js +34 -0
  170. package/lib/harness/preset.js.map +1 -0
  171. package/lib/harness/session-list.d.ts +65 -0
  172. package/lib/harness/session-list.d.ts.map +1 -0
  173. package/lib/harness/session-list.js +91 -0
  174. package/lib/harness/session-list.js.map +1 -0
  175. package/lib/harness/shell-output.d.ts +44 -0
  176. package/lib/harness/shell-output.d.ts.map +1 -0
  177. package/lib/harness/shell-output.js +90 -0
  178. package/lib/harness/shell-output.js.map +1 -0
  179. package/lib/harness/statusline-cc-transcript.d.ts +51 -0
  180. package/lib/harness/statusline-cc-transcript.d.ts.map +1 -0
  181. package/lib/harness/statusline-cc-transcript.js +191 -0
  182. package/lib/harness/statusline-cc-transcript.js.map +1 -0
  183. package/lib/harness/statusline-command.d.ts +54 -0
  184. package/lib/harness/statusline-command.d.ts.map +1 -0
  185. package/lib/harness/statusline-command.js +161 -0
  186. package/lib/harness/statusline-command.js.map +1 -0
  187. package/lib/harness/statusline-payload.d.ts +79 -0
  188. package/lib/harness/statusline-payload.d.ts.map +1 -0
  189. package/lib/harness/statusline-payload.js +93 -0
  190. package/lib/harness/statusline-payload.js.map +1 -0
  191. package/lib/harness/statusline-settings.d.ts +47 -0
  192. package/lib/harness/statusline-settings.d.ts.map +1 -0
  193. package/lib/harness/statusline-settings.js +57 -0
  194. package/lib/harness/statusline-settings.js.map +1 -0
  195. package/lib/harness/statusline-wiring.d.ts +45 -0
  196. package/lib/harness/statusline-wiring.d.ts.map +1 -0
  197. package/lib/harness/statusline-wiring.js +247 -0
  198. package/lib/harness/statusline-wiring.js.map +1 -0
  199. package/lib/harness/usage-view.d.ts +84 -0
  200. package/lib/harness/usage-view.d.ts.map +1 -0
  201. package/lib/harness/usage-view.js +199 -0
  202. package/lib/harness/usage-view.js.map +1 -0
  203. package/lib/harness/worktree-exit.d.ts +105 -0
  204. package/lib/harness/worktree-exit.d.ts.map +1 -0
  205. package/lib/harness/worktree-exit.js +168 -0
  206. package/lib/harness/worktree-exit.js.map +1 -0
  207. package/lib/history.d.ts +50 -0
  208. package/lib/history.d.ts.map +1 -0
  209. package/lib/history.js +139 -0
  210. package/lib/history.js.map +1 -0
  211. package/lib/index.d.ts +63 -0
  212. package/lib/index.d.ts.map +1 -0
  213. package/lib/index.js +54 -0
  214. package/lib/index.js.map +1 -0
  215. package/lib/input.d.ts +158 -0
  216. package/lib/input.d.ts.map +1 -0
  217. package/lib/input.js +400 -0
  218. package/lib/input.js.map +1 -0
  219. package/lib/invariant.d.ts +14 -0
  220. package/lib/invariant.d.ts.map +1 -0
  221. package/lib/invariant.js +20 -0
  222. package/lib/invariant.js.map +1 -0
  223. package/lib/mode-cycle.d.ts +22 -0
  224. package/lib/mode-cycle.d.ts.map +1 -0
  225. package/lib/mode-cycle.js +32 -0
  226. package/lib/mode-cycle.js.map +1 -0
  227. package/lib/model-catalog.d.ts +22 -0
  228. package/lib/model-catalog.d.ts.map +1 -0
  229. package/lib/model-catalog.js +45 -0
  230. package/lib/model-catalog.js.map +1 -0
  231. package/lib/packaged-preset.d.ts +32 -0
  232. package/lib/packaged-preset.d.ts.map +1 -0
  233. package/lib/packaged-preset.js +94 -0
  234. package/lib/packaged-preset.js.map +1 -0
  235. package/lib/plugin.d.ts +11 -0
  236. package/lib/plugin.d.ts.map +1 -0
  237. package/lib/plugin.js +88 -0
  238. package/lib/plugin.js.map +1 -0
  239. package/lib/profile.d.ts +4 -0
  240. package/lib/profile.d.ts.map +1 -0
  241. package/lib/profile.js +7 -0
  242. package/lib/profile.js.map +1 -0
  243. package/lib/project-sessions.d.ts +29 -0
  244. package/lib/project-sessions.d.ts.map +1 -0
  245. package/lib/project-sessions.js +60 -0
  246. package/lib/project-sessions.js.map +1 -0
  247. package/lib/project.d.ts +75 -0
  248. package/lib/project.d.ts.map +1 -0
  249. package/lib/project.js +196 -0
  250. package/lib/project.js.map +1 -0
  251. package/lib/provider-actions.d.ts +37 -0
  252. package/lib/provider-actions.d.ts.map +1 -0
  253. package/lib/provider-actions.js +417 -0
  254. package/lib/provider-actions.js.map +1 -0
  255. package/lib/provider-command.d.ts +109 -0
  256. package/lib/provider-command.d.ts.map +1 -0
  257. package/lib/provider-command.js +220 -0
  258. package/lib/provider-command.js.map +1 -0
  259. package/lib/provider-detail.d.ts +15 -0
  260. package/lib/provider-detail.d.ts.map +1 -0
  261. package/lib/provider-detail.js +201 -0
  262. package/lib/provider-detail.js.map +1 -0
  263. package/lib/provider-flow.d.ts +191 -0
  264. package/lib/provider-flow.d.ts.map +1 -0
  265. package/lib/provider-flow.js +192 -0
  266. package/lib/provider-flow.js.map +1 -0
  267. package/lib/provider-presets.d.ts +32 -0
  268. package/lib/provider-presets.d.ts.map +1 -0
  269. package/lib/provider-presets.js +105 -0
  270. package/lib/provider-presets.js.map +1 -0
  271. package/lib/provider-read.d.ts +63 -0
  272. package/lib/provider-read.d.ts.map +1 -0
  273. package/lib/provider-read.js +115 -0
  274. package/lib/provider-read.js.map +1 -0
  275. package/lib/provider-settings.d.ts +30 -0
  276. package/lib/provider-settings.d.ts.map +1 -0
  277. package/lib/provider-settings.js +65 -0
  278. package/lib/provider-settings.js.map +1 -0
  279. package/lib/resume-target.d.ts +59 -0
  280. package/lib/resume-target.d.ts.map +1 -0
  281. package/lib/resume-target.js +143 -0
  282. package/lib/resume-target.js.map +1 -0
  283. package/lib/slash.d.ts +44 -0
  284. package/lib/slash.d.ts.map +1 -0
  285. package/lib/slash.js +81 -0
  286. package/lib/slash.js.map +1 -0
  287. package/lib/state/driver-types.d.ts +505 -0
  288. package/lib/state/driver-types.d.ts.map +1 -0
  289. package/lib/state/driver-types.js +8 -0
  290. package/lib/state/driver-types.js.map +1 -0
  291. package/lib/state/driver-usage-types.d.ts +59 -0
  292. package/lib/state/driver-usage-types.d.ts.map +1 -0
  293. package/lib/state/driver-usage-types.js +8 -0
  294. package/lib/state/driver-usage-types.js.map +1 -0
  295. package/lib/statusline.d.ts +63 -0
  296. package/lib/statusline.d.ts.map +1 -0
  297. package/lib/statusline.js +97 -0
  298. package/lib/statusline.js.map +1 -0
  299. package/lib/store/pickers.d.ts +34 -0
  300. package/lib/store/pickers.d.ts.map +1 -0
  301. package/lib/store/pickers.js +111 -0
  302. package/lib/store/pickers.js.map +1 -0
  303. package/lib/store/provider-panel.d.ts +107 -0
  304. package/lib/store/provider-panel.d.ts.map +1 -0
  305. package/lib/store/provider-panel.js +151 -0
  306. package/lib/store/provider-panel.js.map +1 -0
  307. package/lib/store/question.d.ts +21 -0
  308. package/lib/store/question.d.ts.map +1 -0
  309. package/lib/store/question.js +59 -0
  310. package/lib/store/question.js.map +1 -0
  311. package/lib/store/queue.d.ts +27 -0
  312. package/lib/store/queue.d.ts.map +1 -0
  313. package/lib/store/queue.js +34 -0
  314. package/lib/store/queue.js.map +1 -0
  315. package/lib/store/session.d.ts +73 -0
  316. package/lib/store/session.d.ts.map +1 -0
  317. package/lib/store/session.js +172 -0
  318. package/lib/store/session.js.map +1 -0
  319. package/lib/store/subagents.d.ts +16 -0
  320. package/lib/store/subagents.d.ts.map +1 -0
  321. package/lib/store/subagents.js +44 -0
  322. package/lib/store/subagents.js.map +1 -0
  323. package/lib/store/todos.d.ts +35 -0
  324. package/lib/store/todos.d.ts.map +1 -0
  325. package/lib/store/todos.js +68 -0
  326. package/lib/store/todos.js.map +1 -0
  327. package/lib/store/usage.d.ts +15 -0
  328. package/lib/store/usage.d.ts.map +1 -0
  329. package/lib/store/usage.js +27 -0
  330. package/lib/store/usage.js.map +1 -0
  331. package/lib/store/views.d.ts +419 -0
  332. package/lib/store/views.d.ts.map +1 -0
  333. package/lib/store/views.js +3 -0
  334. package/lib/store/views.js.map +1 -0
  335. package/lib/store.d.ts +19 -0
  336. package/lib/store.d.ts.map +1 -0
  337. package/lib/store.js +10 -0
  338. package/lib/store.js.map +1 -0
  339. package/lib/terminal/lease.d.ts +33 -0
  340. package/lib/terminal/lease.d.ts.map +1 -0
  341. package/lib/terminal/lease.js +99 -0
  342. package/lib/terminal/lease.js.map +1 -0
  343. package/lib/tool-card.d.ts +75 -0
  344. package/lib/tool-card.d.ts.map +1 -0
  345. package/lib/tool-card.js +109 -0
  346. package/lib/tool-card.js.map +1 -0
  347. package/lib/tool-verbs.d.ts +12 -0
  348. package/lib/tool-verbs.d.ts.map +1 -0
  349. package/lib/tool-verbs.js +29 -0
  350. package/lib/tool-verbs.js.map +1 -0
  351. package/lib/transcript.d.ts +40 -0
  352. package/lib/transcript.d.ts.map +1 -0
  353. package/lib/transcript.js +413 -0
  354. package/lib/transcript.js.map +1 -0
  355. package/lib/working-line.d.ts +44 -0
  356. package/lib/working-line.d.ts.map +1 -0
  357. package/lib/working-line.js +56 -0
  358. package/lib/working-line.js.map +1 -0
  359. package/package.json +72 -0
  360. package/presets/cc/.dsh-cc-managed.json +5 -0
  361. package/presets/cc/agent.cordis.yml +524 -0
  362. package/presets/cc/preset.yml +3 -0
  363. 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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"}