@ipv9/tokentracker-cli 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +464 -0
  3. package/README.ko.md +464 -0
  4. package/README.md +476 -0
  5. package/README.zh-CN.md +469 -0
  6. package/bin/tracker.js +52 -0
  7. package/dashboard/dist/app-icon.png +0 -0
  8. package/dashboard/dist/apple-touch-icon.png +0 -0
  9. package/dashboard/dist/assets/ActivityHeatmap-BxBGHY1z.js +42 -0
  10. package/dashboard/dist/assets/Card-GROxUc_6.js +1 -0
  11. package/dashboard/dist/assets/DashboardPage-BZ5VFoBk.js +19 -0
  12. package/dashboard/dist/assets/DevicePage-CQts7ivB.js +1 -0
  13. package/dashboard/dist/assets/DialogTitle-DqFsk26U.js +1 -0
  14. package/dashboard/dist/assets/FadeIn-HBBXW_3q.js +1 -0
  15. package/dashboard/dist/assets/HeaderGithubStar-COD2HfaF.js +1 -0
  16. package/dashboard/dist/assets/IpCheckPage-Cn0l8-BQ.js +15 -0
  17. package/dashboard/dist/assets/LandingPage-CmV1BMU4.js +4356 -0
  18. package/dashboard/dist/assets/LeaderboardAvatar-CiIpWZwb.js +1 -0
  19. package/dashboard/dist/assets/LeaderboardPage-BU0mlR3g.js +6 -0
  20. package/dashboard/dist/assets/LeaderboardProfileModal-C49_3Xm9.js +72 -0
  21. package/dashboard/dist/assets/LeaderboardProfilePage-Bh1n0BAM.js +1 -0
  22. package/dashboard/dist/assets/LimitsPage-fZAmwLWT.js +2 -0
  23. package/dashboard/dist/assets/LocalOnlyNotice-D3rQdA-P.js +1 -0
  24. package/dashboard/dist/assets/LoginPage-enO4XP-c.js +1 -0
  25. package/dashboard/dist/assets/PopoverPopup-pitJEpN1.js +1 -0
  26. package/dashboard/dist/assets/Select-tT9x4ntD.js +1 -0
  27. package/dashboard/dist/assets/SelectItemText-C7F7eIm0.js +1 -0
  28. package/dashboard/dist/assets/SettingsPage-pDasZNU2.js +1 -0
  29. package/dashboard/dist/assets/SkillsPage-DEu7FY-2.js +1 -0
  30. package/dashboard/dist/assets/WidgetsPage-DGcO7rbp.js +1 -0
  31. package/dashboard/dist/assets/WrappedPage-D_1ID213.js +1 -0
  32. package/dashboard/dist/assets/agent-logos-DXQVg1xy.js +1 -0
  33. package/dashboard/dist/assets/arrow-up-right-DNLo92Ba.js +1 -0
  34. package/dashboard/dist/assets/download-DbBBBpJF.js +1 -0
  35. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
  36. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
  37. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
  38. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
  39. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DH5Q319x.woff +0 -0
  40. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-VCNRadI3.woff2 +0 -0
  41. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-BKC3PZkM.woff +0 -0
  42. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DdrQ8KBw.woff2 +0 -0
  43. package/dashboard/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  44. package/dashboard/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  45. package/dashboard/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
  46. package/dashboard/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
  47. package/dashboard/dist/assets/geist-mono-latin-700-normal-D6izGJRP.woff2 +0 -0
  48. package/dashboard/dist/assets/geist-mono-latin-700-normal-QGw08Lff.woff +0 -0
  49. package/dashboard/dist/assets/geist-mono-latin-900-normal-CmoKXrdK.woff +0 -0
  50. package/dashboard/dist/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2 +0 -0
  51. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
  52. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
  53. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
  54. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
  55. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BX9f1BHp.woff +0 -0
  56. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-YOllDaLV.woff2 +0 -0
  57. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-Br6WNUGb.woff +0 -0
  58. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-CrmBTzU2.woff2 +0 -0
  59. package/dashboard/dist/assets/index-BeoRn2gJ.js +2 -0
  60. package/dashboard/dist/assets/info-Bh5qTz6k.js +1 -0
  61. package/dashboard/dist/assets/main-BIY3Nj6I.js +969 -0
  62. package/dashboard/dist/assets/main-G_F9Iu_x.css +1 -0
  63. package/dashboard/dist/assets/use-limits-display-prefs-B4iJ-bBc.js +1 -0
  64. package/dashboard/dist/assets/use-native-settings-DHjPFDv8.js +1 -0
  65. package/dashboard/dist/assets/use-usage-limits-odqe9OY7.js +1 -0
  66. package/dashboard/dist/assets/useCurrency-BsSZiZMP.js +1 -0
  67. package/dashboard/dist/assets/useOpenInteractionType-BQhgq4rv.js +12 -0
  68. package/dashboard/dist/brand-logos/antigravity.svg +1 -0
  69. package/dashboard/dist/brand-logos/claude-code.svg +1 -0
  70. package/dashboard/dist/brand-logos/codebuddy.svg +1 -0
  71. package/dashboard/dist/brand-logos/codex.svg +15 -0
  72. package/dashboard/dist/brand-logos/copilot.svg +1 -0
  73. package/dashboard/dist/brand-logos/cursor.svg +1 -0
  74. package/dashboard/dist/brand-logos/gemini.svg +1 -0
  75. package/dashboard/dist/brand-logos/grok.svg +1 -0
  76. package/dashboard/dist/brand-logos/hermes.svg +1 -0
  77. package/dashboard/dist/brand-logos/kilo.svg +4 -0
  78. package/dashboard/dist/brand-logos/kimi.svg +1 -0
  79. package/dashboard/dist/brand-logos/kiro.svg +1 -0
  80. package/dashboard/dist/brand-logos/openclaw.svg +22 -0
  81. package/dashboard/dist/brand-logos/opencode.svg +3 -0
  82. package/dashboard/dist/clawd/happy.svg +161 -0
  83. package/dashboard/dist/clawd/idle/collapse.svg +101 -0
  84. package/dashboard/dist/clawd/idle/doze.svg +72 -0
  85. package/dashboard/dist/clawd/idle/follow.svg +64 -0
  86. package/dashboard/dist/clawd/idle/living.svg +196 -0
  87. package/dashboard/dist/clawd/idle/look.svg +115 -0
  88. package/dashboard/dist/clawd/idle/yawn.svg +158 -0
  89. package/dashboard/dist/clawd/mini/alert.svg +129 -0
  90. package/dashboard/dist/clawd/mini/crabwalk.svg +76 -0
  91. package/dashboard/dist/clawd/mini/enter-sleep.svg +65 -0
  92. package/dashboard/dist/clawd/mini/enter.svg +115 -0
  93. package/dashboard/dist/clawd/mini/happy.svg +124 -0
  94. package/dashboard/dist/clawd/mini/idle-tight.svg +15 -0
  95. package/dashboard/dist/clawd/mini/idle.svg +83 -0
  96. package/dashboard/dist/clawd/mini/peek.svg +82 -0
  97. package/dashboard/dist/clawd/mini/sleep.svg +112 -0
  98. package/dashboard/dist/clawd/react/double.svg +108 -0
  99. package/dashboard/dist/clawd/react/drag.svg +102 -0
  100. package/dashboard/dist/clawd/react/left.svg +102 -0
  101. package/dashboard/dist/clawd/react/right.svg +102 -0
  102. package/dashboard/dist/clawd/sleep/collapse-sleep.svg +247 -0
  103. package/dashboard/dist/clawd/sleep/sleeping.svg +118 -0
  104. package/dashboard/dist/clawd/sleep/wake.svg +277 -0
  105. package/dashboard/dist/clawd/static-base.svg +21 -0
  106. package/dashboard/dist/clawd/status/disconnected.svg +136 -0
  107. package/dashboard/dist/clawd/status/error.svg +94 -0
  108. package/dashboard/dist/clawd/status/notification.svg +134 -0
  109. package/dashboard/dist/clawd/working/building.svg +231 -0
  110. package/dashboard/dist/clawd/working/carrying.svg +107 -0
  111. package/dashboard/dist/clawd/working/conducting.svg +118 -0
  112. package/dashboard/dist/clawd/working/confused.svg +113 -0
  113. package/dashboard/dist/clawd/working/debugger.svg +91 -0
  114. package/dashboard/dist/clawd/working/juggling.svg +82 -0
  115. package/dashboard/dist/clawd/working/overheated.svg +75 -0
  116. package/dashboard/dist/clawd/working/pushing.svg +125 -0
  117. package/dashboard/dist/clawd/working/sweeping.svg +79 -0
  118. package/dashboard/dist/clawd/working/thinking.svg +119 -0
  119. package/dashboard/dist/clawd/working/typing.svg +153 -0
  120. package/dashboard/dist/clawd/working/ultrathink.svg +166 -0
  121. package/dashboard/dist/clawd/working/wizard.svg +98 -0
  122. package/dashboard/dist/dashboard-dark.png +0 -0
  123. package/dashboard/dist/favicon-16.png +0 -0
  124. package/dashboard/dist/favicon-32.png +0 -0
  125. package/dashboard/dist/favicon.ico +0 -0
  126. package/dashboard/dist/feed.xml +34 -0
  127. package/dashboard/dist/icon-192.png +0 -0
  128. package/dashboard/dist/icon-512.png +0 -0
  129. package/dashboard/dist/index.html +355 -0
  130. package/dashboard/dist/llms.txt +53 -0
  131. package/dashboard/dist/neon_bg.png +0 -0
  132. package/dashboard/dist/robots.txt +7 -0
  133. package/dashboard/dist/share.html +140 -0
  134. package/dashboard/dist/sitemap.xml +27 -0
  135. package/dashboard/dist/widgets-overview.png +0 -0
  136. package/package.json +78 -0
  137. package/scripts/install-local-service.sh +140 -0
  138. package/scripts/uninstall-local-service.sh +21 -0
  139. package/src/cli.js +95 -0
  140. package/src/commands/device-login.js +161 -0
  141. package/src/commands/diagnostics.js +38 -0
  142. package/src/commands/doctor.js +96 -0
  143. package/src/commands/init.js +1195 -0
  144. package/src/commands/serve.js +351 -0
  145. package/src/commands/status.js +609 -0
  146. package/src/commands/sync.js +2285 -0
  147. package/src/commands/uninstall.js +189 -0
  148. package/src/commands/wrapped.js +150 -0
  149. package/src/lib/antigravity-paths.js +48 -0
  150. package/src/lib/browser-auth.js +281 -0
  151. package/src/lib/categorizer-utils.js +232 -0
  152. package/src/lib/claude-categorizer.js +1319 -0
  153. package/src/lib/claude-config.js +204 -0
  154. package/src/lib/cli-ui.js +179 -0
  155. package/src/lib/codex-config.js +350 -0
  156. package/src/lib/codex-context-breakdown.js +400 -0
  157. package/src/lib/codex-rollout-parser.js +623 -0
  158. package/src/lib/codex-token-refresh.js +112 -0
  159. package/src/lib/cursor-config.js +425 -0
  160. package/src/lib/debug-flags.js +7 -0
  161. package/src/lib/diagnostics.js +272 -0
  162. package/src/lib/doctor.js +338 -0
  163. package/src/lib/fs.js +91 -0
  164. package/src/lib/gemini-config.js +288 -0
  165. package/src/lib/grok-hook.js +351 -0
  166. package/src/lib/init-flow.js +42 -0
  167. package/src/lib/local-api.js +1861 -0
  168. package/src/lib/openclaw-hook.js +420 -0
  169. package/src/lib/openclaw-session-plugin.js +520 -0
  170. package/src/lib/opencode-config.js +99 -0
  171. package/src/lib/passive-mode.js +185 -0
  172. package/src/lib/pricing/curated-overrides.json +79 -0
  173. package/src/lib/pricing/index.js +143 -0
  174. package/src/lib/pricing/litellm-fetcher.js +172 -0
  175. package/src/lib/pricing/matcher.js +255 -0
  176. package/src/lib/pricing/seed-snapshot.json +1 -0
  177. package/src/lib/progress.js +76 -0
  178. package/src/lib/project-usage-purge.js +106 -0
  179. package/src/lib/prompt.js +24 -0
  180. package/src/lib/proxy-env.js +131 -0
  181. package/src/lib/rollout.js +8442 -0
  182. package/src/lib/runtime-config.js +122 -0
  183. package/src/lib/skill-usage.js +267 -0
  184. package/src/lib/skills-manager.js +1127 -0
  185. package/src/lib/source-metadata.js +48 -0
  186. package/src/lib/sqlite-reader.js +136 -0
  187. package/src/lib/static-server.js +59 -0
  188. package/src/lib/subscriptions.js +453 -0
  189. package/src/lib/tracker-paths.js +16 -0
  190. package/src/lib/upload-throttle.js +148 -0
  191. package/src/lib/usage-limits.js +1806 -0
  192. package/src/lib/wrapped-aggregator.js +225 -0
@@ -0,0 +1,196 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* 16-Second Master Sequence for Idle Actions */
5
+ .action-body {
6
+ transform-origin: 7.5px 13px; /* Pivot at the base of the torso */
7
+ animation: action-body 16s infinite ease-in-out;
8
+ }
9
+
10
+ /* Continuous Subtle Breathing (Syncs exactly 5 times per 16s loop) */
11
+ .breathe-anim {
12
+ transform-origin: 7.5px 13px;
13
+ animation: breathe 3.2s infinite ease-in-out;
14
+ }
15
+
16
+ /* Shadow shrinking and shifting matching actions */
17
+ .shadow-anim {
18
+ transform-origin: 7.5px 15.5px;
19
+ animation: shadow-action 16s infinite ease-in-out;
20
+ }
21
+
22
+ /* Left Arm (Scratching and Yawn Stretching) */
23
+ .arm-l {
24
+ transform-origin: 1px 10px;
25
+ animation: arm-l-idle 16s infinite ease-in-out;
26
+ }
27
+
28
+ /* Right Arm (Yawn Stretching) */
29
+ .arm-r {
30
+ transform-origin: 14px 10px;
31
+ animation: arm-r-idle 16s infinite ease-in-out;
32
+ }
33
+
34
+ /* Eye Tracking (Looking around) */
35
+ .eyes-look {
36
+ animation: eye-track 16s infinite ease-in-out;
37
+ }
38
+
39
+ /* Occasional Blinks and shutting during Yawn */
40
+ .eyes-blink {
41
+ transform-origin: 7.5px 9px;
42
+ animation: eye-blink 16s infinite linear;
43
+ }
44
+
45
+ /* Yawn Mouth Appearance */
46
+ .yawn-mouth {
47
+ transform-origin: 7.5px 11px;
48
+ animation: yawn-mouth-anim 16s infinite ease-in-out;
49
+ opacity: 0;
50
+ }
51
+
52
+ /* Tiny tear that appears during the big yawn */
53
+ .yawn-tear {
54
+ animation: tear-fall 16s infinite ease-in-out;
55
+ opacity: 0;
56
+ }
57
+
58
+ /* --- Keyframes --- */
59
+
60
+ @keyframes breathe {
61
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
62
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
63
+ }
64
+
65
+ @keyframes action-body {
66
+ 0%, 8%, 26%, 38%, 55%, 80%, 100% { transform: scale(1, 1) translate(0, 0); }
67
+ /* Look Right Tilt */
68
+ 12%, 22% { transform: scale(1, 1) translate(1px, 0); }
69
+ /* Look Left Tilt */
70
+ 42%, 50% { transform: scale(1, 1) translate(-1px, 0); }
71
+ /* Scratching Lean */
72
+ 30%, 36% { transform: scale(1, 1) translate(0.5px, 0); }
73
+ /* Deep Yawn Stretch */
74
+ 60% { transform: scale(0.95, 1.05) translate(0px, -1px); } /* Stretch up */
75
+ 65% { transform: scale(0.9, 1.1) translate(0px, -2px); } /* Peak stretch */
76
+ 72% { transform: scale(1.05, 0.95) translate(0px, 1px); } /* Heavy sigh / squash down */
77
+ 76% { transform: scale(1, 1) translate(0px, 0px); } /* Recover */
78
+ }
79
+
80
+ @keyframes shadow-action {
81
+ 0%, 8%, 26%, 38%, 55%, 80%, 100% { transform: scaleX(1) translate(0, 0); opacity: 0.5; }
82
+ 12%, 22% { transform: scaleX(1) translate(1px, 0); opacity: 0.5; }
83
+ 42%, 50% { transform: scaleX(1) translate(-1px, 0); opacity: 0.5; }
84
+ 30%, 36% { transform: scaleX(1) translate(0.5px, 0); opacity: 0.5; }
85
+ 60% { transform: scaleX(0.95) translate(0, 0); opacity: 0.45; }
86
+ 65% { transform: scaleX(0.9) translate(0, 0); opacity: 0.4; }
87
+ 72% { transform: scaleX(1.05) translate(0, 0); opacity: 0.55; }
88
+ 76% { transform: scaleX(1) translate(0, 0); opacity: 0.5; }
89
+ }
90
+
91
+ @keyframes eye-track {
92
+ 0%, 10%, 25%, 38%, 52%, 58%, 80%, 100% { transform: translate(0px, 0px); }
93
+ 12%, 22% { transform: translate(3px, 0px); } /* Look Right */
94
+ 42%, 50% { transform: translate(-3px, 0px); } /* Look Left */
95
+ 60%, 75% { transform: translate(0px, -1px); } /* Look slightly up during yawn */
96
+ }
97
+
98
+ @keyframes eye-blink {
99
+ 0%, 3%, 7%, 18%, 22%, 43%, 47%, 56%, 83%, 87%, 100% { transform: scaleY(1); }
100
+ 5%, 20%, 45%, 85% { transform: scaleY(0.1); } /* Quick Blinks */
101
+ /* Yawn Closed Eyes */
102
+ 60% { transform: scaleY(1); }
103
+ 62%, 72% { transform: scaleY(0.1); } /* Eyes completely shut */
104
+ 75% { transform: scaleY(1); }
105
+ }
106
+
107
+ @keyframes arm-l-idle {
108
+ 0%, 28% { transform: translate(0, 0) rotate(0deg); }
109
+
110
+ /* Occasional Scratching Sequence (Left Arm) */
111
+ 30% { transform: translate(1px, -3px) rotate(15deg); }
112
+ 31% { transform: translate(1.5px, -4px) rotate(35deg); } /* Up */
113
+ 32% { transform: translate(0.5px, -2.5px) rotate(0deg); } /* Down */
114
+ 33% { transform: translate(1.5px, -4px) rotate(35deg); }
115
+ 34% { transform: translate(0.5px, -2.5px) rotate(0deg); }
116
+ 35% { transform: translate(1.5px, -4px) rotate(35deg); }
117
+ 36% { transform: translate(0.5px, -2.5px) rotate(0deg); }
118
+
119
+ 38%, 58% { transform: translate(0, 0) rotate(0deg); }
120
+
121
+ /* Yawn Stretch */
122
+ 62% { transform: translate(-1px, -2px) rotate(45deg); }
123
+ 65% { transform: translate(-2px, -3px) rotate(80deg); } /* Full outward stretch */
124
+ 72% { transform: translate(0px, 1px) rotate(-15deg); } /* Relax down */
125
+ 76%, 100% { transform: translate(0, 0) rotate(0deg); }
126
+ }
127
+
128
+ @keyframes arm-r-idle {
129
+ 0%, 58% { transform: translate(0, 0) rotate(0deg); }
130
+ /* Yawn Stretch */
131
+ 62% { transform: translate(1px, -2px) rotate(-45deg); }
132
+ 65% { transform: translate(2px, -3px) rotate(-80deg); } /* Full outward stretch */
133
+ 72% { transform: translate(0px, 1px) rotate(15deg); } /* Relax down */
134
+ 76%, 100% { transform: translate(0, 0) rotate(0deg); }
135
+ }
136
+
137
+ @keyframes yawn-mouth-anim {
138
+ 0%, 58%, 76%, 100% { opacity: 0; transform: scale(0.1); }
139
+ 60% { opacity: 1; transform: scale(0.5, 0.2); }
140
+ 65% { opacity: 1; transform: scale(1.1, 1.4); } /* Wide Open */
141
+ 72% { opacity: 1; transform: scale(0.6, 0.4); } /* Shrinking */
142
+ 75% { opacity: 0; transform: scale(0.1); }
143
+ }
144
+
145
+ @keyframes tear-fall {
146
+ 0%, 64%, 80%, 100% { opacity: 0; transform: translateY(0); }
147
+ 66% { opacity: 1; transform: translateY(0); } /* Appears at corner of eye */
148
+ 72% { opacity: 1; transform: translateY(2.5px); } /* Slides down cheek */
149
+ 75% { opacity: 0; transform: translateY(3px); } /* Fades out */
150
+ }
151
+ </style>
152
+ </defs>
153
+
154
+ <!-- Ground Shadow -->
155
+ <rect id="ground-shadow" class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
156
+
157
+ <!-- Static Character Legs (extended up to stay connected during yawn stretch) -->
158
+ <g id="legs" fill="#DE886D">
159
+ <rect id="outer-left-leg" x="3" y="12" width="1" height="3"/>
160
+ <rect id="inner-left-leg" x="5" y="12" width="1" height="3"/>
161
+ <rect id="inner-right-leg" x="9" y="12" width="1" height="3"/>
162
+ <rect id="outer-right-leg" x="11" y="12" width="1" height="3"/>
163
+ </g>
164
+
165
+ <!-- Animated Upper Body (Combines occasional actions + continuous breathing) -->
166
+ <g class="action-body">
167
+ <g class="breathe-anim">
168
+
169
+ <!-- Torso -->
170
+ <rect id="torso" x="2" y="6" width="11" height="7" fill="#DE886D"/>
171
+
172
+ <!-- Arms -->
173
+ <g class="arm-l">
174
+ <rect id="left-arm" x="0" y="9" width="2" height="2" fill="#DE886D"/>
175
+ </g>
176
+ <g class="arm-r">
177
+ <rect id="right-arm" x="13" y="9" width="2" height="2" fill="#DE886D"/>
178
+ </g>
179
+
180
+ <!-- Yawning Mouth (Hidden usually) -->
181
+ <rect class="yawn-mouth" x="6" y="10" width="3" height="2" fill="#000000"/>
182
+
183
+ <!-- Eyes Group -->
184
+ <g class="eyes-look" fill="#000000">
185
+ <g class="eyes-blink">
186
+ <rect id="left-eye" x="4" y="8" width="1" height="2"/>
187
+ <rect id="right-eye" x="10" y="8" width="1" height="2"/>
188
+ </g>
189
+ </g>
190
+
191
+ <!-- Yawn Tear Drop (A tiny detail for the big stretch) -->
192
+ <rect class="yawn-tear" x="3.5" y="10" width="1" height="1" fill="#40C4FF"/>
193
+
194
+ </g>
195
+ </g>
196
+ </svg>
@@ -0,0 +1,115 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* 10-Second Idle Loop — Looking Around + Scratching (no yawn) */
5
+ .action-body {
6
+ transform-origin: 7.5px 13px;
7
+ animation: action-body 10s infinite ease-in-out;
8
+ }
9
+
10
+ .breathe-anim {
11
+ transform-origin: 7.5px 13px;
12
+ animation: breathe 3.2s infinite ease-in-out;
13
+ }
14
+
15
+ .shadow-anim {
16
+ transform-origin: 7.5px 15.5px;
17
+ animation: shadow-action 10s infinite ease-in-out;
18
+ }
19
+
20
+ .arm-l {
21
+ transform-origin: 1px 10px;
22
+ animation: arm-l-idle 10s infinite ease-in-out;
23
+ }
24
+
25
+ .eyes-look {
26
+ animation: eye-track 10s infinite ease-in-out;
27
+ }
28
+
29
+ .eyes-blink {
30
+ transform-origin: 7.5px 9px;
31
+ animation: eye-blink 10s infinite linear;
32
+ }
33
+
34
+ /* --- Keyframes --- */
35
+
36
+ @keyframes breathe {
37
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
38
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
39
+ }
40
+
41
+ @keyframes action-body {
42
+ 0%, 8%, 25%, 30%, 40%, 45%, 60%, 100% { transform: scale(1,1) translate(0,0); }
43
+ /* Look Right */
44
+ 12%, 22% { transform: scale(1,1) translate(1px, 0); }
45
+ /* Look Left */
46
+ 48%, 57% { transform: scale(1,1) translate(-1px, 0); }
47
+ /* Scratch Lean */
48
+ 33%, 38% { transform: scale(1,1) translate(0.5px, 0); }
49
+ }
50
+
51
+ @keyframes shadow-action {
52
+ 0%, 8%, 25%, 30%, 40%, 45%, 60%, 100% { transform: scaleX(1) translate(0,0); opacity: 0.5; }
53
+ 12%, 22% { transform: scaleX(1) translate(1px, 0); opacity: 0.5; }
54
+ 48%, 57% { transform: scaleX(1) translate(-1px, 0); opacity: 0.5; }
55
+ 33%, 38% { transform: scaleX(1) translate(0.5px, 0); opacity: 0.5; }
56
+ }
57
+
58
+ @keyframes eye-track {
59
+ 0%, 10%, 25%, 43%, 60%, 100% { transform: translate(0, 0); }
60
+ 12%, 22% { transform: translate(3px, 0); } /* Look Right */
61
+ 48%, 57% { transform: translate(-3px, 0); } /* Look Left */
62
+ }
63
+
64
+ @keyframes eye-blink {
65
+ 0%, 3%, 7%, 18%, 22%, 47%, 51%, 78%, 82%, 100% { transform: scaleY(1); }
66
+ 5%, 20%, 49%, 80% { transform: scaleY(0.1); }
67
+ }
68
+
69
+ @keyframes arm-l-idle {
70
+ 0%, 30% { transform: translate(0,0) rotate(0deg); }
71
+ /* Scratching Sequence */
72
+ 33% { transform: translate(1px, -3px) rotate(15deg); }
73
+ 34% { transform: translate(1.5px, -4px) rotate(35deg); }
74
+ 35% { transform: translate(0.5px, -2.5px) rotate(0deg); }
75
+ 36% { transform: translate(1.5px, -4px) rotate(35deg); }
76
+ 37% { transform: translate(0.5px, -2.5px) rotate(0deg); }
77
+ 38% { transform: translate(1.5px, -4px) rotate(35deg); }
78
+ 39% { transform: translate(0.5px, -2.5px) rotate(0deg); }
79
+ 42%, 100% { transform: translate(0,0) rotate(0deg); }
80
+ }
81
+ </style>
82
+ </defs>
83
+
84
+ <!-- Ground Shadow -->
85
+ <rect id="ground-shadow" class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
86
+
87
+ <!-- Static Legs -->
88
+ <g id="legs" fill="#DE886D">
89
+ <rect x="3" y="12" width="1" height="3"/>
90
+ <rect x="5" y="12" width="1" height="3"/>
91
+ <rect x="9" y="12" width="1" height="3"/>
92
+ <rect x="11" y="12" width="1" height="3"/>
93
+ </g>
94
+
95
+ <!-- Animated Upper Body -->
96
+ <g class="action-body">
97
+ <g class="breathe-anim">
98
+ <!-- Torso -->
99
+ <rect id="torso" x="2" y="6" width="11" height="7" fill="#DE886D"/>
100
+ <!-- Left Arm (scratches) -->
101
+ <g class="arm-l">
102
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
103
+ </g>
104
+ <!-- Right Arm (static) -->
105
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
106
+ <!-- Eyes -->
107
+ <g class="eyes-look" fill="#000000">
108
+ <g class="eyes-blink">
109
+ <rect x="4" y="8" width="1" height="2"/>
110
+ <rect x="10" y="8" width="1" height="2"/>
111
+ </g>
112
+ </g>
113
+ </g>
114
+ </g>
115
+ </svg>
@@ -0,0 +1,158 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* 5-Second Yawn — One-shot, ends in squashed/eyes-closed pose */
5
+ .action-body {
6
+ transform-origin: 7.5px 13px;
7
+ animation: action-body-yawn 3.8s ease-in-out forwards;
8
+ }
9
+
10
+ .breathe-anim {
11
+ transform-origin: 7.5px 13px;
12
+ animation: breathe 3.2s infinite ease-in-out;
13
+ }
14
+
15
+ .shadow-anim {
16
+ transform-origin: 7.5px 15.5px;
17
+ animation: shadow-yawn 3.8s ease-in-out forwards;
18
+ }
19
+
20
+ .arm-l {
21
+ transform-origin: 1px 10px;
22
+ animation: arm-l-yawn 3.8s ease-in-out forwards;
23
+ }
24
+
25
+ .arm-r {
26
+ transform-origin: 14px 10px;
27
+ animation: arm-r-yawn 3.8s ease-in-out forwards;
28
+ }
29
+
30
+ .eyes-look {
31
+ animation: eye-track-yawn 3.8s ease-in-out forwards;
32
+ }
33
+
34
+ .eyes-blink {
35
+ transform-origin: 7.5px 9px;
36
+ animation: eye-blink-yawn 3.8s linear forwards;
37
+ }
38
+
39
+ .yawn-mouth {
40
+ transform-origin: 7.5px 11px;
41
+ animation: yawn-mouth-anim 3.8s ease-in-out forwards;
42
+ opacity: 0;
43
+ }
44
+
45
+ .yawn-tear {
46
+ animation: tear-fall 3.8s ease-in-out forwards;
47
+ opacity: 0;
48
+ }
49
+
50
+ /* --- Keyframes --- */
51
+
52
+ @keyframes breathe {
53
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
54
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
55
+ }
56
+
57
+ /* Body: neutral → stretch up → peak → squash down (hold from 78%) */
58
+ @keyframes action-body-yawn {
59
+ 0%, 12% { transform: scale(1, 1) translate(0, 0); }
60
+ 32% { transform: scale(0.95, 1.05) translate(0, -1px); }
61
+ 50% { transform: scale(0.9, 1.1) translate(0, -2px); }
62
+ 78%, 100% { transform: scale(1.05, 0.95) translate(0, 1px); }
63
+ }
64
+
65
+ @keyframes shadow-yawn {
66
+ 0%, 12% { transform: scaleX(1); opacity: 0.5; }
67
+ 32% { transform: scaleX(0.95); opacity: 0.45; }
68
+ 50% { transform: scaleX(0.9); opacity: 0.4; }
69
+ 78%, 100% { transform: scaleX(1.05); opacity: 0.55; }
70
+ }
71
+
72
+ /* Eyes look slightly up during stretch, then neutral */
73
+ @keyframes eye-track-yawn {
74
+ 0%, 18% { transform: translate(0, 0); }
75
+ 32%, 68% { transform: translate(0, -1px); }
76
+ 82%, 100% { transform: translate(0, 0); }
77
+ }
78
+
79
+ /* Blink once, then eyes shut for the yawn and stay shut */
80
+ @keyframes eye-blink-yawn {
81
+ 0%, 18% { transform: scaleY(1); }
82
+ 24% { transform: scaleY(0.1); }
83
+ 30% { transform: scaleY(1); }
84
+ 42%, 100% { transform: scaleY(0.1); }
85
+ }
86
+
87
+ /* Both arms stretch outward during yawn, then relax down */
88
+ @keyframes arm-l-yawn {
89
+ 0%, 12% { transform: translate(0, 0) rotate(0deg); }
90
+ 38% { transform: translate(-1px, -2px) rotate(45deg); }
91
+ 50% { transform: translate(-2px, -3px) rotate(80deg); }
92
+ 78%, 100% { transform: translate(0, 1px) rotate(-15deg); }
93
+ }
94
+
95
+ @keyframes arm-r-yawn {
96
+ 0%, 12% { transform: translate(0, 0) rotate(0deg); }
97
+ 38% { transform: translate(1px, -2px) rotate(-45deg); }
98
+ 50% { transform: translate(2px, -3px) rotate(-80deg); }
99
+ 78%, 100% { transform: translate(0, 1px) rotate(15deg); }
100
+ }
101
+
102
+ /* Mouth opens wide then closes */
103
+ @keyframes yawn-mouth-anim {
104
+ 0%, 18% { opacity: 0; transform: scale(0.1); }
105
+ 32% { opacity: 1; transform: scale(0.5, 0.2); }
106
+ 50% { opacity: 1; transform: scale(1.1, 1.4); }
107
+ 68% { opacity: 1; transform: scale(0.6, 0.4); }
108
+ 80%, 100% { opacity: 0; transform: scale(0.1); }
109
+ }
110
+
111
+ /* Tiny tear slides down during peak yawn */
112
+ @keyframes tear-fall {
113
+ 0%, 45% { opacity: 0; transform: translateY(0); }
114
+ 50% { opacity: 1; transform: translateY(0); }
115
+ 68% { opacity: 1; transform: translateY(2.5px); }
116
+ 80%, 100% { opacity: 0; transform: translateY(3px); }
117
+ }
118
+ </style>
119
+ </defs>
120
+
121
+ <!-- Ground Shadow -->
122
+ <rect id="ground-shadow" class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
123
+
124
+ <!-- Static Legs -->
125
+ <g id="legs" fill="#DE886D">
126
+ <rect x="3" y="12" width="1" height="3"/>
127
+ <rect x="5" y="12" width="1" height="3"/>
128
+ <rect x="9" y="12" width="1" height="3"/>
129
+ <rect x="11" y="12" width="1" height="3"/>
130
+ </g>
131
+
132
+ <!-- Animated Upper Body -->
133
+ <g class="action-body">
134
+ <g class="breathe-anim">
135
+ <!-- Torso -->
136
+ <rect id="torso" x="2" y="6" width="11" height="7" fill="#DE886D"/>
137
+ <!-- Left Arm -->
138
+ <g class="arm-l">
139
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
140
+ </g>
141
+ <!-- Right Arm -->
142
+ <g class="arm-r">
143
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
144
+ </g>
145
+ <!-- Yawning Mouth (hidden initially) -->
146
+ <rect class="yawn-mouth" x="6" y="10" width="3" height="2" fill="#000000"/>
147
+ <!-- Eyes -->
148
+ <g class="eyes-look" fill="#000000">
149
+ <g class="eyes-blink">
150
+ <rect x="4" y="8" width="1" height="2"/>
151
+ <rect x="10" y="8" width="1" height="2"/>
152
+ </g>
153
+ </g>
154
+ <!-- Tear -->
155
+ <rect class="yawn-tear" x="3.5" y="10" width="1" height="1" fill="#40C4FF"/>
156
+ </g>
157
+ </g>
158
+ </svg>
@@ -0,0 +1,129 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ .breathe-anim {
5
+ transform-origin: 7.5px 13px;
6
+ animation: breathe 3.2s infinite ease-in-out;
7
+ }
8
+
9
+ .arm-alert {
10
+ transform-origin: 2px 9px;
11
+ animation: alert-arm 4s infinite ease-in-out;
12
+ }
13
+
14
+ /* Normal rect eyes: visible first, hidden after blink */
15
+ .eyes-rect {
16
+ transform-origin: 7.5px 9px; /* eye vertical center for blink */
17
+ animation: rect-vis 4s infinite step-end, rect-move 4s infinite ease-in-out;
18
+ }
19
+
20
+ /* xmark squint eyes: hidden first, visible after switch */
21
+ .eyes-xmark {
22
+ visibility: hidden;
23
+ animation: xmark-vis 4s infinite step-end;
24
+ }
25
+
26
+ .alert-pop {
27
+ animation: alert-flash 4s infinite ease-in-out;
28
+ opacity: 0;
29
+ }
30
+
31
+ @keyframes breathe {
32
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
33
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
34
+ }
35
+
36
+ @keyframes alert-arm {
37
+ 0%, 49% { transform: rotate(0deg); }
38
+ 51% { transform: rotate(20deg); }
39
+ 60% { transform: rotate(-8deg); }
40
+ 64% { transform: rotate(20deg); }
41
+ 68% { transform: rotate(-8deg); }
42
+ 72% { transform: rotate(20deg); }
43
+ 76% { transform: rotate(-8deg); }
44
+ 80% { transform: rotate(20deg); }
45
+ 84% { transform: rotate(-8deg); }
46
+ 88% { transform: rotate(20deg); }
47
+ 92%, 100% { transform: rotate(0deg); }
48
+ }
49
+
50
+ /* Rect eyes: center, wait for exclamation, slowly look left, back, pause, blink, switch */
51
+ @keyframes rect-move {
52
+ 0%, 16% { transform: translate(0, 0) scaleY(1); }
53
+ 22%, 28% { transform: translate(-2px, 0) scaleY(1); }
54
+ 34% { transform: translate(0, 0) scaleY(1); }
55
+ 36% { transform: translate(0, 0) scaleY(0.1); }
56
+ 37%, 39% { transform: translate(0, 0) scaleY(1); }
57
+ 41% { transform: translate(0, 0) scaleY(0.1); }
58
+ 42%, 100% { transform: translate(0, 0) scaleY(1); }
59
+ }
60
+
61
+ /* Rect eyes visibility: visible → hidden at 22%, back at 91% */
62
+ @keyframes rect-vis {
63
+ 0% { visibility: visible; }
64
+ 42% { visibility: hidden; }
65
+ 91% { visibility: visible; }
66
+ }
67
+
68
+ /* xmark eyes visibility: hidden at start, visible at 42%, hidden at 89% */
69
+ @keyframes xmark-vis {
70
+ 0% { visibility: hidden; }
71
+ 42% { visibility: visible; }
72
+ 89% { visibility: hidden; }
73
+ }
74
+
75
+ @keyframes alert-flash {
76
+ 0%, 8% { opacity: 0; transform: scale(0.5); }
77
+ 12% { opacity: 1; transform: translate(0, -4px) scale(1.2); }
78
+ 20%, 70% { opacity: 1; transform: translate(0, -4px) scale(1); }
79
+ 85%, 100% { opacity: 0; transform: translate(0, -6px) scale(0.8); }
80
+ }
81
+ </style>
82
+ </defs>
83
+
84
+ <!-- Entire character leaning -->
85
+ <g transform="rotate(-12, 7.5, 15)">
86
+
87
+ <!-- Legs -->
88
+ <g fill="#DE886D">
89
+ <rect x="3" y="11" width="1" height="4"/>
90
+ <rect x="5" y="11" width="1" height="4"/>
91
+ <rect x="9" y="11" width="1" height="4"/>
92
+ <rect x="11" y="11" width="1" height="4"/>
93
+ </g>
94
+
95
+ <g id="body-js">
96
+ <g class="breathe-anim">
97
+ <!-- Torso -->
98
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
99
+
100
+ <!-- Left Arm — still then shake -->
101
+ <g class="arm-alert">
102
+ <rect x="-1.5" y="9" width="4.5" height="2" fill="#DE886D"/>
103
+ </g>
104
+
105
+ <!-- Right Arm -->
106
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
107
+
108
+ <!-- Phase 1: Normal rect eyes (look left at exclamation, then blink away) -->
109
+ <g class="eyes-rect" fill="#000000">
110
+ <rect x="4" y="8" width="1" height="2"/>
111
+ <rect x="10" y="8" width="1" height="2"/>
112
+ </g>
113
+
114
+ <!-- Phase 2: >< squint eyes (appear after blink) -->
115
+ <g class="eyes-xmark" fill="none" stroke="#000000" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round">
116
+ <polyline points="4,8 5.5,9 4,10"/>
117
+ <polyline points="11,8 9.5,9 11,10"/>
118
+ </g>
119
+ </g>
120
+ </g>
121
+
122
+ </g>
123
+
124
+ <!-- Exclamation mark (outside rotation = stays vertical) -->
125
+ <g class="alert-pop" fill="#FF3D00">
126
+ <rect x="-8" y="5" width="2" height="4"/>
127
+ <rect x="-8" y="10" width="2" height="2"/>
128
+ </g>
129
+ </svg>
@@ -0,0 +1,76 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ .body-hunch {
5
+ transform-origin: 7.5px 15px;
6
+ animation: hunch-walk 2s infinite alternate ease-in-out;
7
+ }
8
+ .leg-1 { animation: sneak-1 0.5s infinite linear; transform-origin: top center; transform-box: fill-box; }
9
+ .leg-2 { animation: sneak-2 0.5s infinite linear; transform-origin: top center; transform-box: fill-box; }
10
+ .shadow-sneak {
11
+ transform-origin: 7.5px 15.5px;
12
+ animation: shadow-shift 2s infinite alternate ease-in-out;
13
+ }
14
+
15
+ /* Sneaking forward and backward */
16
+ @keyframes hunch-walk {
17
+ 0% { transform: translate(-2px, 1px) rotate(2deg); }
18
+ 100% { transform: translate(3px, 1px) rotate(2deg); }
19
+ }
20
+ @keyframes shadow-shift {
21
+ 0% { transform: translateX(-2px) scale(0.9); opacity: 0.4; }
22
+ 100% { transform: translateX(3px) scale(0.9); opacity: 0.4; }
23
+ }
24
+
25
+ /* Fast tiptoe / sneak leg movement */
26
+ @keyframes sneak-1 {
27
+ 0%, 100% { transform: rotate(0deg) scaleY(1); }
28
+ 50% { transform: rotate(-25deg) scaleY(0.7); }
29
+ }
30
+ @keyframes sneak-2 {
31
+ 0%, 100% { transform: rotate(-25deg) scaleY(0.7); }
32
+ 50% { transform: rotate(0deg) scaleY(1); }
33
+ }
34
+
35
+ /* Eyes: look right (toward destination), occasionally glance back and blink */
36
+ .eyes-crabwalk {
37
+ transform-origin: 7.5px 9px;
38
+ animation: crab-eyes 5s infinite ease-in-out;
39
+ }
40
+ @keyframes crab-eyes {
41
+ 0%, 55% { transform: translateX(2px) scaleY(1); }
42
+ 62% { transform: translateX(0) scaleY(1); }
43
+ 66% { transform: translateX(0) scaleY(0.1); }
44
+ 70% { transform: translateX(0) scaleY(1); }
45
+ 75% { transform: translateX(0) scaleY(0.1); }
46
+ 80%, 85% { transform: translateX(0) scaleY(1); }
47
+ 92%, 100% { transform: translateX(2px) scaleY(1); }
48
+ }
49
+ </style>
50
+ </defs>
51
+
52
+ <rect id="ground-shadow" class="shadow-sneak" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
53
+
54
+ <g class="body-hunch">
55
+ <g id="legs" fill="#DE886D">
56
+ <rect id="outer-left-leg" class="leg-1" x="3" y="13" width="1" height="2"/>
57
+ <rect id="inner-left-leg" class="leg-2" x="5" y="13" width="1" height="2"/>
58
+ <rect id="inner-right-leg" class="leg-1" x="9" y="13" width="1" height="2"/>
59
+ <rect id="outer-right-leg" class="leg-2" x="11" y="13" width="1" height="2"/>
60
+ </g>
61
+
62
+ <g id="body-color-group" fill="#DE886D">
63
+ <rect id="torso" x="2" y="6" width="11" height="7"/>
64
+ <!-- Left arm (normal pose) -->
65
+ <rect id="left-arm" x="0" y="9" width="2" height="2"/>
66
+ <!-- Right arm (normal pose, no magnifying glass) -->
67
+ <rect id="right-arm" x="13" y="9" width="2" height="2"/>
68
+ </g>
69
+
70
+ <!-- Eyes: look right, occasionally glance back + blink -->
71
+ <g class="eyes-crabwalk" fill="#000000">
72
+ <rect x="4" y="8" width="1" height="2"/>
73
+ <rect x="10" y="8" width="1" height="2"/>
74
+ </g>
75
+ </g>
76
+ </svg>