@selesai/code 0.9.6 → 0.9.9

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 (281) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/agent-session-runtime.js +1 -4
  5. package/dist/core/agent-session.d.ts +2 -0
  6. package/dist/core/agent-session.js +26 -0
  7. package/dist/core/compaction/branch-summarization.js +30 -30
  8. package/dist/core/compaction/compaction.js +81 -81
  9. package/dist/core/compaction/utils.js +2 -2
  10. package/dist/core/export-html/template.css +1066 -1066
  11. package/dist/core/export-html/template.html +55 -55
  12. package/dist/core/export-html/template.js +1864 -1864
  13. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  14. package/dist/core/export-html/vendor/marked.min.js +78 -78
  15. package/dist/core/handoff.d.ts +11 -0
  16. package/dist/core/handoff.js +49 -0
  17. package/dist/core/messages.js +7 -7
  18. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  19. package/dist/extensions/context-compaction-reminder.ts +28 -28
  20. package/dist/extensions/handoff-new.ts +14 -75
  21. package/dist/extensions/pi-intercom/LICENSE +21 -21
  22. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  23. package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -387
  24. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  25. package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -153
  26. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  27. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  28. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  29. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  30. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  31. package/dist/extensions/pi-intercom/extension-api.ts +44 -44
  32. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  33. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  34. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  35. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  36. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  37. package/dist/extensions/pi-powerline-footer/bash-mode/shell-session.ts +286 -286
  38. package/dist/extensions/pi-powerline-footer/bash-mode/transcript.ts +108 -108
  39. package/dist/extensions/pi-powerline-footer/separators.ts +57 -57
  40. package/dist/extensions/pi-powerline-footer/tests/session-usage.test.ts +47 -47
  41. package/dist/extensions/pi-powerline-footer/tests/tps.test.ts +39 -39
  42. package/dist/extensions/pi-powerline-footer/theme.example.json +24 -24
  43. package/dist/extensions/pi-powerline-footer/theme.json +12 -12
  44. package/dist/extensions/pi-powerline-footer/tps.ts +345 -345
  45. package/dist/extensions/pi-rewind-hook/README.md +245 -245
  46. package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
  47. package/dist/extensions/pi-rewind-hook/package.json +29 -29
  48. package/dist/extensions/pi-subagents/install.mjs +0 -0
  49. package/dist/extensions/pi-web-agent/package.json +31 -31
  50. package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
  51. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
  52. package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
  53. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  54. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  55. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  56. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
  57. package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
  58. package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
  59. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  60. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  61. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  62. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  63. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  64. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
  65. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
  66. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
  67. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
  68. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  69. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  70. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
  71. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
  72. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
  73. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
  74. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  75. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  76. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  77. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
  78. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  79. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
  80. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  81. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  82. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  83. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
  84. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  85. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  86. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  87. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  88. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
  89. package/dist/extensions/pi-web-agent/src/types.ts +88 -88
  90. package/dist/extensions/ponytail/package.json +8 -8
  91. package/dist/extensions/question/batch.ts +103 -103
  92. package/dist/extensions/question/constants.ts +30 -30
  93. package/dist/extensions/question/helpers.ts +58 -58
  94. package/dist/extensions/question/navigation.ts +14 -14
  95. package/dist/extensions/question/package.json +19 -19
  96. package/dist/extensions/question/schemas.ts +43 -43
  97. package/dist/extensions/question/selection-mode.ts +46 -46
  98. package/dist/extensions/question/shortcuts.ts +44 -44
  99. package/dist/extensions/question/types.ts +132 -132
  100. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  101. package/dist/extensions/test-resolve-hook.mjs +6 -6
  102. package/dist/extensions/web-agent-onboarding.ts +222 -222
  103. package/dist/extensions/workflow/package.json +17 -17
  104. package/dist/modes/rpc/rpc-mode.js +24 -0
  105. package/dist/modes/rpc/rpc-types.d.ts +19 -0
  106. package/dist/package-manager-cli.js +71 -71
  107. package/dist/rpc-entry.js +0 -0
  108. package/dist/skills/agent-browser/SKILL.md +52 -52
  109. package/dist/skills/batch-grill-me/SKILL.md +19 -19
  110. package/dist/skills/grill-me/SKILL.md +10 -10
  111. package/dist/skills/handoff/SKILL.md +16 -16
  112. package/dist/skills/handoff-text/SKILL.md +14 -14
  113. package/dist/skills/implanger/SKILL.md +69 -69
  114. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  115. package/dist/skills/improve-codebase/SKILL.md +178 -178
  116. package/dist/skills/planger/SKILL.md +166 -166
  117. package/dist/skills/ponytail/SKILL.md +116 -116
  118. package/dist/skills/ponytail-audit/SKILL.md +42 -42
  119. package/dist/skills/ponytail-debt/SKILL.md +45 -45
  120. package/dist/skills/ponytail-gain/SKILL.md +51 -51
  121. package/dist/skills/ponytail-help/SKILL.md +70 -70
  122. package/dist/skills/ponytail-review/SKILL.md +58 -58
  123. package/dist/skills/selesai-handoff/SKILL.md +20 -20
  124. package/dist/skills/workflow-creation/SKILL.md +73 -73
  125. package/dist/themes/powerline-footer/theme.json +33 -33
  126. package/docs/compaction.md +396 -396
  127. package/docs/containerization.md +111 -111
  128. package/docs/development.md +71 -71
  129. package/docs/docs.json +164 -164
  130. package/docs/environment-variables.md +86 -86
  131. package/docs/index.md +83 -83
  132. package/docs/json.md +82 -82
  133. package/docs/models.md +502 -502
  134. package/docs/packages.md +227 -227
  135. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  136. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  137. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  138. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  139. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  140. package/docs/prompt-templates.md +95 -95
  141. package/docs/providers.md +293 -293
  142. package/docs/sdk.md +1143 -1143
  143. package/docs/security.md +59 -59
  144. package/docs/session-format.md +414 -414
  145. package/docs/sessions.md +145 -145
  146. package/docs/shared-host-extensions.md +109 -109
  147. package/docs/shell-aliases.md +13 -13
  148. package/docs/skills.md +231 -231
  149. package/docs/terminal-setup.md +142 -142
  150. package/docs/termux.md +127 -127
  151. package/docs/themes.md +295 -295
  152. package/docs/tmux.md +63 -63
  153. package/docs/tui.md +927 -927
  154. package/docs/windows.md +17 -17
  155. package/examples/README.md +25 -25
  156. package/examples/extensions/README.md +211 -211
  157. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  158. package/examples/extensions/bash-spawn-hook.ts +30 -30
  159. package/examples/extensions/bookmark.ts +50 -50
  160. package/examples/extensions/border-status-editor.ts +150 -150
  161. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  162. package/examples/extensions/claude-rules.ts +86 -86
  163. package/examples/extensions/commands.ts +72 -72
  164. package/examples/extensions/confirm-destructive.ts +59 -59
  165. package/examples/extensions/custom-compaction.ts +130 -130
  166. package/examples/extensions/custom-footer.ts +64 -64
  167. package/examples/extensions/custom-header.ts +73 -73
  168. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  169. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  170. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  171. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  172. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  173. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  174. package/examples/extensions/dirty-repo-guard.ts +56 -56
  175. package/examples/extensions/doom-overlay/README.md +46 -46
  176. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  177. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  178. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  179. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  180. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  181. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  182. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  183. package/examples/extensions/doom-overlay/index.ts +74 -74
  184. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  185. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  186. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  187. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  188. package/examples/extensions/dynamic-resources/index.ts +15 -15
  189. package/examples/extensions/dynamic-tools.ts +74 -74
  190. package/examples/extensions/event-bus.ts +43 -43
  191. package/examples/extensions/file-trigger.ts +41 -41
  192. package/examples/extensions/git-checkpoint.ts +53 -53
  193. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  194. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  195. package/examples/extensions/gondolin/index.ts +531 -531
  196. package/examples/extensions/gondolin/package-lock.json +185 -185
  197. package/examples/extensions/gondolin/package.json +19 -19
  198. package/examples/extensions/handoff.ts +199 -199
  199. package/examples/extensions/hello.ts +26 -26
  200. package/examples/extensions/hidden-thinking-label.ts +53 -53
  201. package/examples/extensions/inline-bash.ts +94 -94
  202. package/examples/extensions/input-transform-streaming.ts +39 -39
  203. package/examples/extensions/input-transform.ts +43 -43
  204. package/examples/extensions/interactive-shell.ts +196 -196
  205. package/examples/extensions/mac-system-theme.ts +47 -47
  206. package/examples/extensions/message-renderer.ts +59 -59
  207. package/examples/extensions/minimal-mode.ts +426 -426
  208. package/examples/extensions/modal-editor.ts +85 -85
  209. package/examples/extensions/model-status.ts +31 -31
  210. package/examples/extensions/notify.ts +55 -55
  211. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  212. package/examples/extensions/overlay-test.ts +153 -153
  213. package/examples/extensions/permission-gate.ts +34 -34
  214. package/examples/extensions/pirate.ts +47 -47
  215. package/examples/extensions/plan-mode/README.md +66 -66
  216. package/examples/extensions/plan-mode/index.ts +390 -390
  217. package/examples/extensions/plan-mode/utils.ts +168 -168
  218. package/examples/extensions/preset.ts +436 -436
  219. package/examples/extensions/project-trust.ts +64 -64
  220. package/examples/extensions/prompt-customizer.ts +97 -97
  221. package/examples/extensions/protected-paths.ts +30 -30
  222. package/examples/extensions/provider-payload.ts +18 -18
  223. package/examples/extensions/qna.ts +122 -122
  224. package/examples/extensions/question.ts +285 -285
  225. package/examples/extensions/questionnaire.ts +448 -448
  226. package/examples/extensions/rainbow-editor.ts +88 -88
  227. package/examples/extensions/reload-runtime.ts +37 -37
  228. package/examples/extensions/rpc-demo.ts +118 -118
  229. package/examples/extensions/sandbox/index.ts +321 -321
  230. package/examples/extensions/sandbox/package-lock.json +92 -92
  231. package/examples/extensions/sandbox/package.json +19 -19
  232. package/examples/extensions/send-user-message.ts +97 -97
  233. package/examples/extensions/session-name.ts +27 -27
  234. package/examples/extensions/shutdown-command.ts +63 -63
  235. package/examples/extensions/snake.ts +343 -343
  236. package/examples/extensions/space-invaders.ts +560 -560
  237. package/examples/extensions/ssh.ts +220 -220
  238. package/examples/extensions/status-line.ts +32 -32
  239. package/examples/extensions/structured-output.ts +65 -65
  240. package/examples/extensions/subagent/README.md +175 -175
  241. package/examples/extensions/subagent/agents/planner.md +37 -37
  242. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  243. package/examples/extensions/subagent/agents/scout.md +50 -50
  244. package/examples/extensions/subagent/agents/worker.md +24 -24
  245. package/examples/extensions/subagent/agents.ts +126 -126
  246. package/examples/extensions/subagent/index.ts +1015 -1015
  247. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  248. package/examples/extensions/subagent/prompts/implement.md +10 -10
  249. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  250. package/examples/extensions/summarize.ts +209 -209
  251. package/examples/extensions/system-prompt-header.ts +17 -17
  252. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  253. package/examples/extensions/timed-confirm.ts +70 -70
  254. package/examples/extensions/titlebar-spinner.ts +58 -58
  255. package/examples/extensions/todo.ts +297 -297
  256. package/examples/extensions/tool-override.ts +144 -144
  257. package/examples/extensions/tools.ts +146 -146
  258. package/examples/extensions/trigger-compact.ts +50 -50
  259. package/examples/extensions/truncated-tool.ts +195 -195
  260. package/examples/extensions/widget-placement.ts +9 -9
  261. package/examples/extensions/with-deps/index.ts +32 -32
  262. package/examples/extensions/with-deps/package-lock.json +31 -31
  263. package/examples/extensions/with-deps/package.json +22 -22
  264. package/examples/extensions/working-indicator.ts +123 -123
  265. package/examples/extensions/working-message-test.ts +25 -25
  266. package/examples/rpc-extension-ui.ts +632 -632
  267. package/examples/sdk/01-minimal.ts +26 -26
  268. package/examples/sdk/02-custom-model.ts +53 -53
  269. package/examples/sdk/03-custom-prompt.ts +75 -75
  270. package/examples/sdk/04-skills.ts +55 -55
  271. package/examples/sdk/05-tools.ts +48 -48
  272. package/examples/sdk/06-extensions.ts +99 -99
  273. package/examples/sdk/07-context-files.ts +47 -47
  274. package/examples/sdk/08-prompt-templates.ts +51 -51
  275. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  276. package/examples/sdk/10-settings.ts +53 -53
  277. package/examples/sdk/11-sessions.ts +52 -52
  278. package/examples/sdk/12-full-control.ts +79 -79
  279. package/examples/sdk/13-session-runtime.ts +67 -67
  280. package/examples/sdk/README.md +144 -144
  281. package/package.json +1 -1
@@ -1,108 +1,108 @@
1
- import type { BashCommandRecord, BashModeSettings, BashTranscriptSnapshot } from "./types.ts";
2
-
3
- function byteLength(value: string): number {
4
- return Buffer.byteLength(value, "utf8");
5
- }
6
-
7
- function compactLines(lines: string[]): string[] {
8
- const normalized: string[] = [];
9
- for (const line of lines) {
10
- const sanitized = line.replace(/\r/g, "");
11
- if (sanitized.length === 0) {
12
- normalized.push("");
13
- continue;
14
- }
15
- normalized.push(...sanitized.split("\n"));
16
- }
17
- return normalized;
18
- }
19
-
20
- export class BashTranscriptStore {
21
- private readonly settings: Pick<BashModeSettings, "transcriptMaxLines" | "transcriptMaxBytes">;
22
- private commands: BashCommandRecord[] = [];
23
- private commandIndex = new Map<string, BashCommandRecord>();
24
- private totalLines = 0;
25
- private totalBytes = 0;
26
- private truncatedCommands = 0;
27
-
28
- constructor(settings: Pick<BashModeSettings, "transcriptMaxLines" | "transcriptMaxBytes">) {
29
- this.settings = settings;
30
- }
31
-
32
- startCommand(id: string, command: string, cwdAtStart: string): BashCommandRecord {
33
- const entry: BashCommandRecord = {
34
- id,
35
- command,
36
- cwdAtStart,
37
- startedAt: Date.now(),
38
- output: [],
39
- outputBytes: 0,
40
- exitCode: null,
41
- finishedAt: null,
42
- truncated: false,
43
- };
44
-
45
- this.commands.push(entry);
46
- this.commandIndex.set(id, entry);
47
- this.enforceLimits();
48
- return entry;
49
- }
50
-
51
- appendOutput(id: string, chunk: string): void {
52
- const entry = this.commandIndex.get(id);
53
- if (!entry || !chunk) return;
54
-
55
- const lines = compactLines([chunk]);
56
- if (lines.length === 0) return;
57
-
58
- entry.output.push(...lines);
59
- const addedBytes = lines.reduce((sum, line) => sum + byteLength(line) + 1, 0);
60
- entry.outputBytes += addedBytes;
61
- this.totalLines += lines.length;
62
- this.totalBytes += addedBytes;
63
- this.enforceLimits();
64
- }
65
-
66
- finishCommand(id: string, exitCode: number): void {
67
- const entry = this.commandIndex.get(id);
68
- if (!entry) return;
69
-
70
- entry.exitCode = exitCode;
71
- entry.finishedAt = Date.now();
72
- }
73
-
74
- clear(): void {
75
- this.commands = [];
76
- this.commandIndex.clear();
77
- this.totalLines = 0;
78
- this.totalBytes = 0;
79
- this.truncatedCommands = 0;
80
- }
81
-
82
- getSnapshot(): BashTranscriptSnapshot {
83
- return {
84
- commands: this.commands.map((command) => ({
85
- ...command,
86
- output: [...command.output],
87
- })),
88
- totalLines: this.totalLines,
89
- totalBytes: this.totalBytes,
90
- truncatedCommands: this.truncatedCommands,
91
- };
92
- }
93
-
94
- private enforceLimits(): void {
95
- while (
96
- this.commands.length > 1
97
- && (this.totalLines > this.settings.transcriptMaxLines || this.totalBytes > this.settings.transcriptMaxBytes)
98
- ) {
99
- const removed = this.commands.shift();
100
- if (!removed) break;
101
- this.commandIndex.delete(removed.id);
102
- this.totalLines = Math.max(0, this.totalLines - removed.output.length);
103
- this.totalBytes = Math.max(0, this.totalBytes - removed.outputBytes);
104
- this.truncatedCommands += 1;
105
- removed.truncated = true;
106
- }
107
- }
108
- }
1
+ import type { BashCommandRecord, BashModeSettings, BashTranscriptSnapshot } from "./types.ts";
2
+
3
+ function byteLength(value: string): number {
4
+ return Buffer.byteLength(value, "utf8");
5
+ }
6
+
7
+ function compactLines(lines: string[]): string[] {
8
+ const normalized: string[] = [];
9
+ for (const line of lines) {
10
+ const sanitized = line.replace(/\r/g, "");
11
+ if (sanitized.length === 0) {
12
+ normalized.push("");
13
+ continue;
14
+ }
15
+ normalized.push(...sanitized.split("\n"));
16
+ }
17
+ return normalized;
18
+ }
19
+
20
+ export class BashTranscriptStore {
21
+ private readonly settings: Pick<BashModeSettings, "transcriptMaxLines" | "transcriptMaxBytes">;
22
+ private commands: BashCommandRecord[] = [];
23
+ private commandIndex = new Map<string, BashCommandRecord>();
24
+ private totalLines = 0;
25
+ private totalBytes = 0;
26
+ private truncatedCommands = 0;
27
+
28
+ constructor(settings: Pick<BashModeSettings, "transcriptMaxLines" | "transcriptMaxBytes">) {
29
+ this.settings = settings;
30
+ }
31
+
32
+ startCommand(id: string, command: string, cwdAtStart: string): BashCommandRecord {
33
+ const entry: BashCommandRecord = {
34
+ id,
35
+ command,
36
+ cwdAtStart,
37
+ startedAt: Date.now(),
38
+ output: [],
39
+ outputBytes: 0,
40
+ exitCode: null,
41
+ finishedAt: null,
42
+ truncated: false,
43
+ };
44
+
45
+ this.commands.push(entry);
46
+ this.commandIndex.set(id, entry);
47
+ this.enforceLimits();
48
+ return entry;
49
+ }
50
+
51
+ appendOutput(id: string, chunk: string): void {
52
+ const entry = this.commandIndex.get(id);
53
+ if (!entry || !chunk) return;
54
+
55
+ const lines = compactLines([chunk]);
56
+ if (lines.length === 0) return;
57
+
58
+ entry.output.push(...lines);
59
+ const addedBytes = lines.reduce((sum, line) => sum + byteLength(line) + 1, 0);
60
+ entry.outputBytes += addedBytes;
61
+ this.totalLines += lines.length;
62
+ this.totalBytes += addedBytes;
63
+ this.enforceLimits();
64
+ }
65
+
66
+ finishCommand(id: string, exitCode: number): void {
67
+ const entry = this.commandIndex.get(id);
68
+ if (!entry) return;
69
+
70
+ entry.exitCode = exitCode;
71
+ entry.finishedAt = Date.now();
72
+ }
73
+
74
+ clear(): void {
75
+ this.commands = [];
76
+ this.commandIndex.clear();
77
+ this.totalLines = 0;
78
+ this.totalBytes = 0;
79
+ this.truncatedCommands = 0;
80
+ }
81
+
82
+ getSnapshot(): BashTranscriptSnapshot {
83
+ return {
84
+ commands: this.commands.map((command) => ({
85
+ ...command,
86
+ output: [...command.output],
87
+ })),
88
+ totalLines: this.totalLines,
89
+ totalBytes: this.totalBytes,
90
+ truncatedCommands: this.truncatedCommands,
91
+ };
92
+ }
93
+
94
+ private enforceLimits(): void {
95
+ while (
96
+ this.commands.length > 1
97
+ && (this.totalLines > this.settings.transcriptMaxLines || this.totalBytes > this.settings.transcriptMaxBytes)
98
+ ) {
99
+ const removed = this.commands.shift();
100
+ if (!removed) break;
101
+ this.commandIndex.delete(removed.id);
102
+ this.totalLines = Math.max(0, this.totalLines - removed.output.length);
103
+ this.totalBytes = Math.max(0, this.totalBytes - removed.outputBytes);
104
+ this.truncatedCommands += 1;
105
+ removed.truncated = true;
106
+ }
107
+ }
108
+ }
@@ -1,57 +1,57 @@
1
- import type { SeparatorDef, StatusLineSeparatorStyle } from "./types.ts";
2
- import { getSeparatorChars } from "./icons.ts";
3
-
4
- export function getSeparator(style: StatusLineSeparatorStyle): SeparatorDef {
5
- const chars = getSeparatorChars();
6
-
7
- switch (style) {
8
- case "powerline":
9
- return {
10
- left: chars.powerlineLeft,
11
- right: chars.powerlineRight,
12
- endCaps: {
13
- left: chars.powerlineRight,
14
- right: chars.powerlineLeft,
15
- useBgAsFg: true,
16
- },
17
- };
18
-
19
- case "powerline-thin":
20
- return {
21
- left: chars.powerlineThinLeft,
22
- right: chars.powerlineThinRight,
23
- endCaps: {
24
- left: chars.powerlineRight,
25
- right: chars.powerlineLeft,
26
- useBgAsFg: true,
27
- },
28
- };
29
-
30
- case "slash":
31
- return { left: ` ${chars.slash} `, right: ` ${chars.slash} ` };
32
-
33
- case "pipe":
34
- return { left: ` ${chars.pipe} `, right: ` ${chars.pipe} ` };
35
-
36
- case "block":
37
- return { left: chars.block, right: chars.block };
38
-
39
- case "none":
40
- return { left: chars.space, right: chars.space };
41
-
42
- case "ascii":
43
- return { left: chars.asciiLeft, right: chars.asciiRight };
44
-
45
- case "dot":
46
- return { left: chars.dot, right: chars.dot };
47
-
48
- case "chevron":
49
- return { left: "›", right: "‹" };
50
-
51
- case "star":
52
- return { left: "✦", right: "✦" };
53
-
54
- default:
55
- return getSeparator("powerline-thin");
56
- }
57
- }
1
+ import type { SeparatorDef, StatusLineSeparatorStyle } from "./types.ts";
2
+ import { getSeparatorChars } from "./icons.ts";
3
+
4
+ export function getSeparator(style: StatusLineSeparatorStyle): SeparatorDef {
5
+ const chars = getSeparatorChars();
6
+
7
+ switch (style) {
8
+ case "powerline":
9
+ return {
10
+ left: chars.powerlineLeft,
11
+ right: chars.powerlineRight,
12
+ endCaps: {
13
+ left: chars.powerlineRight,
14
+ right: chars.powerlineLeft,
15
+ useBgAsFg: true,
16
+ },
17
+ };
18
+
19
+ case "powerline-thin":
20
+ return {
21
+ left: chars.powerlineThinLeft,
22
+ right: chars.powerlineThinRight,
23
+ endCaps: {
24
+ left: chars.powerlineRight,
25
+ right: chars.powerlineLeft,
26
+ useBgAsFg: true,
27
+ },
28
+ };
29
+
30
+ case "slash":
31
+ return { left: ` ${chars.slash} `, right: ` ${chars.slash} ` };
32
+
33
+ case "pipe":
34
+ return { left: ` ${chars.pipe} `, right: ` ${chars.pipe} ` };
35
+
36
+ case "block":
37
+ return { left: chars.block, right: chars.block };
38
+
39
+ case "none":
40
+ return { left: chars.space, right: chars.space };
41
+
42
+ case "ascii":
43
+ return { left: chars.asciiLeft, right: chars.asciiRight };
44
+
45
+ case "dot":
46
+ return { left: chars.dot, right: chars.dot };
47
+
48
+ case "chevron":
49
+ return { left: "›", right: "‹" };
50
+
51
+ case "star":
52
+ return { left: "✦", right: "✦" };
53
+
54
+ default:
55
+ return getSeparator("powerline-thin");
56
+ }
57
+ }
@@ -1,47 +1,47 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
- import { readAsyncSubagentUsage, readSubagentToolResultUsage } from "../session-usage.ts";
4
-
5
- test("reads all completed subagent usage from a parent tool result", () => {
6
- assert.deepEqual(
7
- readSubagentToolResultUsage({
8
- role: "toolResult",
9
- toolName: "subagent",
10
- details: {
11
- totalChildUsage: {
12
- input: 120,
13
- output: 34,
14
- cacheRead: 56,
15
- cacheWrite: 7,
16
- cost: 0.123,
17
- turns: 2,
18
- },
19
- },
20
- }),
21
- { input: 120, output: 34, cacheRead: 56, cacheWrite: 7, cost: 0.123 },
22
- );
23
- });
24
-
25
- test("reads asynchronous completion usage", () => {
26
- assert.deepEqual(
27
- readAsyncSubagentUsage({
28
- id: "async-123",
29
- sessionId: "parent-session",
30
- totalChildUsage: { input: 20, output: 8, cacheRead: 13, cacheWrite: 0, cost: 0.02 },
31
- }),
32
- {
33
- runId: "async-123",
34
- sessionId: "parent-session",
35
- usage: { input: 20, output: 8, cacheRead: 13, cacheWrite: 0, cost: 0.02 },
36
- },
37
- );
38
- });
39
-
40
- test("does not treat other tool results or malformed usage as child usage", () => {
41
- assert.equal(readSubagentToolResultUsage({ role: "toolResult", toolName: "bash", details: {} }), null);
42
- assert.equal(readSubagentToolResultUsage({
43
- role: "toolResult",
44
- toolName: "subagent",
45
- details: { totalChildUsage: { input: 1, output: 2 } },
46
- }), null);
47
- });
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { readAsyncSubagentUsage, readSubagentToolResultUsage } from "../session-usage.ts";
4
+
5
+ test("reads all completed subagent usage from a parent tool result", () => {
6
+ assert.deepEqual(
7
+ readSubagentToolResultUsage({
8
+ role: "toolResult",
9
+ toolName: "subagent",
10
+ details: {
11
+ totalChildUsage: {
12
+ input: 120,
13
+ output: 34,
14
+ cacheRead: 56,
15
+ cacheWrite: 7,
16
+ cost: 0.123,
17
+ turns: 2,
18
+ },
19
+ },
20
+ }),
21
+ { input: 120, output: 34, cacheRead: 56, cacheWrite: 7, cost: 0.123 },
22
+ );
23
+ });
24
+
25
+ test("reads asynchronous completion usage", () => {
26
+ assert.deepEqual(
27
+ readAsyncSubagentUsage({
28
+ id: "async-123",
29
+ sessionId: "parent-session",
30
+ totalChildUsage: { input: 20, output: 8, cacheRead: 13, cacheWrite: 0, cost: 0.02 },
31
+ }),
32
+ {
33
+ runId: "async-123",
34
+ sessionId: "parent-session",
35
+ usage: { input: 20, output: 8, cacheRead: 13, cacheWrite: 0, cost: 0.02 },
36
+ },
37
+ );
38
+ });
39
+
40
+ test("does not treat other tool results or malformed usage as child usage", () => {
41
+ assert.equal(readSubagentToolResultUsage({ role: "toolResult", toolName: "bash", details: {} }), null);
42
+ assert.equal(readSubagentToolResultUsage({
43
+ role: "toolResult",
44
+ toolName: "subagent",
45
+ details: { totalChildUsage: { input: 1, output: 2 } },
46
+ }), null);
47
+ });
@@ -1,39 +1,39 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
- import { calculateReliableTps, type TpsTiming } from "../tps.ts";
4
-
5
- function timing(overrides: Partial<TpsTiming> = {}): TpsTiming {
6
- return {
7
- messageStartMs: 0,
8
- lastUpdateMs: 350,
9
- firstTokenMs: 100,
10
- updateCount: 5,
11
- firstStreamUpdateMs: 150,
12
- lastStreamUpdateMs: 350,
13
- stallMs: 0,
14
- generationMs: 400,
15
- ...overrides,
16
- };
17
- }
18
-
19
- test("calculateReliableTps uses active stream time for sufficiently sampled output", () => {
20
- assert.deepEqual(calculateReliableTps(100, timing()), {
21
- tps: 500,
22
- effectiveMs: 200,
23
- isPrimary: true,
24
- });
25
- });
26
-
27
- test("calculateReliableTps falls back around stalls and rejects implausible samples", () => {
28
- assert.deepEqual(calculateReliableTps(100, timing({ updateCount: 2, firstStreamUpdateMs: 150, lastStreamUpdateMs: 250, generationMs: 500 })), {
29
- tps: 200,
30
- effectiveMs: 500,
31
- isPrimary: false,
32
- });
33
- assert.deepEqual(calculateReliableTps(100, timing({ stallMs: 100 })), {
34
- tps: 333.3,
35
- effectiveMs: 300,
36
- isPrimary: false,
37
- });
38
- assert.equal(calculateReliableTps(10_001, timing()), null);
39
- });
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { calculateReliableTps, type TpsTiming } from "../tps.ts";
4
+
5
+ function timing(overrides: Partial<TpsTiming> = {}): TpsTiming {
6
+ return {
7
+ messageStartMs: 0,
8
+ lastUpdateMs: 350,
9
+ firstTokenMs: 100,
10
+ updateCount: 5,
11
+ firstStreamUpdateMs: 150,
12
+ lastStreamUpdateMs: 350,
13
+ stallMs: 0,
14
+ generationMs: 400,
15
+ ...overrides,
16
+ };
17
+ }
18
+
19
+ test("calculateReliableTps uses active stream time for sufficiently sampled output", () => {
20
+ assert.deepEqual(calculateReliableTps(100, timing()), {
21
+ tps: 500,
22
+ effectiveMs: 200,
23
+ isPrimary: true,
24
+ });
25
+ });
26
+
27
+ test("calculateReliableTps falls back around stalls and rejects implausible samples", () => {
28
+ assert.deepEqual(calculateReliableTps(100, timing({ updateCount: 2, firstStreamUpdateMs: 150, lastStreamUpdateMs: 250, generationMs: 500 })), {
29
+ tps: 200,
30
+ effectiveMs: 500,
31
+ isPrimary: false,
32
+ });
33
+ assert.deepEqual(calculateReliableTps(100, timing({ stallMs: 100 })), {
34
+ tps: 333.3,
35
+ effectiveMs: 300,
36
+ isPrimary: false,
37
+ });
38
+ assert.equal(calculateReliableTps(10_001, timing()), null);
39
+ });
@@ -1,24 +1,24 @@
1
- {
2
- "colors": {
3
- "model": "#d787af",
4
- "shellMode": "accent",
5
- "path": "#00afaf",
6
- "gitDirty": "warning",
7
- "gitClean": "success",
8
- "thinking": "thinkingOff",
9
- "thinkingMinimal": "thinkingMinimal",
10
- "thinkingLow": "thinkingLow",
11
- "thinkingMedium": "thinkingMedium",
12
- "context": "dim",
13
- "contextWarn": "warning",
14
- "contextError": "error",
15
- "cost": "text",
16
- "tokens": "muted",
17
- "separator": "dim",
18
- "border": "borderMuted"
19
- },
20
- "icons": {
21
- "auto": "↯",
22
- "warning": ""
23
- }
24
- }
1
+ {
2
+ "colors": {
3
+ "model": "#d787af",
4
+ "shellMode": "accent",
5
+ "path": "#00afaf",
6
+ "gitDirty": "warning",
7
+ "gitClean": "success",
8
+ "thinking": "thinkingOff",
9
+ "thinkingMinimal": "thinkingMinimal",
10
+ "thinkingLow": "thinkingLow",
11
+ "thinkingMedium": "thinkingMedium",
12
+ "context": "dim",
13
+ "contextWarn": "warning",
14
+ "contextError": "error",
15
+ "cost": "text",
16
+ "tokens": "muted",
17
+ "separator": "dim",
18
+ "border": "borderMuted"
19
+ },
20
+ "icons": {
21
+ "auto": "↯",
22
+ "warning": ""
23
+ }
24
+ }
@@ -1,12 +1,12 @@
1
- {
2
- "colors": {
3
- "context": "#00c853",
4
- "contextWarn": "#ff9800",
5
- "contextError": "#f44336"
6
- },
7
- "icons": {
8
- "folder": "",
9
- "context": "",
10
- "auto": ""
11
- }
12
- }
1
+ {
2
+ "colors": {
3
+ "context": "#00c853",
4
+ "contextWarn": "#ff9800",
5
+ "contextError": "#f44336"
6
+ },
7
+ "icons": {
8
+ "folder": "",
9
+ "context": "",
10
+ "auto": ""
11
+ }
12
+ }