@prestyj/cli 4.2.56 → 4.2.75

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 +1 -1
  2. package/dist/cli.js +4 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +1 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +6 -5
  7. package/dist/config.js.map +1 -1
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +11 -0
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/compaction/compactor.d.ts +3 -1
  12. package/dist/core/compaction/compactor.d.ts.map +1 -1
  13. package/dist/core/compaction/compactor.js +28 -5
  14. package/dist/core/compaction/compactor.js.map +1 -1
  15. package/dist/core/compaction/compactor.test.js +86 -10
  16. package/dist/core/compaction/compactor.test.js.map +1 -1
  17. package/dist/core/compaction/token-estimator.test.js +1 -1
  18. package/dist/core/compaction/token-estimator.test.js.map +1 -1
  19. package/dist/core/model-registry.js +8 -8
  20. package/dist/core/model-registry.js.map +1 -1
  21. package/dist/core/settings-manager.d.ts +1 -0
  22. package/dist/core/settings-manager.d.ts.map +1 -1
  23. package/dist/core/settings-manager.js +2 -0
  24. package/dist/core/settings-manager.js.map +1 -1
  25. package/dist/core/slash-commands.d.ts.map +1 -1
  26. package/dist/core/slash-commands.js +18 -4
  27. package/dist/core/slash-commands.js.map +1 -1
  28. package/dist/core/telegram.d.ts.map +1 -1
  29. package/dist/core/telegram.js +3 -0
  30. package/dist/core/telegram.js.map +1 -1
  31. package/dist/interactive.d.ts.map +1 -1
  32. package/dist/interactive.js +1 -0
  33. package/dist/interactive.js.map +1 -1
  34. package/dist/system-prompt.d.ts.map +1 -1
  35. package/dist/system-prompt.js +21 -3
  36. package/dist/system-prompt.js.map +1 -1
  37. package/dist/tools/bash.d.ts.map +1 -1
  38. package/dist/tools/bash.js +4 -7
  39. package/dist/tools/bash.js.map +1 -1
  40. package/dist/tools/edit.d.ts.map +1 -1
  41. package/dist/tools/edit.js +4 -1
  42. package/dist/tools/edit.js.map +1 -1
  43. package/dist/tools/overflow.d.ts +6 -0
  44. package/dist/tools/overflow.d.ts.map +1 -0
  45. package/dist/tools/overflow.js +13 -0
  46. package/dist/tools/overflow.js.map +1 -0
  47. package/dist/tools/read.d.ts.map +1 -1
  48. package/dist/tools/read.js +6 -2
  49. package/dist/tools/read.js.map +1 -1
  50. package/dist/tools/truncate-utils.test.js +11 -11
  51. package/dist/tools/truncate-utils.test.js.map +1 -1
  52. package/dist/tools/truncate.d.ts +6 -4
  53. package/dist/tools/truncate.d.ts.map +1 -1
  54. package/dist/tools/truncate.js +12 -10
  55. package/dist/tools/truncate.js.map +1 -1
  56. package/dist/ui/App.d.ts +1 -0
  57. package/dist/ui/App.d.ts.map +1 -1
  58. package/dist/ui/App.js +261 -62
  59. package/dist/ui/App.js.map +1 -1
  60. package/dist/ui/buddy/Buddy.d.ts +15 -0
  61. package/dist/ui/buddy/Buddy.d.ts.map +1 -0
  62. package/dist/ui/buddy/Buddy.js +118 -0
  63. package/dist/ui/buddy/Buddy.js.map +1 -0
  64. package/dist/ui/buddy/gacha.d.ts +8 -0
  65. package/dist/ui/buddy/gacha.d.ts.map +1 -0
  66. package/dist/ui/buddy/gacha.js +94 -0
  67. package/dist/ui/buddy/gacha.js.map +1 -0
  68. package/dist/ui/buddy/species.d.ts +52 -0
  69. package/dist/ui/buddy/species.d.ts.map +1 -0
  70. package/dist/ui/buddy/species.js +257 -0
  71. package/dist/ui/buddy/species.js.map +1 -0
  72. package/dist/ui/components/ActivityIndicator.d.ts +10 -2
  73. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  74. package/dist/ui/components/ActivityIndicator.js +79 -22
  75. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  76. package/dist/ui/components/AnimationContext.d.ts +14 -2
  77. package/dist/ui/components/AnimationContext.d.ts.map +1 -1
  78. package/dist/ui/components/AnimationContext.js +54 -8
  79. package/dist/ui/components/AnimationContext.js.map +1 -1
  80. package/dist/ui/components/AssistantMessage.d.ts +2 -1
  81. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  82. package/dist/ui/components/AssistantMessage.js +5 -4
  83. package/dist/ui/components/AssistantMessage.js.map +1 -1
  84. package/dist/ui/components/BackgroundTasksBar.js +2 -2
  85. package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
  86. package/dist/ui/components/CompactionNotice.d.ts.map +1 -1
  87. package/dist/ui/components/CompactionNotice.js +2 -1
  88. package/dist/ui/components/CompactionNotice.js.map +1 -1
  89. package/dist/ui/components/Footer.d.ts +3 -1
  90. package/dist/ui/components/Footer.d.ts.map +1 -1
  91. package/dist/ui/components/Footer.js +23 -48
  92. package/dist/ui/components/Footer.js.map +1 -1
  93. package/dist/ui/components/InputArea.d.ts.map +1 -1
  94. package/dist/ui/components/InputArea.js +2 -1
  95. package/dist/ui/components/InputArea.js.map +1 -1
  96. package/dist/ui/components/Markdown.d.ts +11 -6
  97. package/dist/ui/components/Markdown.d.ts.map +1 -1
  98. package/dist/ui/components/Markdown.js +170 -18
  99. package/dist/ui/components/Markdown.js.map +1 -1
  100. package/dist/ui/components/MessageResponse.d.ts +25 -0
  101. package/dist/ui/components/MessageResponse.d.ts.map +1 -0
  102. package/dist/ui/components/MessageResponse.js +42 -0
  103. package/dist/ui/components/MessageResponse.js.map +1 -0
  104. package/dist/ui/components/NoSelect.d.ts +20 -0
  105. package/dist/ui/components/NoSelect.d.ts.map +1 -0
  106. package/dist/ui/components/NoSelect.js +14 -0
  107. package/dist/ui/components/NoSelect.js.map +1 -0
  108. package/dist/ui/components/PlanProgress.d.ts +7 -0
  109. package/dist/ui/components/PlanProgress.d.ts.map +1 -0
  110. package/dist/ui/components/PlanProgress.js +30 -0
  111. package/dist/ui/components/PlanProgress.js.map +1 -0
  112. package/dist/ui/components/Ratchet.d.ts +20 -0
  113. package/dist/ui/components/Ratchet.d.ts.map +1 -0
  114. package/dist/ui/components/Ratchet.js +30 -0
  115. package/dist/ui/components/Ratchet.js.map +1 -0
  116. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  117. package/dist/ui/components/ServerToolExecution.js +5 -6
  118. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  119. package/dist/ui/components/Spinner.d.ts +8 -2
  120. package/dist/ui/components/Spinner.d.ts.map +1 -1
  121. package/dist/ui/components/Spinner.js +52 -5
  122. package/dist/ui/components/Spinner.js.map +1 -1
  123. package/dist/ui/components/StreamingArea.d.ts +2 -1
  124. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  125. package/dist/ui/components/StreamingArea.js +9 -44
  126. package/dist/ui/components/StreamingArea.js.map +1 -1
  127. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  128. package/dist/ui/components/SubAgentPanel.js +6 -4
  129. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  130. package/dist/ui/components/ThinkingBlock.d.ts +2 -1
  131. package/dist/ui/components/ThinkingBlock.d.ts.map +1 -1
  132. package/dist/ui/components/ThinkingBlock.js +2 -2
  133. package/dist/ui/components/ThinkingBlock.js.map +1 -1
  134. package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -1
  135. package/dist/ui/components/ThinkingIndicator.js +2 -1
  136. package/dist/ui/components/ThinkingIndicator.js.map +1 -1
  137. package/dist/ui/components/ToolExecution.d.ts +1 -0
  138. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  139. package/dist/ui/components/ToolExecution.js +44 -15
  140. package/dist/ui/components/ToolExecution.js.map +1 -1
  141. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  142. package/dist/ui/components/ToolGroupExecution.js +21 -17
  143. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  144. package/dist/ui/components/ToolUseLoader.d.ts +19 -0
  145. package/dist/ui/components/ToolUseLoader.d.ts.map +1 -0
  146. package/dist/ui/components/ToolUseLoader.js +42 -0
  147. package/dist/ui/components/ToolUseLoader.js.map +1 -0
  148. package/dist/ui/components/index.d.ts +1 -1
  149. package/dist/ui/components/index.d.ts.map +1 -1
  150. package/dist/ui/components/index.js +1 -1
  151. package/dist/ui/components/index.js.map +1 -1
  152. package/dist/ui/constants/figures.d.ts +30 -0
  153. package/dist/ui/constants/figures.d.ts.map +1 -0
  154. package/dist/ui/constants/figures.js +41 -0
  155. package/dist/ui/constants/figures.js.map +1 -0
  156. package/dist/ui/hooks/useAgentLoop.d.ts +16 -1
  157. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  158. package/dist/ui/hooks/useAgentLoop.js +49 -141
  159. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  160. package/dist/ui/hooks/useBlink.d.ts +11 -0
  161. package/dist/ui/hooks/useBlink.d.ts.map +1 -0
  162. package/dist/ui/hooks/useBlink.js +19 -0
  163. package/dist/ui/hooks/useBlink.js.map +1 -0
  164. package/dist/ui/hooks/useMinDisplayTime.d.ts +11 -0
  165. package/dist/ui/hooks/useMinDisplayTime.d.ts.map +1 -0
  166. package/dist/ui/hooks/useMinDisplayTime.js +34 -0
  167. package/dist/ui/hooks/useMinDisplayTime.js.map +1 -0
  168. package/dist/ui/hooks/useTerminalProgress.d.ts +2 -0
  169. package/dist/ui/hooks/useTerminalProgress.d.ts.map +1 -0
  170. package/dist/ui/hooks/useTerminalProgress.js +98 -0
  171. package/dist/ui/hooks/useTerminalProgress.js.map +1 -0
  172. package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -1
  173. package/dist/ui/hooks/useTerminalTitle.js +2 -1
  174. package/dist/ui/hooks/useTerminalTitle.js.map +1 -1
  175. package/dist/ui/spinner-frames.d.ts +1 -0
  176. package/dist/ui/spinner-frames.d.ts.map +1 -1
  177. package/dist/ui/spinner-frames.js +15 -5
  178. package/dist/ui/spinner-frames.js.map +1 -1
  179. package/dist/ui/theme/dark.json +2 -1
  180. package/dist/ui/theme/light.json +2 -1
  181. package/dist/ui/theme/theme.d.ts +1 -0
  182. package/dist/ui/theme/theme.d.ts.map +1 -1
  183. package/dist/ui/utils/markdown-cache.d.ts +12 -0
  184. package/dist/ui/utils/markdown-cache.d.ts.map +1 -0
  185. package/dist/ui/utils/markdown-cache.js +43 -0
  186. package/dist/ui/utils/markdown-cache.js.map +1 -0
  187. package/dist/ui/utils/word-diff.d.ts +11 -0
  188. package/dist/ui/utils/word-diff.d.ts.map +1 -0
  189. package/dist/ui/utils/word-diff.js +23 -0
  190. package/dist/ui/utils/word-diff.js.map +1 -0
  191. package/dist/utils/plan-steps.d.ts +41 -0
  192. package/dist/utils/plan-steps.d.ts.map +1 -0
  193. package/dist/utils/plan-steps.js +91 -0
  194. package/dist/utils/plan-steps.js.map +1 -0
  195. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"species.d.ts","sourceRoot":"","sources":["../../../src/ui/buddy/species.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3E,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC;AAElF,MAAM,MAAM,GAAG,GACX,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,MAAM,OAAO,GACf,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,QAAQ,GACR,SAAS,GACT,KAAK,GACL,SAAS,GACT,QAAQ,GACR,OAAO,GACP,OAAO,GACP,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,UAAU,GACV,OAAO,GACP,SAAS,CAAC;AAEd,uEAAuE;AACvE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CASzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAID,eAAO,MAAM,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAM5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM/C,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMpD,CAAC;AAMF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAgG9C,CAAC;AAEF,yBAAyB;AACzB,eAAO,MAAM,WAAW,EAAE,OAAO,EAoBhC,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAoBlD,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,UAAU,EAAE,QAAQ,EAA4D,CAAC;AAI9F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB3E;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAU3D;AAED,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAuBxD;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Buddy companion species definitions.
3
+ *
4
+ * Each species has ASCII art frames (5 lines tall, 12 chars wide),
5
+ * eye placeholder {E} for expression variants, and a rarity tier.
6
+ * Matches Claude Code's buddy system architecture.
7
+ *
8
+ * Line 0 is the hat slot — left blank so hats can overlay it.
9
+ * {E} is replaced with the companion's eye character at render time.
10
+ * Blink replaces {E} with "-" rather than using separate frames.
11
+ */
12
+ /** Hat art for line 0 (replaces blank first line when hat present). */
13
+ export const HAT_LINES = {
14
+ none: "",
15
+ crown: " \\^^^/ ",
16
+ tophat: " ___ ",
17
+ propeller: " ~+~ ",
18
+ halo: " ooo ",
19
+ wizard: " /^\\ ",
20
+ beanie: " --- ",
21
+ tinyduck: " ,> ",
22
+ };
23
+ // ── Rarity config ────────────────────────────────────────────
24
+ export const RARITY_WEIGHTS = [
25
+ ["common", 60],
26
+ ["uncommon", 25],
27
+ ["rare", 10],
28
+ ["epic", 4],
29
+ ["legendary", 1],
30
+ ];
31
+ export const RARITY_STAT_FLOORS = {
32
+ common: 5,
33
+ uncommon: 15,
34
+ rare: 25,
35
+ epic: 35,
36
+ legendary: 50,
37
+ };
38
+ export const RARITY_STARS = {
39
+ common: "\u2605",
40
+ uncommon: "\u2605\u2605",
41
+ rare: "\u2605\u2605\u2605",
42
+ epic: "\u2605\u2605\u2605\u2605",
43
+ legendary: "\u2605\u2605\u2605\u2605\u2605",
44
+ };
45
+ // Rarity colors mapped to theme keys (like CC), with fallback hex
46
+ export const RARITY_THEME_KEYS = {
47
+ common: "textDim",
48
+ uncommon: "success",
49
+ rare: "primary",
50
+ epic: "accent",
51
+ legendary: "warning",
52
+ };
53
+ // ── Bodies: Record<Species, string[][]> ──────────────────────
54
+ // 3 frames per species, 5 lines each, 12 chars wide.
55
+ // Frame 0: idle rest. Frame 1: fidget. Frame 2: alternate/effect.
56
+ export const BODIES = {
57
+ duck: [
58
+ [" ", " __ ", " ({E} > ", " /||\\ ", " ~~~~ "],
59
+ [" ", " __ ", " ({E} > ", " \\||/ ", " ~~~~ "],
60
+ [" ", " __ ", " ({E} > ", " /||\\ ", " ~~~~ "],
61
+ ],
62
+ goose: [
63
+ [" ", " __ ", " ({E} } ", " /||\\ ", " d b "],
64
+ [" ", " __ ", " ({E} } ", " /|~|\\ ", " d b "],
65
+ [" ", " _/__ ", " ({E} } ", " /||\\ ", " d b "],
66
+ ],
67
+ blob: [
68
+ [" ", " .-----. ", " ( {E} {E} ) ", " ( __ ) ", " '---' "],
69
+ [" ", " .-----. ", " ( {E} {E} ) ", " ( __ ) ", " '--' "],
70
+ [" ", " .-----. ", " ( {E} {E} ) ", " (__) ", " '---' "],
71
+ ],
72
+ cat: [
73
+ [" ", " /\\_/\\ ", " ( {E}.{E} ) ", " > ^ < ", " ||| "],
74
+ [" ", " /\\_/\\ ", " ( {E}.{E} ) ", " > ^< ", " ||| "],
75
+ [" ", " /\\_/\\ ", " ( {E}.{E} ) ", " > ^ < ", " ~|| "],
76
+ ],
77
+ snail: [
78
+ [" ", " @/ ", " {E} __ ", " /_/ ", " ~~~~ "],
79
+ [" ", " @/ ", " {E} __ ", " /_/ ", " ~~~~ "],
80
+ [" ", " @/ ", " {E} __ ", " /_/ ", " ~~~~ "],
81
+ ],
82
+ turtle: [
83
+ [" ", " ____ ", " ({E} {E}) ", " /|==|\\ ", " d b "],
84
+ [" ", " ____ ", " ({E} {E}) ", " /|==|\\ ", " d b "],
85
+ [" ", " ____ ", " ({E} {E}) ", " \\|==|/ ", " d b "],
86
+ ],
87
+ owl: [
88
+ [" ", " /{\\ ", " ({E},{E}) ", " /) ) ", ' " " '],
89
+ [" ", " /{\\ ", " ({E},{E}) ", " ( (\\ ", ' " " '],
90
+ [" ", " /{\\ ", " ({E},{E}) ", " /) ) ", ' " " '],
91
+ ],
92
+ penguin: [
93
+ [" ", " (^) ", " /{E}\\ ", " / | \\ ", " d b "],
94
+ [" ", " (^) ", " \\{E}/ ", " \\|/ ", " d b "],
95
+ [" ", " (^) ", " /{E}\\ ", " / | \\ ", " d b "],
96
+ ],
97
+ rabbit: [
98
+ [" ", " (\\(\\ ", " ({E} {E}) ", " (> <) ", ' (" ") '],
99
+ [" ", " (\\(\\ ", " ({E} {E}) ", " (>~<) ", ' (" ") '],
100
+ [" ", " /)/) ", " ({E} {E}) ", " (> <) ", ' (" ") '],
101
+ ],
102
+ ghost: [
103
+ [" ", " .---. ", " ( {E} {E}) ", " | | ", " ~v~v~ "],
104
+ [" ", " .---. ", " ({E} {E} ) ", " | | ", " ~v~v~ "],
105
+ [" ", " .---. ", " ( {E} {E}) ", " | | ", " ~v~v~ "],
106
+ ],
107
+ mushroom: [
108
+ [" ", " ,---. ", " / * * \\ ", " |({E}{E})| ", " |__| "],
109
+ [" ", " ,---. ", " /* * *\\ ", " |({E}{E})| ", " |__| "],
110
+ [" ", " .---. ", " / * * \\ ", " |({E}{E})| ", " |__| "],
111
+ ],
112
+ robot: [
113
+ [" ", " [=====] ", " [{E} {E}] ", " /|=|\\ ", " d b "],
114
+ [" ", " [=====] ", " [{E} {E}] ", " \\|=|/ ", " d b "],
115
+ [" ", " [==o==] ", " [{E} {E}] ", " /|=|\\ ", " d b "],
116
+ ],
117
+ octopus: [
118
+ [" ", " ,--, ", " ({E} {E}) ", " /||||\\ ", " ~~~~~~ "],
119
+ [" ", " ,--, ", " ({E} {E}) ", " \\||||/ ", " ~~~~~~ "],
120
+ [" ", " ,--, ", " ({E} {E}) ", " /||\\/ ", " ~~~~~~ "],
121
+ ],
122
+ axolotl: [
123
+ [" ", " ~\\/~\\/ ", " ({E} {E}) ", " \\__/ ", " ~~~~ "],
124
+ [" ", " ~\\/~\\/ ", " ({E} {E}) ", " \\__/ ", " ~~~~ "],
125
+ [" ", " /~\\/~\\ ", " ({E} {E}) ", " \\__/ ", " ~~~~ "],
126
+ ],
127
+ dragon: [
128
+ [" ", " /\\_/\\_ ", " ( {E} {E} ) ", " ~\\/\\/~ ", " ~/ \\~ "],
129
+ [" ", " /\\_/\\_ ", " ( {E} {E} ) ", " ~\\/\\/~ ", " ~/ ~\\~ "],
130
+ [" ", " /\\_/\\_ ", " ( {E} {E} ) ", " ~/\\/~ ", " ~/ \\~ "],
131
+ ],
132
+ capybara: [
133
+ [" ", " .__. ", " ({E} {E}) ", " (___/) ", ' (" ") '],
134
+ [" ", " .__. ", " ({E} {E}) ", " (___/) ", ' (" ") '],
135
+ [" ", " .__. ", " ( {E}{E}) ", " (___/) ", ' (" ") '],
136
+ ],
137
+ phoenix: [
138
+ [" ", " ,/|\\, ", " ({E} {E}) ", " '|^|' ", " ~\\/\\/ ~ "],
139
+ [" ", " '/|\\` ", " ({E} {E}) ", " ,|^|, ", " ~ \\/\\/~ "],
140
+ [" ", " ,/|\\, ", " ({E} {E}) ", " '|^|' ", " ~\\/\\/ ~ "],
141
+ ],
142
+ cactus: [
143
+ [" ", " | ", " ({E} {E}) ", " -| |- ", " ~~~~~ "],
144
+ [" ", " | ", " ({E} {E}) ", " -| |- ", " ~~~~~ "],
145
+ [" ", " | ", " ( {E}{E}) ", " -| |- ", " ~~~~~ "],
146
+ ],
147
+ chonk: [
148
+ [" ", " .-----. ", " ({E} {E}) ", " ( ) ", " '~~~~' "],
149
+ [" ", " .-----. ", " ({E} {E}) ", " ( ) ", " '~~~~' "],
150
+ [" ", " .------. ", " ({E} {E}) ", " ( ) ", " '~~~~' "],
151
+ ],
152
+ };
153
+ /** All species names. */
154
+ export const ALL_SPECIES = [
155
+ "duck",
156
+ "goose",
157
+ "blob",
158
+ "cat",
159
+ "snail",
160
+ "turtle",
161
+ "owl",
162
+ "penguin",
163
+ "rabbit",
164
+ "ghost",
165
+ "mushroom",
166
+ "robot",
167
+ "octopus",
168
+ "axolotl",
169
+ "dragon",
170
+ "capybara",
171
+ "phoenix",
172
+ "cactus",
173
+ "chonk",
174
+ ];
175
+ /** Species rarity mapping. */
176
+ export const SPECIES_RARITY = {
177
+ duck: "common",
178
+ goose: "common",
179
+ blob: "common",
180
+ cat: "common",
181
+ snail: "common",
182
+ turtle: "common",
183
+ owl: "uncommon",
184
+ penguin: "uncommon",
185
+ rabbit: "uncommon",
186
+ ghost: "uncommon",
187
+ mushroom: "uncommon",
188
+ robot: "rare",
189
+ octopus: "rare",
190
+ axolotl: "rare",
191
+ dragon: "epic",
192
+ capybara: "epic",
193
+ phoenix: "legendary",
194
+ cactus: "legendary",
195
+ chonk: "legendary",
196
+ };
197
+ /** All available eye styles. */
198
+ export const EYE_STYLES = ["\u00B7", "\u2726", "\u00D7", "\u25C9", "@", "\u00B0"];
199
+ /** Render sprite lines with eyes and hat applied. */
200
+ export function renderSprite(bones, frame) {
201
+ const frames = BODIES[bones.species];
202
+ const lines = [...(frames[frame] ?? frames[0])];
203
+ // Replace eye placeholders
204
+ for (let i = 0; i < lines.length; i++) {
205
+ lines[i] = lines[i].replaceAll("{E}", bones.eyes);
206
+ }
207
+ // Apply hat on line 0 if present
208
+ if (bones.hat !== "none" && lines[0].trim() === "") {
209
+ const hatLine = HAT_LINES[bones.hat];
210
+ if (hatLine)
211
+ lines[0] = hatLine;
212
+ }
213
+ return lines;
214
+ }
215
+ /** Render blink frame (eyes replaced with -). */
216
+ export function renderBlink(bones) {
217
+ const lines = [...BODIES[bones.species][0]];
218
+ for (let i = 0; i < lines.length; i++) {
219
+ lines[i] = lines[i].replaceAll("{E}", "-");
220
+ }
221
+ if (bones.hat !== "none" && lines[0].trim() === "") {
222
+ const hatLine = HAT_LINES[bones.hat];
223
+ if (hatLine)
224
+ lines[0] = hatLine;
225
+ }
226
+ return lines;
227
+ }
228
+ /** Compact one-line face for narrow terminals. */
229
+ export function renderFace(bones) {
230
+ const e = bones.eyes;
231
+ switch (bones.species) {
232
+ case "cat":
233
+ return `=${e}.${e}=`;
234
+ case "duck":
235
+ case "goose":
236
+ return `(${e}>`;
237
+ case "blob":
238
+ case "chonk":
239
+ return `(${e} ${e})`;
240
+ case "owl":
241
+ return `{${e},${e}}`;
242
+ case "robot":
243
+ return `[${e}_${e}]`;
244
+ case "ghost":
245
+ return `(${e} ${e})~`;
246
+ case "dragon":
247
+ case "phoenix":
248
+ return `<${e} ${e}>`;
249
+ default:
250
+ return `(${e}${e})`;
251
+ }
252
+ }
253
+ /** Number of animation frames for a species (always 3). */
254
+ export function spriteFrameCount(_species) {
255
+ return 3;
256
+ }
257
+ //# sourceMappingURL=species.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"species.js","sourceRoot":"","sources":["../../../src/ui/buddy/species.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,22 @@
1
- import type { ActivityPhase } from "../hooks/useAgentLoop.js";
1
+ import React from "react";
2
+ import type { ActivityPhase, RetryInfo } from "../hooks/useAgentLoop.js";
2
3
  interface ActivityIndicatorProps {
3
4
  phase: ActivityPhase;
4
5
  elapsedMs: number;
5
6
  thinkingMs: number;
6
7
  isThinking: boolean;
7
8
  tokenEstimate: number;
9
+ /** Raw character count ref for smooth token animation (read every tick). */
10
+ charCountRef?: React.RefObject<number>;
11
+ /** Accumulated real tokens from completed turns. */
12
+ realTokensAccumRef?: React.RefObject<number>;
8
13
  userMessage?: string;
9
14
  activeToolNames?: string[];
10
15
  planMode?: boolean;
16
+ retryInfo?: RetryInfo | null;
17
+ planDone?: number;
18
+ planTotal?: number;
11
19
  }
12
- export declare function ActivityIndicator({ phase, elapsedMs, thinkingMs, isThinking, tokenEstimate, userMessage, activeToolNames, planMode, }: ActivityIndicatorProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function ActivityIndicator({ phase, elapsedMs, thinkingMs, isThinking, tokenEstimate, charCountRef: charCountRefProp, realTokensAccumRef: realTokensAccumRefProp, userMessage, activeToolNames, planMode, retryInfo, planDone, planTotal, }: ActivityIndicatorProps): import("react/jsx-runtime").JSX.Element;
13
21
  export {};
14
22
  //# sourceMappingURL=ActivityIndicator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityIndicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ActivityIndicator.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAsG9D,UAAU,sBAAsB;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAgB,EAChB,eAAoB,EACpB,QAAQ,GACT,EAAE,sBAAsB,2CAqExB"}
1
+ {"version":3,"file":"ActivityIndicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ActivityIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AA4GzE,UAAU,sBAAsB;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,YAAY,EAAE,gBAAgB,EAC9B,kBAAkB,EAAE,sBAAsB,EAC1C,WAAgB,EAChB,eAAoB,EACpB,QAAQ,EACR,SAAS,EACT,QAAY,EACZ,SAAa,GACd,EAAE,sBAAsB,2CAoJxB"}
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React, { useState, useEffect, useMemo } from "react";
2
+ import React, { useMemo, useRef } from "react";
3
3
  import { Text, Box } from "ink";
4
4
  import { useTheme } from "../theme/theme.js";
5
- import { SPINNER_FRAMES, SPINNER_INTERVAL } from "../spinner-frames.js";
5
+ import { SPINNER_FRAMES, SPINNER_INTERVAL, REDUCED_MOTION_DOT } from "../spinner-frames.js";
6
6
  import { PLANNING_PHRASES, selectPhrases, shuffleArray } from "../activity-phrases.js";
7
+ import { useAnimationTick, useAnimationActive, deriveFrame, useReducedMotion, } from "./AnimationContext.js";
7
8
  // ── Color pulse cycle ─────────────────────────────────────
8
9
  const PULSE_COLORS = [
9
10
  "#60a5fa", // blue
@@ -68,27 +69,68 @@ const ShimmerText = ({ text, color, shimmerPos, }) => (_jsx(Text, { children: te
68
69
  const isBright = Math.abs(i - shimmerPos) <= SHIMMER_WIDTH;
69
70
  return (_jsx(Text, { bold: isBright, color: color, dimColor: !isBright, children: char }, i));
70
71
  }) }));
71
- export function ActivityIndicator({ phase, elapsedMs, thinkingMs, isThinking, tokenEstimate, userMessage = "", activeToolNames = [], planMode, }) {
72
+ const RETRY_REASON_LABELS = {
73
+ overloaded: "Provider overloaded",
74
+ rate_limit: "Rate limited",
75
+ empty_response: "Empty response",
76
+ context_overflow: "Context overflow, compacting",
77
+ };
78
+ export function ActivityIndicator({ phase, elapsedMs, thinkingMs, isThinking, tokenEstimate, charCountRef: charCountRefProp, realTokensAccumRef: realTokensAccumRefProp, userMessage = "", activeToolNames = [], planMode, retryInfo, planDone = 0, planTotal = 0, }) {
72
79
  const theme = useTheme();
73
- // ── Single animation tick ────────────────────────────────
74
- // Instead of 5 separate setIntervals (spinner, pulse, ellipsis, shimmer,
75
- // phrase), we use ONE timer at the fastest cadence (SHIMMER_INTERVAL=100ms)
76
- // and derive all animation frames via modular arithmetic. This reduces
77
- // Ink re-renders from ~5 independent state updates to 1 batched update
78
- // per tick, which prevents live-area height miscalculations that cause
79
- // viewport jumping.
80
- const [tick, setTick] = useState(0);
81
- useEffect(() => {
82
- const timer = setInterval(() => {
83
- setTick((t) => t + 1);
84
- }, SHIMMER_INTERVAL);
85
- return () => clearInterval(timer);
86
- }, []);
80
+ const reducedMotion = useReducedMotion();
81
+ // Use the global animation tick instead of a local timer.
82
+ // This eliminates a duplicate 100ms setInterval that was causing
83
+ // independent re-renders on top of the global AnimationProvider tick.
84
+ useAnimationActive();
85
+ const tick = useAnimationTick();
86
+ // ── Smooth token counter animation ─────────────────────
87
+ // Smooths the TOTAL token estimate (real + estimated) so it never
88
+ // jumps — whether tokens arrive from streaming deltas or from
89
+ // turn_end replacing char estimates with real API counts.
90
+ //
91
+ // On each 100ms animation tick the displayed count catches up to
92
+ // the target at a speed that scales with the gap, producing a
93
+ // rolling-odometer effect.
94
+ const displayedTokensRef = useRef(0);
95
+ const currentChars = charCountRefProp?.current ?? 0;
96
+ const realTokens = realTokensAccumRefProp?.current ?? 0;
97
+ const targetTokens = charCountRefProp ? realTokens + Math.ceil(currentChars / 4) : tokenEstimate;
98
+ if (reducedMotion || !charCountRefProp) {
99
+ displayedTokensRef.current = targetTokens;
100
+ }
101
+ else {
102
+ const gap = targetTokens - displayedTokensRef.current;
103
+ if (gap > 0) {
104
+ // Scale increment with gap size for smooth catch-up
105
+ let increment;
106
+ if (gap < 20) {
107
+ increment = 1;
108
+ }
109
+ else if (gap < 50) {
110
+ increment = Math.max(2, Math.ceil(gap * 0.1));
111
+ }
112
+ else if (gap < 200) {
113
+ increment = Math.max(5, Math.ceil(gap * 0.12));
114
+ }
115
+ else {
116
+ // Large jump (e.g. turn_end real tokens) — faster catch-up
117
+ increment = Math.max(15, Math.ceil(gap * 0.08));
118
+ }
119
+ displayedTokensRef.current = Math.min(displayedTokensRef.current + increment, targetTokens);
120
+ }
121
+ else if (gap < 0) {
122
+ // Reset happened (new run) — snap to target
123
+ displayedTokensRef.current = targetTokens;
124
+ }
125
+ }
126
+ const smoothTokenEstimate = displayedTokensRef.current;
87
127
  // Derive all animation frames from the single tick counter
88
- const spinnerFrame = Math.floor((tick * SHIMMER_INTERVAL) / SPINNER_INTERVAL) % SPINNER_FRAMES.length;
128
+ const spinnerFrame = reducedMotion
129
+ ? 0
130
+ : deriveFrame(tick, SPINNER_INTERVAL, SPINNER_FRAMES.length);
89
131
  const pulseColors = planMode ? PLAN_PULSE_COLORS : PULSE_COLORS;
90
- const colorFrame = Math.floor((tick * SHIMMER_INTERVAL) / PULSE_INTERVAL) % pulseColors.length;
91
- const ellipsisFrame = Math.floor((tick * SHIMMER_INTERVAL) / ELLIPSIS_INTERVAL) % ELLIPSIS_FRAMES.length;
132
+ const colorFrame = deriveFrame(tick, PULSE_INTERVAL, pulseColors.length);
133
+ const ellipsisFrame = deriveFrame(tick, ELLIPSIS_INTERVAL, ELLIPSIS_FRAMES.length);
92
134
  // Phrase rotation — pick phrases based on phase + user message + active tools, shuffle, rotate
93
135
  const toolNamesKey = activeToolNames.sort().join(",");
94
136
  const phrases = useMemo(() => shuffleArray(planMode && phase === "waiting"
@@ -104,7 +146,22 @@ export function ActivityIndicator({ phase, elapsedMs, thinkingMs, isThinking, to
104
146
  const shimmerPos = (tick % shimmerCycle) - SHIMMER_WIDTH;
105
147
  // Pad ellipsis to prevent text from shifting
106
148
  const paddedEllipsis = ellipsis + " ".repeat(3 - ellipsis.length);
107
- const meta = buildMetaSuffix(elapsedMs, thinkingMs, isThinking, tokenEstimate);
108
- return (_jsxs(Box, { children: [_jsxs(Text, { color: spinnerColor, bold: true, children: [SPINNER_FRAMES[spinnerFrame], " "] }), _jsx(ShimmerText, { text: phrase, color: spinnerColor, shimmerPos: shimmerPos }), _jsx(Text, { color: theme.textDim, children: paddedEllipsis }), meta && (_jsxs(Text, { color: theme.textDim, children: [" (", meta, ")"] }))] }));
149
+ const meta = buildMetaSuffix(elapsedMs, thinkingMs, isThinking, smoothTokenEstimate);
150
+ // ── Plan progress bar ──────────────────────────────────
151
+ const planBar = useMemo(() => {
152
+ if (planTotal <= 0)
153
+ return null;
154
+ const barWidth = Math.min(planTotal, 20);
155
+ const filledWidth = Math.round((planDone / planTotal) * barWidth);
156
+ return "\u2588".repeat(filledWidth) + "\u2591".repeat(barWidth - filledWidth);
157
+ }, [planDone, planTotal]);
158
+ // ── Retry display ──────────────────────────────────────
159
+ if (phase === "retrying" && retryInfo) {
160
+ const retryLabel = RETRY_REASON_LABELS[retryInfo.reason];
161
+ const retryColor = "#f59e0b"; // amber
162
+ const delaySec = retryInfo.delayMs > 0 ? ` waiting ${Math.round(retryInfo.delayMs / 1000)}s` : "";
163
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: retryColor, bold: true, children: [reducedMotion ? REDUCED_MOTION_DOT : SPINNER_FRAMES[spinnerFrame], " "] }), _jsxs(Text, { color: retryColor, children: [retryLabel, " \u2014 retrying (", retryInfo.attempt, "/", retryInfo.maxAttempts, ")"] }), _jsxs(Text, { color: theme.textDim, children: [delaySec, " (", formatElapsed(elapsedMs), ")"] })] }));
164
+ }
165
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: spinnerColor, bold: true, children: [reducedMotion ? REDUCED_MOTION_DOT : SPINNER_FRAMES[spinnerFrame], " "] }), reducedMotion ? (_jsx(Text, { dimColor: true, color: spinnerColor, children: phrase })) : (_jsx(ShimmerText, { text: phrase, color: spinnerColor, shimmerPos: shimmerPos })), _jsx(Text, { color: theme.textDim, children: reducedMotion ? "..." : paddedEllipsis }), meta && (_jsxs(Text, { color: theme.textDim, children: [" (", meta, ")"] })), planBar && (_jsxs(Text, { children: [" ", _jsx(Text, { color: planDone === planTotal ? theme.success : theme.planPrimary, children: planBar }), _jsxs(Text, { color: theme.textDim, children: [" ", planDone, "/", planTotal] })] }))] }));
109
166
  }
110
167
  //# sourceMappingURL=ActivityIndicator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityIndicator.js","sourceRoot":"","sources":["../../../src/ui/components/ActivityIndicator.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActivityIndicator.js","sourceRoot":"","sources":["../../../src/ui/components/ActivityIndicator.tsx"],"names":[],"mappings":"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"}
@@ -7,8 +7,9 @@ import React from "react";
7
7
  * arithmetic. This replaces per-component setIntervals that each caused
8
8
  * independent React re-renders — N spinners no longer means N timers.
9
9
  *
10
- * The tick only runs while at least one AnimationProvider is mounted
11
- * (i.e. while the app is alive).
10
+ * The tick only runs while at least one component has registered via
11
+ * `useAnimationActive()`, avoiding 10 re-renders/sec during idle streaming
12
+ * when no spinners or animations are visible.
12
13
  */
13
14
  declare const TICK_INTERVAL = 100;
14
15
  export declare function AnimationProvider({ children }: {
@@ -16,7 +17,18 @@ export declare function AnimationProvider({ children }: {
16
17
  }): import("react/jsx-runtime").JSX.Element;
17
18
  /** Returns the current global animation tick counter. */
18
19
  export declare function useAnimationTick(): number;
20
+ /**
21
+ * Register this component as needing animation ticks.
22
+ * The global timer only runs while at least one component is registered.
23
+ * Call this in any component that uses animation frames (spinners, shimmer, etc).
24
+ */
25
+ export declare function useAnimationActive(): void;
19
26
  /** Derive a frame index from the global tick for a given interval and frame count. */
20
27
  export declare function deriveFrame(tick: number, intervalMs: number, frameCount: number): number;
28
+ /**
29
+ * Check if reduced-motion is requested.
30
+ * Respects NO_MOTION and REDUCE_MOTION env vars.
31
+ */
32
+ export declare function useReducedMotion(): boolean;
21
33
  export { TICK_INTERVAL };
22
34
  //# sourceMappingURL=AnimationContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationContext.d.ts","sourceRoot":"","sources":["../../../src/ui/components/AnimationContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAE9E;;;;;;;;;;GAUG;AAEH,QAAA,MAAM,aAAa,MAAM,CAAC;AAI1B,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAW5E;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"AnimationContext.d.ts","sourceRoot":"","sources":["../../../src/ui/components/AnimationContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8E,MAAM,OAAO,CAAC;AAEnG;;;;;;;;;;;GAWG;AAEH,QAAA,MAAM,aAAa,MAAM,CAAC;AAO1B,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA4C5E;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAExF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import React, { createContext, useContext, useState, useEffect } from "react";
2
+ import React, { createContext, useContext, useState, useEffect, useCallback, useRef } from "react";
3
3
  /**
4
4
  * Global animation tick context.
5
5
  *
@@ -8,28 +8,74 @@ import React, { createContext, useContext, useState, useEffect } from "react";
8
8
  * arithmetic. This replaces per-component setIntervals that each caused
9
9
  * independent React re-renders — N spinners no longer means N timers.
10
10
  *
11
- * The tick only runs while at least one AnimationProvider is mounted
12
- * (i.e. while the app is alive).
11
+ * The tick only runs while at least one component has registered via
12
+ * `useAnimationActive()`, avoiding 10 re-renders/sec during idle streaming
13
+ * when no spinners or animations are visible.
13
14
  */
14
- const TICK_INTERVAL = 100; // ms — fast enough for the spinner (120ms frames)
15
+ const TICK_INTERVAL = 100; // ms — fast enough for the spinner (100ms frames)
15
16
  const AnimationContext = createContext(0);
17
+ const AnimationControlContext = createContext({ register: () => () => { } });
16
18
  export function AnimationProvider({ children }) {
17
19
  const [tick, setTick] = useState(0);
18
- useEffect(() => {
19
- const timer = setInterval(() => {
20
+ const subscriberCountRef = useRef(0);
21
+ const timerRef = useRef(null);
22
+ const startTimer = useCallback(() => {
23
+ if (timerRef.current)
24
+ return;
25
+ timerRef.current = setInterval(() => {
20
26
  setTick((t) => t + 1);
21
27
  }, TICK_INTERVAL);
22
- return () => clearInterval(timer);
23
28
  }, []);
24
- return _jsx(AnimationContext, { value: tick, children: children });
29
+ const stopTimer = useCallback(() => {
30
+ if (timerRef.current) {
31
+ clearInterval(timerRef.current);
32
+ timerRef.current = null;
33
+ }
34
+ }, []);
35
+ // Cleanup on unmount
36
+ useEffect(() => {
37
+ return () => stopTimer();
38
+ }, [stopTimer]);
39
+ const register = useCallback(() => {
40
+ subscriberCountRef.current++;
41
+ if (subscriberCountRef.current === 1)
42
+ startTimer();
43
+ return () => {
44
+ subscriberCountRef.current--;
45
+ if (subscriberCountRef.current <= 0) {
46
+ subscriberCountRef.current = 0;
47
+ stopTimer();
48
+ }
49
+ };
50
+ }, [startTimer, stopTimer]);
51
+ const control = React.useMemo(() => ({ register }), [register]);
52
+ return (_jsx(AnimationControlContext, { value: control, children: _jsx(AnimationContext, { value: tick, children: children }) }));
25
53
  }
26
54
  /** Returns the current global animation tick counter. */
27
55
  export function useAnimationTick() {
28
56
  return useContext(AnimationContext);
29
57
  }
58
+ /**
59
+ * Register this component as needing animation ticks.
60
+ * The global timer only runs while at least one component is registered.
61
+ * Call this in any component that uses animation frames (spinners, shimmer, etc).
62
+ */
63
+ export function useAnimationActive() {
64
+ const { register } = useContext(AnimationControlContext);
65
+ useEffect(() => {
66
+ return register();
67
+ }, [register]);
68
+ }
30
69
  /** Derive a frame index from the global tick for a given interval and frame count. */
31
70
  export function deriveFrame(tick, intervalMs, frameCount) {
32
71
  return Math.floor((tick * TICK_INTERVAL) / intervalMs) % frameCount;
33
72
  }
73
+ /**
74
+ * Check if reduced-motion is requested.
75
+ * Respects NO_MOTION and REDUCE_MOTION env vars.
76
+ */
77
+ export function useReducedMotion() {
78
+ return !!(process.env.NO_MOTION || process.env.REDUCE_MOTION);
79
+ }
34
80
  export { TICK_INTERVAL };
35
81
  //# sourceMappingURL=AnimationContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationContext.js","sourceRoot":"","sources":["../../../src/ui/components/AnimationContext.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9E;;;;;;;;;;GAUG;AAEH,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,kDAAkD;AAE7E,MAAM,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAE1C,MAAM,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAAiC;IAC3E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,CAAC,EAAE,aAAa,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,KAAC,gBAAgB,IAAC,KAAK,EAAE,IAAI,YAAG,QAAQ,GAAoB,CAAC;AACtE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,UAAkB,EAAE,UAAkB;IAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACtE,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"AnimationContext.js","sourceRoot":"","sources":["../../../src/ui/components/AnimationContext.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
+ import React from "react";
1
2
  interface AssistantMessageProps {
2
3
  text: string;
3
4
  thinking?: string;
4
5
  thinkingMs?: number;
5
6
  showThinking?: boolean;
6
7
  }
7
- export declare function AssistantMessage({ text, thinking, thinkingMs, showThinking, }: AssistantMessageProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare const AssistantMessage: React.NamedExoticComponent<AssistantMessageProps>;
8
9
  export {};
9
10
  //# sourceMappingURL=AssistantMessage.d.ts.map