pi-agent-flow 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +126 -489
  2. package/agents/audit.md +7 -2
  3. package/agents/build.md +6 -2
  4. package/agents/craft.md +6 -3
  5. package/agents/debug.md +7 -3
  6. package/agents/ideas.md +8 -4
  7. package/agents/scout.md +8 -1
  8. package/dist/batch/apply-patch.d.ts +60 -0
  9. package/dist/batch/apply-patch.d.ts.map +1 -0
  10. package/dist/batch/apply-patch.js +477 -0
  11. package/dist/batch/apply-patch.js.map +1 -0
  12. package/dist/batch/batch-bash.d.ts +0 -6
  13. package/dist/batch/batch-bash.d.ts.map +1 -1
  14. package/dist/batch/batch-bash.js +52 -14
  15. package/dist/batch/batch-bash.js.map +1 -1
  16. package/dist/batch/constants.d.ts +45 -4
  17. package/dist/batch/constants.d.ts.map +1 -1
  18. package/dist/batch/constants.js +72 -4
  19. package/dist/batch/constants.js.map +1 -1
  20. package/dist/batch/execute.d.ts +8 -2
  21. package/dist/batch/execute.d.ts.map +1 -1
  22. package/dist/batch/execute.js +338 -70
  23. package/dist/batch/execute.js.map +1 -1
  24. package/dist/batch/fuzzy-edit.d.ts +4 -1
  25. package/dist/batch/fuzzy-edit.d.ts.map +1 -1
  26. package/dist/batch/fuzzy-edit.js +7 -2
  27. package/dist/batch/fuzzy-edit.js.map +1 -1
  28. package/dist/batch/index.d.ts +3 -15
  29. package/dist/batch/index.d.ts.map +1 -1
  30. package/dist/batch/index.js +48 -78
  31. package/dist/batch/index.js.map +1 -1
  32. package/dist/batch/render.d.ts.map +1 -1
  33. package/dist/batch/render.js +30 -7
  34. package/dist/batch/render.js.map +1 -1
  35. package/dist/batch/shell-compress.d.ts +25 -0
  36. package/dist/batch/shell-compress.d.ts.map +1 -0
  37. package/dist/batch/shell-compress.js +602 -0
  38. package/dist/batch/shell-compress.js.map +1 -0
  39. package/dist/batch/summary.d.ts.map +1 -1
  40. package/dist/batch/summary.js +4 -0
  41. package/dist/batch/summary.js.map +1 -1
  42. package/dist/batch/symbols.d.ts.map +1 -1
  43. package/dist/batch/symbols.js +12 -7
  44. package/dist/batch/symbols.js.map +1 -1
  45. package/dist/config/config.d.ts +5 -0
  46. package/dist/config/config.d.ts.map +1 -1
  47. package/dist/config/config.js +63 -0
  48. package/dist/config/config.js.map +1 -1
  49. package/dist/config/models.d.ts +2 -0
  50. package/dist/config/models.d.ts.map +1 -0
  51. package/dist/config/models.js +49 -0
  52. package/dist/config/models.js.map +1 -0
  53. package/dist/config/settings-resolver.js +2 -2
  54. package/dist/config/settings-resolver.js.map +1 -1
  55. package/dist/core/agents.js +2 -2
  56. package/dist/core/agents.js.map +1 -1
  57. package/dist/core/depth.d.ts +3 -3
  58. package/dist/core/depth.d.ts.map +1 -1
  59. package/dist/core/depth.js +5 -5
  60. package/dist/core/depth.js.map +1 -1
  61. package/dist/core/executor.d.ts +10 -3
  62. package/dist/core/executor.d.ts.map +1 -1
  63. package/dist/core/executor.js +7 -3
  64. package/dist/core/executor.js.map +1 -1
  65. package/dist/core/flow.d.ts +19 -3
  66. package/dist/core/flow.d.ts.map +1 -1
  67. package/dist/core/flow.js +97 -58
  68. package/dist/core/flow.js.map +1 -1
  69. package/dist/core/session-mode.d.ts +1 -1
  70. package/dist/core/session-mode.d.ts.map +1 -1
  71. package/dist/core/session-mode.js +2 -1
  72. package/dist/core/session-mode.js.map +1 -1
  73. package/dist/core/{delegation.d.ts → transition.d.ts} +9 -9
  74. package/dist/core/transition.d.ts.map +1 -0
  75. package/dist/core/{delegation.js → transition.js} +17 -24
  76. package/dist/core/transition.js.map +1 -0
  77. package/dist/flow/auto-warp.d.ts +12 -0
  78. package/dist/flow/auto-warp.d.ts.map +1 -0
  79. package/dist/flow/auto-warp.js +29 -0
  80. package/dist/flow/auto-warp.js.map +1 -0
  81. package/dist/flow/command.d.ts.map +1 -1
  82. package/dist/flow/command.js +7 -2
  83. package/dist/flow/command.js.map +1 -1
  84. package/dist/flow/continuation.d.ts.map +1 -1
  85. package/dist/flow/continuation.js +52 -15
  86. package/dist/flow/continuation.js.map +1 -1
  87. package/dist/flow/index.d.ts +5 -2
  88. package/dist/flow/index.d.ts.map +1 -1
  89. package/dist/flow/index.js +6 -3
  90. package/dist/flow/index.js.map +1 -1
  91. package/dist/flow/loop-command.d.ts +8 -0
  92. package/dist/flow/loop-command.d.ts.map +1 -0
  93. package/dist/flow/loop-command.js +102 -0
  94. package/dist/flow/loop-command.js.map +1 -0
  95. package/dist/flow/loop-templates.d.ts +7 -0
  96. package/dist/flow/loop-templates.d.ts.map +1 -0
  97. package/dist/flow/loop-templates.js +38 -0
  98. package/dist/flow/loop-templates.js.map +1 -0
  99. package/dist/flow/loop.d.ts +19 -0
  100. package/dist/flow/loop.d.ts.map +1 -0
  101. package/dist/flow/loop.js +95 -0
  102. package/dist/flow/loop.js.map +1 -0
  103. package/dist/flow/settings-command.d.ts.map +1 -1
  104. package/dist/flow/settings-command.js +93 -4
  105. package/dist/flow/settings-command.js.map +1 -1
  106. package/dist/flow/store.d.ts +3 -3
  107. package/dist/flow/store.d.ts.map +1 -1
  108. package/dist/flow/store.js +24 -16
  109. package/dist/flow/store.js.map +1 -1
  110. package/dist/flow/template-shared.d.ts +9 -0
  111. package/dist/flow/template-shared.d.ts.map +1 -0
  112. package/dist/flow/template-shared.js +13 -0
  113. package/dist/flow/template-shared.js.map +1 -0
  114. package/dist/flow/template-strings.d.ts.map +1 -1
  115. package/dist/flow/template-strings.js +2 -5
  116. package/dist/flow/template-strings.js.map +1 -1
  117. package/dist/flow/types.d.ts +15 -9
  118. package/dist/flow/types.d.ts.map +1 -1
  119. package/dist/flow/warp.d.ts +15 -0
  120. package/dist/flow/warp.d.ts.map +1 -0
  121. package/dist/flow/warp.js +207 -0
  122. package/dist/flow/warp.js.map +1 -0
  123. package/dist/index.d.ts +3 -2
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +185 -28
  126. package/dist/index.js.map +1 -1
  127. package/dist/snapshot/cli-args.d.ts +1 -0
  128. package/dist/snapshot/cli-args.d.ts.map +1 -1
  129. package/dist/snapshot/cli-args.js +12 -0
  130. package/dist/snapshot/cli-args.js.map +1 -1
  131. package/dist/snapshot/runner-events.d.ts +5 -0
  132. package/dist/snapshot/runner-events.d.ts.map +1 -1
  133. package/dist/snapshot/runner-events.js +89 -15
  134. package/dist/snapshot/runner-events.js.map +1 -1
  135. package/dist/snapshot/snapshot.d.ts +22 -19
  136. package/dist/snapshot/snapshot.d.ts.map +1 -1
  137. package/dist/snapshot/snapshot.js +1063 -167
  138. package/dist/snapshot/snapshot.js.map +1 -1
  139. package/dist/steering/flow-prompt.d.ts +2 -2
  140. package/dist/steering/flow-prompt.d.ts.map +1 -1
  141. package/dist/steering/flow-prompt.js +4 -4
  142. package/dist/steering/flow-prompt.js.map +1 -1
  143. package/dist/steering/sliding-prompt.d.ts.map +1 -1
  144. package/dist/steering/sliding-prompt.js +9 -6
  145. package/dist/steering/sliding-prompt.js.map +1 -1
  146. package/dist/steering/tool-utils.d.ts +31 -8
  147. package/dist/steering/tool-utils.d.ts.map +1 -1
  148. package/dist/steering/tool-utils.js +63 -30
  149. package/dist/steering/tool-utils.js.map +1 -1
  150. package/dist/tools/ask-user.d.ts +0 -17
  151. package/dist/tools/ask-user.d.ts.map +1 -1
  152. package/dist/tools/ask-user.js +13 -37
  153. package/dist/tools/ask-user.js.map +1 -1
  154. package/dist/tools/timed-bash.d.ts +1 -1
  155. package/dist/tools/timed-bash.d.ts.map +1 -1
  156. package/dist/tools/timed-bash.js +19 -8
  157. package/dist/tools/timed-bash.js.map +1 -1
  158. package/dist/tools/web-tool.d.ts.map +1 -1
  159. package/dist/tools/web-tool.js +11 -13
  160. package/dist/tools/web-tool.js.map +1 -1
  161. package/dist/tui/render-utils.d.ts +5 -1
  162. package/dist/tui/render-utils.d.ts.map +1 -1
  163. package/dist/tui/render-utils.js +36 -10
  164. package/dist/tui/render-utils.js.map +1 -1
  165. package/dist/tui/render.d.ts +9 -0
  166. package/dist/tui/render.d.ts.map +1 -1
  167. package/dist/tui/render.js +112 -100
  168. package/dist/tui/render.js.map +1 -1
  169. package/dist/tui/scramble/constants.d.ts +8 -8
  170. package/dist/tui/scramble/constants.d.ts.map +1 -1
  171. package/dist/tui/scramble/constants.js +7 -7
  172. package/dist/tui/scramble/constants.js.map +1 -1
  173. package/dist/tui/scramble/index.d.ts +1 -1
  174. package/dist/tui/scramble/index.d.ts.map +1 -1
  175. package/dist/tui/scramble/index.js +1 -1
  176. package/dist/tui/scramble/index.js.map +1 -1
  177. package/dist/tui/scramble/manager.d.ts +1 -5
  178. package/dist/tui/scramble/manager.d.ts.map +1 -1
  179. package/dist/tui/scramble/manager.js +16 -64
  180. package/dist/tui/scramble/manager.js.map +1 -1
  181. package/dist/tui/scramble/utils.js +1 -1
  182. package/dist/tui/scramble/utils.js.map +1 -1
  183. package/dist/types/flow.d.ts +2 -0
  184. package/dist/types/flow.d.ts.map +1 -1
  185. package/dist/types/flow.js +11 -2
  186. package/dist/types/flow.js.map +1 -1
  187. package/dist/types/output.d.ts +6 -0
  188. package/dist/types/output.d.ts.map +1 -1
  189. package/package.json +2 -2
  190. package/dist/core/delegation.d.ts.map +0 -1
  191. package/dist/core/delegation.js.map +0 -1
  192. package/dist/flow/warp-command.d.ts +0 -9
  193. package/dist/flow/warp-command.d.ts.map +0 -1
  194. package/dist/flow/warp-command.js +0 -405
  195. package/dist/flow/warp-command.js.map +0 -1
@@ -34,23 +34,20 @@ export function formatFlowTypeName(type) {
34
34
  return lower.slice(0, targetWidth);
35
35
  return lower.padEnd(targetWidth, " ");
36
36
  }
37
- /** Format tokens-per-second to a 5-char display (e.g., " 42.3", " -"). */
38
- function formatTps(value) {
37
+ /** Format tokens-per-second to a display string. */
38
+ export function formatTps(value) {
39
39
  if (!value || value <= 0)
40
- return " -";
41
- return value.toFixed(1).padStart(5);
40
+ return "-----";
41
+ return `${value.toFixed(1).padStart(5)} t/s`;
42
42
  }
43
43
  export function italic(text) {
44
44
  return `\x1b[3m${text}\x1b[23m`;
45
45
  }
46
- export function formatCompactTokenPair(usage) {
47
- return `▲ ${formatFixedTokens(usage.input || 0)} ·`;
48
- }
49
46
  export function formatCompactStats(usage, model, maxWidth, options = {}) {
50
47
  const tokenParts = [`▲ ${formatFixedTokens(usage.input || 0)}`];
51
- let runtimeParts = [`tps: ${formatTps(usage.smoothedTps)}`];
48
+ let runtimeParts = [formatTps(usage.smoothedTps)];
52
49
  if (!options.skipContext) {
53
- runtimeParts.push(`ctx: ${formatFixedTokens(usage.contextTokens || 0)}`);
50
+ runtimeParts.push(formatFixedTokens(usage.contextTokens || 0));
54
51
  }
55
52
  const parts = options.skipTokens ? runtimeParts : [...tokenParts, ...runtimeParts];
56
53
  const displayModel = options.hideModel ? undefined : (model ? model.replace(/^[^/]+\//, "").toLowerCase() : undefined);
@@ -61,7 +58,8 @@ export function formatCompactStats(usage, model, maxWidth, options = {}) {
61
58
  if (visibleLength(narrow) <= maxWidth)
62
59
  return narrow;
63
60
  // Drop context tokens next.
64
- const withoutContext = parts.filter((part) => !part.startsWith("ctx:"));
61
+ const tpsOnly = [formatTps(usage.smoothedTps)];
62
+ const withoutContext = options.skipTokens ? tpsOnly : [...tokenParts, ...tpsOnly];
65
63
  narrow = withoutContext.join(" - ");
66
64
  if (visibleLength(narrow) <= maxWidth)
67
65
  return narrow;
@@ -86,6 +84,34 @@ export function formatCountdown(ms) {
86
84
  const seconds = totalSeconds % 60;
87
85
  return `${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
88
86
  }
87
+ export function formatModelLabel(model, maxTail = 10) {
88
+ if (!model)
89
+ return "";
90
+ const parts = model.split("/");
91
+ if (parts.length < 2)
92
+ return model.toLowerCase();
93
+ const provider = parts[0];
94
+ const modelPath = parts.slice(1).join("/").toLowerCase();
95
+ const shortened = modelPath.length > maxTail ? "..." + modelPath.slice(-maxTail) : modelPath;
96
+ return `${provider}/${shortened}`;
97
+ }
98
+ export function formatCountdownRemaining(deadlineAtMs) {
99
+ if (typeof deadlineAtMs !== "number")
100
+ return undefined;
101
+ const remaining = deadlineAtMs - Date.now();
102
+ if (remaining < 0)
103
+ return undefined;
104
+ return formatCountdown(remaining);
105
+ }
106
+ export function formatContextLabel(ctxTokens, maxCtxTokens) {
107
+ if (maxCtxTokens === undefined) {
108
+ return formatFixedTokens(ctxTokens).trim();
109
+ }
110
+ if (ctxTokens === 0) {
111
+ return `-----/${formatFixedTokens(maxCtxTokens).trim()}`;
112
+ }
113
+ return `${formatFixedTokens(ctxTokens).trim()}/${formatFixedTokens(maxCtxTokens).trim()}`;
114
+ }
89
115
  /** Regex matching ANSI escape sequences. */
90
116
  const ANSI_RE = /\x1b\[[0-9;]*m/g;
91
117
  /** Return the visible (ANSI-stripped) character count. */
@@ -1 +1 @@
1
- {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../src/tui/render-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../src/tui/render-utils.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,15 @@ import type { SingleResult } from "../types/flow.js";
9
9
  /** Reset the anonymous counter — call in tests for deterministic ids. */
10
10
  export declare function resetAnonymousFlowIdCounter(): void;
11
11
  import { type FlowColorConfig, type FlowTheme } from "./flow-colors.js";
12
+ /** Single segment of a multi-part header with its original plain length and style. */
13
+ export interface HeaderSegment {
14
+ text: string;
15
+ style: (text: string) => string;
16
+ }
17
+ /** Reconstruct multi-segment ANSI styles on a flat string by splitting at
18
+ * original segment boundaries and re-applying each segment's style function.
19
+ */
20
+ export declare function reconstructHeader(content: string, segments: HeaderSegment[]): string;
12
21
  export declare function renderFlowCall(args: Record<string, any>, theme: FlowTheme, config?: FlowColorConfig): Container | Text;
13
22
  export declare function renderFlowResult(result: {
14
23
  content: Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/tui/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,SAAS,EAAoB,IAAI,EAAiB,MAAM,sBAAsB,CAAC;AAExF,OAAO,KAAK,EACX,YAAY,EAGZ,MAAM,kBAAkB,CAAC;AAyB1B,yEAAyE;AACzE,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAeD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EAGf,MAAM,kBAAkB,CAAC;AA6G1B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAsBtH;AAMD,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAC9E,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,CAAC,EAAE,eAAe,GACtB,SAAS,GAAG,IAAI,CAyGlB;AAMD,wBAAgB,sBAAsB,CACrC,CAAC,EAAE,YAAY,EACf,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,eAAe,GACtB,SAAS,GAAG,IAAI,CAalB"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/tui/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,SAAS,EAAoB,IAAI,EAAiB,MAAM,sBAAsB,CAAC;AAExF,OAAO,KAAK,EACX,YAAY,EAEZ,MAAM,kBAAkB,CAAC;AAyB1B,yEAAyE;AACzE,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAeD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EAGf,MAAM,kBAAkB,CAAC;AAkG1B,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAapF;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAsBtH;AAMD,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAC9E,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,CAAC,EAAE,eAAe,GACtB,SAAS,GAAG,IAAI,CAyGlB;AAMD,wBAAgB,sBAAsB,CACrC,CAAC,EAAE,YAAY,EACf,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,eAAe,GACtB,SAAS,GAAG,IAAI,CAalB"}
@@ -31,7 +31,7 @@ function getLiveTextWithFallback(id) {
31
31
  const fallbackId = id.includes("#") ? "collapsed" + id.slice(id.indexOf("#")) : "collapsed";
32
32
  return getLiveText(fallbackId);
33
33
  }
34
- import { formatCompactStats, formatCompactTokenPair, formatCountdown, formatFlowTypeName, lowerFirstWord, truncateChars, tailText, getTruncationBudget, visibleLength, stripAnsi } from "./render-utils.js";
34
+ import { formatCompactStats, formatFlowTypeName, lowerFirstWord, truncateChars, tailText, getTruncationBudget, visibleLength, stripAnsi, formatModelLabel, formatContextLabel, formatTps } from "./render-utils.js";
35
35
  function shortenPath(p) {
36
36
  const home = os.homedir();
37
37
  return p.startsWith(home) ? `~${p.slice(home.length)}` : p;
@@ -118,10 +118,23 @@ function sectionHeader(label) {
118
118
  const right = "─".repeat(Math.ceil(side));
119
119
  return `${left} ${label} ${right}`;
120
120
  }
121
- function getLiveCountdown(r) {
122
- if (r.exitCode !== -1 || typeof r.deadlineAtMs !== "number")
123
- return undefined;
124
- return formatCountdown(r.deadlineAtMs - Date.now());
121
+ /** Reconstruct multi-segment ANSI styles on a flat string by splitting at
122
+ * original segment boundaries and re-applying each segment's style function.
123
+ */
124
+ export function reconstructHeader(content, segments) {
125
+ let offset = 0;
126
+ const parts = [];
127
+ for (const seg of segments) {
128
+ const len = seg.text.length;
129
+ if (offset >= content.length)
130
+ break;
131
+ parts.push(seg.style(content.slice(offset, offset + len)));
132
+ offset += len;
133
+ }
134
+ if (offset < content.length) {
135
+ parts.push(content.slice(offset));
136
+ }
137
+ return parts.join("");
125
138
  }
126
139
  // ---------------------------------------------------------------------------
127
140
  // renderFlowCall — shown while the flow is being invoked
@@ -280,15 +293,21 @@ export function renderSingleFlowResult(r, expanded, theme, streamingText, toolCa
280
293
  function renderFlowExpanded(r, icon, error, displayItems, flowOutput, theme, id, now, isComplete, streamingText, config) {
281
294
  const mdTheme = getMarkdownTheme();
282
295
  const container = new Container();
283
- // Header: uppercase type name with dots, no icon, no source
284
296
  const typeName = formatFlowTypeName(r.type);
285
297
  let header = applyRole("flowName", typeName, theme, config);
286
- if (error && r.stopReason)
287
- header += ` ${theme.fg("error", `[${r.stopReason}]`)}`;
288
- const plainHeader = typeName + (error && r.stopReason ? ` [${r.stopReason}]` : "");
298
+ const errorSegment = error && r.stopReason ? ` [${r.stopReason}]` : "";
299
+ if (errorSegment)
300
+ header += ` ${theme.fg("error", errorSegment)}`;
301
+ const plainHeader = typeName + errorSegment;
302
+ const headerSegments = [
303
+ { text: typeName, style: (s) => applyRole("flowName", s, theme, config) },
304
+ ];
305
+ if (errorSegment) {
306
+ headerSegments.push({ text: errorSegment, style: (s) => theme.fg("error", s) });
307
+ }
289
308
  container.addChild(new DynamicScrambleText(header, () => {
290
309
  const result = scrambleManager.updateText(id, 'header', plainHeader, Date.now(), isComplete);
291
- return result.isAnimating ? applyRole("flowName", result.content, theme, config) : header;
310
+ return result.isAnimating ? reconstructHeader(result.content, headerSegments) : header;
292
311
  }));
293
312
  if (error && r.errorMessage) {
294
313
  container.addChild(new Text(scrambleManager.renderStatic(theme.fg("error", `Error: ${r.errorMessage}`)), 0, 0));
@@ -431,44 +450,55 @@ function renderFlowCollapsed(r, icon, error, flowOutput, theme, streamingText, t
431
450
  const container = new Container();
432
451
  const maxWidth = process.stdout.columns ?? 80;
433
452
  const typeName = formatCollapsedFlowHeaderTypeName(r.type);
434
- const modelLabel = r.model ? r.model.replace(/^[^/]+\//, "").toLowerCase() : "";
453
+ const modelLabel = formatModelLabel(r.model);
435
454
  const headerPrefixLen = visibleLength(typeName) + visibleLength(modelLabel ? ` ${modelLabel} · ` : " ");
436
- const stats = formatCompactStats(r.usage, r.model, Math.max(maxWidth - headerPrefixLen, 20), { skipTokens: true, skipContext: true, hideModel: true });
437
455
  const isComplete = r.exitCode !== -1;
456
+ // Build header stats: ctxLabel · t/s
457
+ const statsParts = [];
458
+ if (r.maxContextTokens !== undefined || r.usage.contextTokens > 0) {
459
+ const ctxLabel = formatContextLabel(r.usage.contextTokens, r.maxContextTokens);
460
+ statsParts.push(ctxLabel);
461
+ }
462
+ const tpsFormatted = formatTps(r.usage.smoothedTps);
463
+ statsParts.push(tpsFormatted);
464
+ let displayStats = statsParts.join(" · ");
438
465
  // Flash TPS value when it changes
439
- const tpsMatch = stats.match(/tps:\s*(\S+)/);
440
- let displayStats = stats;
441
- if (tpsMatch) {
442
- const scrambledTps = scrambleManager.updateTps(id, tpsMatch[1], now, isComplete, true);
443
- if (scrambledTps !== tpsMatch[1]) {
444
- displayStats = stats.replace(tpsMatch[1], scrambledTps);
445
- }
446
- }
447
- let header = `${applyRole("flowName", typeName, theme, config)}${applyRole("modelName", modelLabel ? ` ${modelLabel} · ` : " ", theme, config)}${applyRole("stats", displayStats, theme, config)}`;
448
- if (error && r.stopReason)
449
- header += ` ${theme.fg("error", `[${r.stopReason}]`)}`;
450
- // Scramble header on first render; show full styled header when complete
451
- const plainHeader = typeName + (modelLabel ? ` ${modelLabel} · ` : " ") + stripAnsi(displayStats) + (error && r.stopReason ? ` [${r.stopReason}]` : "");
466
+ const tpsNum = tpsFormatted.slice(0, -4); // remove " t/s" suffix
467
+ if (r.usage.smoothedTps && r.usage.smoothedTps > 0) {
468
+ const scrambledTps = scrambleManager.updateTps(id, tpsNum, now, isComplete, true);
469
+ if (scrambledTps !== tpsNum) {
470
+ displayStats = displayStats.replace(`${tpsNum} t/s`, `${scrambledTps} t/s`);
471
+ }
472
+ }
473
+ const modelSegment = modelLabel ? ` ${modelLabel} · ` : " ";
474
+ const statsSegment = stripAnsi(displayStats);
475
+ const errorSegment = error && r.stopReason ? ` [${r.stopReason}]` : "";
476
+ let header = `${applyRole("flowName", typeName, theme, config)}${applyRole("modelName", modelSegment, theme, config)}${applyRole("stats", displayStats, theme, config)}`;
477
+ if (errorSegment)
478
+ header += ` ${theme.fg("error", errorSegment)}`;
479
+ const plainHeader = typeName + modelSegment + statsSegment + errorSegment;
480
+ const headerSegments = [
481
+ { text: typeName, style: (s) => applyRole("flowName", s, theme, config) },
482
+ { text: modelSegment, style: (s) => applyRole("modelName", s, theme, config) },
483
+ { text: statsSegment, style: (s) => applyRole("stats", s, theme, config) },
484
+ ];
485
+ if (errorSegment) {
486
+ headerSegments.push({ text: errorSegment, style: (s) => theme.fg("error", s) });
487
+ }
452
488
  container.addChild(new DynamicScrambleText(header, () => {
453
489
  const result = scrambleManager.updateText(id, 'header', plainHeader, Date.now(), isComplete, true);
454
- return result.isAnimating ? applyRole("flowName", result.content, theme, config) : header;
490
+ return result.isAnimating ? reconstructHeader(result.content, headerSegments) : header;
455
491
  }, true));
456
492
  // aim: line — glitch on text change
457
493
  if (r.aim) {
458
- const countdown = getLiveCountdown(r);
459
494
  const aimTree = "├─";
460
- const aimLabel = countdown
461
- ? ` aim ▸ ${countdown} · `
462
- : ` aim ▸ `;
495
+ const aimLabel = ` aim ▸ `;
463
496
  const aimPrefix = `${aimTree}${aimLabel}`;
464
497
  const budget = getTruncationBudget(visibleLength(aimPrefix));
465
498
  const displayAim = truncateChars(lowerFirstWord(r.aim), budget);
466
499
  container.addChild(new DynamicScrambleText(`${applyRole("treeChars", aimTree, theme, config)}${applyRole("prefixLabel", aimLabel, theme, config)}${applyRole("aimContent", displayAim, theme, config)}`, () => {
467
500
  const now = Date.now();
468
- const freshCountdown = getLiveCountdown(r);
469
- const freshAimLabel = freshCountdown
470
- ? ` aim ▸ ${freshCountdown} · `
471
- : ` aim ▸ `;
501
+ const freshAimLabel = ` aim ▸ `;
472
502
  const freshAimPrefix = `${aimTree}${freshAimLabel}`;
473
503
  const freshBudget = getTruncationBudget(visibleLength(freshAimPrefix));
474
504
  const freshText = truncateChars(lowerFirstWord(r.aim), freshBudget);
@@ -480,31 +510,21 @@ function renderFlowCollapsed(r, icon, error, flowOutput, theme, streamingText, t
480
510
  const lastTool = getLastToolCall(r.messages);
481
511
  const actStr = lastTool ? formatFlowToolCall(lastTool.name, lastTool.args, theme.fg.bind(theme)) : "[n/a]";
482
512
  const actTree = "├─";
483
- const actLabel = ` act${r.usage.toolCalls} · `;
513
+ const actLabel = ` cmd ▸ `;
484
514
  const prefixStub = `${actTree}${actLabel}`;
485
515
  const budget = getTruncationBudget(visibleLength(prefixStub));
486
516
  const actFullText = stripAnsi(lowerFirstWord(actStr));
487
- const initialActContent = actFullText.length > budget ? actFullText.slice(0, budget) : actFullText;
517
+ const initialActContent = actFullText.length > budget ? tailText(actFullText, budget) : actFullText;
488
518
  container.addChild(new DynamicScrambleText(`${applyRole("treeChars", actTree, theme, config)}${applyRole("prefixLabel", actLabel, theme, config)}${applyRole("actContent", initialActContent, theme, config)}`, () => {
489
519
  const now = Date.now();
490
- const displayAct = truncateChars(actFullText, budget);
520
+ const displayAct = tailText(actFullText, budget);
491
521
  const actContent = scrambleManager.updateAct(id, displayAct, now, isComplete, true).content;
492
- let actKpi = String(r.usage.toolCalls);
493
- const scrambledActKpi = scrambleManager.updateActKpi(id, actKpi, now, isComplete, true);
494
- if (scrambledActKpi !== actKpi) {
495
- actKpi = scrambledActKpi;
496
- }
497
- const actLabel = ` act ▸ ${actKpi} · `;
522
+ const actLabel = ` cmd ▸ `;
498
523
  const actPrefix = `${actTree}${actLabel}`;
499
524
  return `${applyRole("treeChars", actTree, theme, config)}${applyRole("prefixLabel", actLabel, theme, config)}${applyRole("actContent", actContent, theme, config)}`;
500
525
  }, true));
501
526
  // msg: line (last assistant text or streaming)
502
- let msgKpi = formatCompactTokenPair(r.usage);
503
- const scrambledMsgKpi = scrambleManager.updateMsgKpi(id, msgKpi, now, isComplete, false);
504
- if (scrambledMsgKpi !== msgKpi) {
505
- msgKpi = scrambledMsgKpi;
506
- }
507
- const msgPrefixStub = `└─ msg ▸ ${msgKpi} `;
527
+ const msgPrefixStub = `└─ msg ▸ `;
508
528
  const msgBudget = getTruncationBudget(visibleLength(msgPrefixStub));
509
529
  let rawMsg;
510
530
  let useError = false;
@@ -534,16 +554,11 @@ function renderFlowCollapsed(r, icon, error, flowOutput, theme, streamingText, t
534
554
  ? tailText(rawMsg, msgBudget)
535
555
  : truncateChars(rawMsg, msgBudget);
536
556
  const msgTree = "└─";
537
- const msgLabel = ` msg ▸ ${msgKpi} `;
557
+ const msgLabel = ` msg ▸ `;
538
558
  const initialMsgPrefix = `${msgTree}${msgLabel}`;
539
559
  container.addChild(new DynamicScrambleText(`${applyRole("treeChars", msgTree, theme, config)}${applyRole("prefixLabel", msgLabel, theme, config)}${applyRole(useError ? "msgError" : "msgContent", initialMsgContent, theme, config)}`, () => {
540
560
  const now = Date.now();
541
- let msgKpi = formatCompactTokenPair(r.usage);
542
- const scrambledMsgKpi = scrambleManager.updateMsgKpi(id, msgKpi, now, isComplete, false);
543
- if (scrambledMsgKpi !== msgKpi) {
544
- msgKpi = scrambledMsgKpi;
545
- }
546
- const msgLabel = ` msg ▸ ${msgKpi} `;
561
+ const msgLabel = ` msg ▸ `;
547
562
  const msgPrefix = `${msgTree}${msgLabel}`;
548
563
  const freshRawMsg = (r.exitCode === -1 ? getLiveTextWithFallback(id) : undefined) ?? rawMsg;
549
564
  const needsTail = r.exitCode === -1 || streamingText != null;
@@ -677,49 +692,61 @@ function renderActivityPanel(results, theme, baseId, config) {
677
692
  const isLast = i === results.length - 1;
678
693
  const flowId = `${idPrefix}#${i}`;
679
694
  const typeName = formatCollapsedFlowHeaderTypeName(r.type);
680
- const modelLabel = r.model ? r.model.replace(/^[^/]+\//, "").toLowerCase() : "";
695
+ const modelLabel = formatModelLabel(r.model);
681
696
  const headerPrefix = isLast ? "└─" : "├─";
682
697
  const headerPrefixLen = visibleLength(headerPrefix) + 1 + visibleLength(typeName) + visibleLength(modelLabel ? ` ${modelLabel} · ` : " ");
683
- const stats = formatCompactStats(r.usage, r.model, Math.max(maxWidth - headerPrefixLen, 20), { skipTokens: true, skipContext: true, hideModel: true });
684
- // Flash TPS value when it changes
685
- const tpsMatch = stats.match(/tps:\s*(\S+)/);
698
+ // Build header stats: ctxLabel · t/s
699
+ const statsParts = [];
700
+ if (r.maxContextTokens !== undefined || r.usage.contextTokens > 0) {
701
+ const ctxLabel = formatContextLabel(r.usage.contextTokens, r.maxContextTokens);
702
+ statsParts.push(ctxLabel);
703
+ }
704
+ const tpsFormatted = formatTps(r.usage.smoothedTps);
705
+ statsParts.push(tpsFormatted);
706
+ let displayStats = statsParts.join(" · ");
686
707
  const flowComplete = r.exitCode !== -1;
687
- let displayStats = stats;
688
- if (tpsMatch) {
689
- const scrambledTps = scrambleManager.updateTps(flowId, tpsMatch[1], now, flowComplete, true);
690
- if (scrambledTps !== tpsMatch[1]) {
691
- displayStats = stats.replace(tpsMatch[1], scrambledTps);
708
+ // Flash TPS value when it changes
709
+ const tpsNum = tpsFormatted.slice(0, -4); // remove " t/s" suffix
710
+ if (r.usage.smoothedTps && r.usage.smoothedTps > 0) {
711
+ const scrambledTps = scrambleManager.updateTps(flowId, tpsNum, now, flowComplete, true);
712
+ if (scrambledTps !== tpsNum) {
713
+ displayStats = displayStats.replace(`${tpsNum} t/s`, `${scrambledTps} t/s`);
692
714
  }
693
715
  }
694
716
  const error = isFlowError(r);
695
- // Header line
696
- let headerLine = `${applyRole("treeChars", headerPrefix, theme, config)} ${applyRole("flowName", typeName, theme, config)}${applyRole("modelName", modelLabel ? ` ${modelLabel} · ` : " ", theme, config)}${applyRole("stats", displayStats, theme, config)}`;
697
- if (error && r.stopReason) {
698
- headerLine += ` ${theme.fg("error", `[${r.stopReason}]`)}`;
717
+ const modelSegment = modelLabel ? ` ${modelLabel} · ` : " ";
718
+ const statsSegment = stripAnsi(displayStats);
719
+ const errorSegment = error && r.stopReason ? ` [${r.stopReason}]` : "";
720
+ let headerLine = `${applyRole("treeChars", headerPrefix, theme, config)} ${applyRole("flowName", typeName, theme, config)}${applyRole("modelName", modelSegment, theme, config)}${applyRole("stats", displayStats, theme, config)}`;
721
+ if (errorSegment) {
722
+ headerLine += ` ${theme.fg("error", errorSegment)}`;
723
+ }
724
+ const plainHeader = headerPrefix + " " + typeName + modelSegment + statsSegment + errorSegment;
725
+ const headerSegments = [
726
+ { text: headerPrefix + " ", style: (s) => applyRole("treeChars", s, theme, config) },
727
+ { text: typeName, style: (s) => applyRole("flowName", s, theme, config) },
728
+ { text: modelSegment, style: (s) => applyRole("modelName", s, theme, config) },
729
+ { text: statsSegment, style: (s) => applyRole("stats", s, theme, config) },
730
+ ];
731
+ if (errorSegment) {
732
+ headerSegments.push({ text: errorSegment, style: (s) => theme.fg("error", s) });
699
733
  }
700
- const plainHeader = headerPrefix + " " + typeName + (modelLabel ? ` ${modelLabel} · ` : " ") + stripAnsi(displayStats) + (error && r.stopReason ? ` [${r.stopReason}]` : "");
701
734
  container.addChild(new DynamicScrambleText(headerLine, () => {
702
735
  const result = scrambleManager.updateText(flowId, 'header', plainHeader, Date.now(), flowComplete, true);
703
- return result.isAnimating ? applyRole("flowName", result.content, theme, config) : headerLine;
736
+ return result.isAnimating ? reconstructHeader(result.content, headerSegments) : headerLine;
704
737
  }, true));
705
738
  // Continuation indent for sub-lines
706
739
  const indent = isLast ? " " : "│ ";
707
740
  // aim: line — glitch on text change
708
741
  if (r.aim) {
709
- const countdown = getLiveCountdown(r);
710
742
  const aimTree = indent + "├─";
711
- const aimLabel = countdown
712
- ? ` aim ▸ ${countdown} · `
713
- : ` aim ▸ `;
743
+ const aimLabel = ` aim ▸ `;
714
744
  const aimPrefix = `${aimTree}${aimLabel}`;
715
745
  const budget = getTruncationBudget(visibleLength(aimPrefix));
716
746
  const displayAim = truncateChars(lowerFirstWord(r.aim), budget);
717
747
  container.addChild(new DynamicScrambleText(`${applyRole("treeChars", aimTree, theme, config)}${applyRole("prefixLabel", aimLabel, theme, config)}${applyRole("aimContent", displayAim, theme, config)}`, () => {
718
748
  const now = Date.now();
719
- const freshCountdown = getLiveCountdown(r);
720
- const freshAimLabel = freshCountdown
721
- ? ` aim ▸ ${freshCountdown} · `
722
- : ` aim ▸ `;
749
+ const freshAimLabel = ` aim ▸ `;
723
750
  const freshAimPrefix = `${aimTree}${freshAimLabel}`;
724
751
  const freshBudget = getTruncationBudget(visibleLength(freshAimPrefix));
725
752
  const freshText = truncateChars(lowerFirstWord(r.aim), freshBudget);
@@ -731,33 +758,23 @@ function renderActivityPanel(results, theme, baseId, config) {
731
758
  const lastTool = getLastToolCall(r.messages);
732
759
  const actStr = lastTool ? formatFlowToolCall(lastTool.name, lastTool.args, theme.fg.bind(theme)) : "[n/a]";
733
760
  const actTree = `${indent}├─`;
734
- const actLabel = ` act${r.usage.toolCalls} · `;
761
+ const actLabel = ` cmd ▸ `;
735
762
  const prefixStub = `${actTree}${actLabel}`;
736
763
  const budget = getTruncationBudget(visibleLength(prefixStub));
737
764
  const actFullText = stripAnsi(lowerFirstWord(actStr));
738
- const initialActContent = actFullText.length > budget ? actFullText.slice(0, budget) : actFullText;
765
+ const initialActContent = actFullText.length > budget ? tailText(actFullText, budget) : actFullText;
739
766
  container.addChild(new DynamicScrambleText(`${applyRole("treeChars", actTree, theme, config)}${applyRole("prefixLabel", actLabel, theme, config)}${applyRole("actContent", initialActContent, theme, config)}`, () => {
740
767
  const now = Date.now();
741
- let actKpi = String(r.usage.toolCalls);
742
- const scrambledActKpi = scrambleManager.updateActKpi(flowId, actKpi, now, flowComplete, false);
743
- if (scrambledActKpi !== actKpi) {
744
- actKpi = scrambledActKpi;
745
- }
746
- const actLabel = ` act ▸ ${actKpi} · `;
768
+ const actLabel = ` cmd ▸ `;
747
769
  const actPrefix = `${actTree}${actLabel}`;
748
770
  const freshBudget = getTruncationBudget(visibleLength(actPrefix));
749
- const displayAct = truncateChars(actFullText, freshBudget);
771
+ const displayAct = tailText(actFullText, freshBudget);
750
772
  const actContent = scrambleManager.updateAct(flowId, displayAct, now, flowComplete, true).content;
751
773
  return `${applyRole("treeChars", actTree, theme, config)}${applyRole("prefixLabel", actLabel, theme, config)}${applyRole("actContent", actContent, theme, config)}`;
752
774
  }, true));
753
775
  // msg: line (live streaming text or last assistant text)
754
- let msgKpi = formatCompactTokenPair(r.usage);
755
- const scrambledMsgKpi = scrambleManager.updateMsgKpi(flowId, msgKpi, now, flowComplete, false);
756
- if (scrambledMsgKpi !== msgKpi) {
757
- msgKpi = scrambledMsgKpi;
758
- }
759
776
  const msgTree = `${indent}└─`;
760
- const msgLabel = ` msg ▸ ${msgKpi} `;
777
+ const msgLabel = ` msg ▸ `;
761
778
  const msgPrefixStub = `${msgTree}${msgLabel}`;
762
779
  const msgBudget = getTruncationBudget(visibleLength(msgPrefixStub));
763
780
  const liveText = r.exitCode === -1 ? r.streamingText : undefined;
@@ -782,12 +799,7 @@ function renderActivityPanel(results, theme, baseId, config) {
782
799
  const initialDisplayMsg = initialNeedsTail ? tailText(rawMsg, msgBudget) : truncateChars(rawMsg, msgBudget);
783
800
  container.addChild(new DynamicScrambleText(`${applyRole("treeChars", msgTree, theme, config)}${applyRole("prefixLabel", msgLabel, theme, config)}${applyRole(useError ? "msgError" : "msgContent", initialDisplayMsg, theme, config)}`, () => {
784
801
  const now = Date.now();
785
- let msgKpi = formatCompactTokenPair(r.usage);
786
- const scrambledMsgKpi = scrambleManager.updateMsgKpi(flowId, msgKpi, now, flowComplete, false);
787
- if (scrambledMsgKpi !== msgKpi) {
788
- msgKpi = scrambledMsgKpi;
789
- }
790
- const msgLabel = ` msg ▸ ${msgKpi} `;
802
+ const msgLabel = ` msg ▸ `;
791
803
  const msgPrefix = `${msgTree}${msgLabel}`;
792
804
  const freshBudget = getTruncationBudget(visibleLength(msgPrefix));
793
805
  const freshRawMsg = flowComplete ? rawMsg : (getLiveTextWithFallback(flowId) ?? rawMsg);