hacklab 0.22.2 → 26.921.1

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 (259) hide show
  1. package/README.md +23 -430
  2. package/dist/index.js +132 -23
  3. package/package.json +20 -42
  4. package/LICENSE +0 -21
  5. package/dist/agent-handoff.d.ts +0 -51
  6. package/dist/agent-handoff.d.ts.map +0 -1
  7. package/dist/agent-handoff.js +0 -91
  8. package/dist/agent-handoff.js.map +0 -1
  9. package/dist/api-client.d.ts +0 -18
  10. package/dist/api-client.d.ts.map +0 -1
  11. package/dist/api-client.js +0 -40
  12. package/dist/api-client.js.map +0 -1
  13. package/dist/belt.d.ts +0 -25
  14. package/dist/belt.d.ts.map +0 -1
  15. package/dist/belt.js +0 -113
  16. package/dist/belt.js.map +0 -1
  17. package/dist/card.d.ts +0 -66
  18. package/dist/card.d.ts.map +0 -1
  19. package/dist/card.js +0 -151
  20. package/dist/card.js.map +0 -1
  21. package/dist/cli.d.ts +0 -2
  22. package/dist/cli.d.ts.map +0 -1
  23. package/dist/cli.js +0 -238
  24. package/dist/cli.js.map +0 -1
  25. package/dist/commands/book.d.ts +0 -14
  26. package/dist/commands/book.d.ts.map +0 -1
  27. package/dist/commands/book.js +0 -90
  28. package/dist/commands/book.js.map +0 -1
  29. package/dist/commands/chat.d.ts +0 -36
  30. package/dist/commands/chat.d.ts.map +0 -1
  31. package/dist/commands/chat.js +0 -642
  32. package/dist/commands/chat.js.map +0 -1
  33. package/dist/commands/config.d.ts +0 -2
  34. package/dist/commands/config.d.ts.map +0 -1
  35. package/dist/commands/config.js +0 -84
  36. package/dist/commands/config.js.map +0 -1
  37. package/dist/commands/daemon.d.ts +0 -19
  38. package/dist/commands/daemon.d.ts.map +0 -1
  39. package/dist/commands/daemon.js +0 -72
  40. package/dist/commands/daemon.js.map +0 -1
  41. package/dist/commands/drop.d.ts +0 -12
  42. package/dist/commands/drop.d.ts.map +0 -1
  43. package/dist/commands/drop.js +0 -103
  44. package/dist/commands/drop.js.map +0 -1
  45. package/dist/commands/drops.d.ts +0 -9
  46. package/dist/commands/drops.d.ts.map +0 -1
  47. package/dist/commands/drops.js +0 -96
  48. package/dist/commands/drops.js.map +0 -1
  49. package/dist/commands/essay.d.ts +0 -40
  50. package/dist/commands/essay.d.ts.map +0 -1
  51. package/dist/commands/essay.js +0 -651
  52. package/dist/commands/essay.js.map +0 -1
  53. package/dist/commands/hackathon.d.ts +0 -2
  54. package/dist/commands/hackathon.d.ts.map +0 -1
  55. package/dist/commands/hackathon.js +0 -893
  56. package/dist/commands/hackathon.js.map +0 -1
  57. package/dist/commands/hacker.d.ts +0 -2
  58. package/dist/commands/hacker.d.ts.map +0 -1
  59. package/dist/commands/hacker.js +0 -87
  60. package/dist/commands/hacker.js.map +0 -1
  61. package/dist/commands/jobs.d.ts +0 -18
  62. package/dist/commands/jobs.d.ts.map +0 -1
  63. package/dist/commands/jobs.js +0 -138
  64. package/dist/commands/jobs.js.map +0 -1
  65. package/dist/commands/keys.d.ts +0 -2
  66. package/dist/commands/keys.d.ts.map +0 -1
  67. package/dist/commands/keys.js +0 -138
  68. package/dist/commands/keys.js.map +0 -1
  69. package/dist/commands/login.d.ts +0 -83
  70. package/dist/commands/login.d.ts.map +0 -1
  71. package/dist/commands/login.js +0 -236
  72. package/dist/commands/login.js.map +0 -1
  73. package/dist/commands/logout.d.ts +0 -2
  74. package/dist/commands/logout.d.ts.map +0 -1
  75. package/dist/commands/logout.js +0 -22
  76. package/dist/commands/logout.js.map +0 -1
  77. package/dist/commands/org-jobs.d.ts +0 -50
  78. package/dist/commands/org-jobs.d.ts.map +0 -1
  79. package/dist/commands/org-jobs.js +0 -383
  80. package/dist/commands/org-jobs.js.map +0 -1
  81. package/dist/commands/org.d.ts +0 -67
  82. package/dist/commands/org.d.ts.map +0 -1
  83. package/dist/commands/org.js +0 -1244
  84. package/dist/commands/org.js.map +0 -1
  85. package/dist/commands/ping.d.ts +0 -2
  86. package/dist/commands/ping.d.ts.map +0 -1
  87. package/dist/commands/ping.js +0 -50
  88. package/dist/commands/ping.js.map +0 -1
  89. package/dist/commands/profile.d.ts +0 -72
  90. package/dist/commands/profile.d.ts.map +0 -1
  91. package/dist/commands/profile.js +0 -672
  92. package/dist/commands/profile.js.map +0 -1
  93. package/dist/commands/project.d.ts +0 -2
  94. package/dist/commands/project.d.ts.map +0 -1
  95. package/dist/commands/project.js +0 -583
  96. package/dist/commands/project.js.map +0 -1
  97. package/dist/commands/referral.d.ts +0 -6
  98. package/dist/commands/referral.d.ts.map +0 -1
  99. package/dist/commands/referral.js +0 -93
  100. package/dist/commands/referral.js.map +0 -1
  101. package/dist/commands/rtfm.d.ts +0 -9
  102. package/dist/commands/rtfm.d.ts.map +0 -1
  103. package/dist/commands/rtfm.js +0 -114
  104. package/dist/commands/rtfm.js.map +0 -1
  105. package/dist/commands/scan.d.ts +0 -13
  106. package/dist/commands/scan.d.ts.map +0 -1
  107. package/dist/commands/scan.js +0 -286
  108. package/dist/commands/scan.js.map +0 -1
  109. package/dist/commands/scout.d.ts +0 -18
  110. package/dist/commands/scout.d.ts.map +0 -1
  111. package/dist/commands/scout.js +0 -232
  112. package/dist/commands/scout.js.map +0 -1
  113. package/dist/commands/setup-rail.d.ts +0 -58
  114. package/dist/commands/setup-rail.d.ts.map +0 -1
  115. package/dist/commands/setup-rail.js +0 -135
  116. package/dist/commands/setup-rail.js.map +0 -1
  117. package/dist/commands/setup.d.ts +0 -29
  118. package/dist/commands/setup.d.ts.map +0 -1
  119. package/dist/commands/setup.js +0 -442
  120. package/dist/commands/setup.js.map +0 -1
  121. package/dist/commands/sync.d.ts +0 -9
  122. package/dist/commands/sync.d.ts.map +0 -1
  123. package/dist/commands/sync.js +0 -345
  124. package/dist/commands/sync.js.map +0 -1
  125. package/dist/commands/update.d.ts +0 -2
  126. package/dist/commands/update.d.ts.map +0 -1
  127. package/dist/commands/update.js +0 -92
  128. package/dist/commands/update.js.map +0 -1
  129. package/dist/commands/whoami.d.ts +0 -2
  130. package/dist/commands/whoami.d.ts.map +0 -1
  131. package/dist/commands/whoami.js +0 -41
  132. package/dist/commands/whoami.js.map +0 -1
  133. package/dist/config.d.ts +0 -78
  134. package/dist/config.d.ts.map +0 -1
  135. package/dist/config.js +0 -93
  136. package/dist/config.js.map +0 -1
  137. package/dist/daily-sync.d.ts +0 -150
  138. package/dist/daily-sync.d.ts.map +0 -1
  139. package/dist/daily-sync.js +0 -665
  140. package/dist/daily-sync.js.map +0 -1
  141. package/dist/dossier.d.ts +0 -73
  142. package/dist/dossier.d.ts.map +0 -1
  143. package/dist/dossier.js +0 -141
  144. package/dist/dossier.js.map +0 -1
  145. package/dist/field-normalize.d.ts +0 -4
  146. package/dist/field-normalize.d.ts.map +0 -1
  147. package/dist/field-normalize.js +0 -8
  148. package/dist/field-normalize.js.map +0 -1
  149. package/dist/index.d.ts +0 -3
  150. package/dist/index.d.ts.map +0 -1
  151. package/dist/index.js.map +0 -1
  152. package/dist/job-fields.d.ts +0 -47
  153. package/dist/job-fields.d.ts.map +0 -1
  154. package/dist/job-fields.js +0 -148
  155. package/dist/job-fields.js.map +0 -1
  156. package/dist/machine.d.ts +0 -15
  157. package/dist/machine.d.ts.map +0 -1
  158. package/dist/machine.js +0 -64
  159. package/dist/machine.js.map +0 -1
  160. package/dist/org-fields.d.ts +0 -57
  161. package/dist/org-fields.d.ts.map +0 -1
  162. package/dist/org-fields.js +0 -167
  163. package/dist/org-fields.js.map +0 -1
  164. package/dist/posthog.d.ts +0 -38
  165. package/dist/posthog.d.ts.map +0 -1
  166. package/dist/posthog.js +0 -224
  167. package/dist/posthog.js.map +0 -1
  168. package/dist/project-fields.d.ts +0 -40
  169. package/dist/project-fields.d.ts.map +0 -1
  170. package/dist/project-fields.js +0 -79
  171. package/dist/project-fields.js.map +0 -1
  172. package/dist/prompt-consent.d.ts +0 -73
  173. package/dist/prompt-consent.d.ts.map +0 -1
  174. package/dist/prompt-consent.js +0 -191
  175. package/dist/prompt-consent.js.map +0 -1
  176. package/dist/prompt-stats.d.ts +0 -226
  177. package/dist/prompt-stats.d.ts.map +0 -1
  178. package/dist/prompt-stats.js +0 -561
  179. package/dist/prompt-stats.js.map +0 -1
  180. package/dist/referral.d.ts +0 -14
  181. package/dist/referral.d.ts.map +0 -1
  182. package/dist/referral.js +0 -28
  183. package/dist/referral.js.map +0 -1
  184. package/dist/registry.d.ts +0 -15
  185. package/dist/registry.d.ts.map +0 -1
  186. package/dist/registry.js +0 -180
  187. package/dist/registry.js.map +0 -1
  188. package/dist/resolve-command.d.ts +0 -20
  189. package/dist/resolve-command.d.ts.map +0 -1
  190. package/dist/resolve-command.js +0 -21
  191. package/dist/resolve-command.js.map +0 -1
  192. package/dist/scanners/antigravity.d.ts +0 -41
  193. package/dist/scanners/antigravity.d.ts.map +0 -1
  194. package/dist/scanners/antigravity.js +0 -210
  195. package/dist/scanners/antigravity.js.map +0 -1
  196. package/dist/scanners/github-copilot-telemetry.d.ts +0 -23
  197. package/dist/scanners/github-copilot-telemetry.d.ts.map +0 -1
  198. package/dist/scanners/github-copilot-telemetry.js +0 -220
  199. package/dist/scanners/github-copilot-telemetry.js.map +0 -1
  200. package/dist/scanners/github-copilot.d.ts +0 -68
  201. package/dist/scanners/github-copilot.d.ts.map +0 -1
  202. package/dist/scanners/github-copilot.js +0 -262
  203. package/dist/scanners/github-copilot.js.map +0 -1
  204. package/dist/scanners/incremental.d.ts +0 -282
  205. package/dist/scanners/incremental.d.ts.map +0 -1
  206. package/dist/scanners/incremental.js +0 -788
  207. package/dist/scanners/incremental.js.map +0 -1
  208. package/dist/scanners/index.d.ts +0 -116
  209. package/dist/scanners/index.d.ts.map +0 -1
  210. package/dist/scanners/index.js +0 -726
  211. package/dist/scanners/index.js.map +0 -1
  212. package/dist/scanners/sqlite.d.ts +0 -18
  213. package/dist/scanners/sqlite.d.ts.map +0 -1
  214. package/dist/scanners/sqlite.js +0 -63
  215. package/dist/scanners/sqlite.js.map +0 -1
  216. package/dist/scanners/util.d.ts +0 -112
  217. package/dist/scanners/util.d.ts.map +0 -1
  218. package/dist/scanners/util.js +0 -167
  219. package/dist/scanners/util.js.map +0 -1
  220. package/dist/session.d.ts +0 -106
  221. package/dist/session.d.ts.map +0 -1
  222. package/dist/session.js +0 -191
  223. package/dist/session.js.map +0 -1
  224. package/dist/share-card-colors.d.ts +0 -19
  225. package/dist/share-card-colors.d.ts.map +0 -1
  226. package/dist/share-card-colors.js +0 -36
  227. package/dist/share-card-colors.js.map +0 -1
  228. package/dist/share-card.d.ts +0 -32
  229. package/dist/share-card.d.ts.map +0 -1
  230. package/dist/share-card.js +0 -420
  231. package/dist/share-card.js.map +0 -1
  232. package/dist/share.d.ts +0 -17
  233. package/dist/share.d.ts.map +0 -1
  234. package/dist/share.js +0 -77
  235. package/dist/share.js.map +0 -1
  236. package/dist/sync.d.ts +0 -100
  237. package/dist/sync.d.ts.map +0 -1
  238. package/dist/sync.js +0 -304
  239. package/dist/sync.js.map +0 -1
  240. package/dist/ui.d.ts +0 -33
  241. package/dist/ui.d.ts.map +0 -1
  242. package/dist/ui.js +0 -127
  243. package/dist/ui.js.map +0 -1
  244. package/dist/utils/npmGlobal.d.ts +0 -30
  245. package/dist/utils/npmGlobal.d.ts.map +0 -1
  246. package/dist/utils/npmGlobal.js +0 -69
  247. package/dist/utils/npmGlobal.js.map +0 -1
  248. package/dist/utils/openBrowser.d.ts +0 -14
  249. package/dist/utils/openBrowser.d.ts.map +0 -1
  250. package/dist/utils/openBrowser.js +0 -47
  251. package/dist/utils/openBrowser.js.map +0 -1
  252. package/dist/utils/updateCheck.d.ts +0 -16
  253. package/dist/utils/updateCheck.d.ts.map +0 -1
  254. package/dist/utils/updateCheck.js +0 -111
  255. package/dist/utils/updateCheck.js.map +0 -1
  256. package/dist/utils/waitForEnter.d.ts +0 -12
  257. package/dist/utils/waitForEnter.d.ts.map +0 -1
  258. package/dist/utils/waitForEnter.js +0 -43
  259. package/dist/utils/waitForEnter.js.map +0 -1
@@ -1,420 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "satori/jsx/jsx-runtime";
2
- import { execSync } from 'node:child_process';
3
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
- import { homedir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { Resvg } from '@resvg/resvg-js';
7
- import satori from 'satori';
8
- import { shortModelName } from './scanners/util.js';
9
- import { accentShades } from './share-card-colors.js';
10
- // ── Design tokens (DESIGN.md) ──────────────────────────────────────────────
11
- // The accent is the user's belt/rank colour (same palette as the web profile),
12
- // so the card reads identically to hacklab.so/<handle>. It's the one signal
13
- // colour: corner brackets, the belt + proficiency bars, and the lit heatmap
14
- // cells. Everything else is neutral graphite + grey. Numbers + the nametag are
15
- // Orbitron; every other glyph is JetBrains Mono.
16
- const PAGE_BG = '#0B0D0C';
17
- const CARD_BG = '#101513';
18
- const BORDER = '#1D221F';
19
- const WHITE = '#FFFFFF';
20
- const LABEL = '#B4B4B4';
21
- const LABEL_DIM = '#9A9A9A';
22
- const FOOTER_FG = '#8A8A8A';
23
- // Activity heatmap: 26 weeks × 7 days, matching the web profile (column = week,
24
- // row = day-of-week), so the CLI card and the site read identically.
25
- const HEAT_COLS = 26;
26
- const HEAT_ROWS = 7;
27
- const HEAT_CELL = 14;
28
- const HEAT_GAP = 3;
29
- function formatTokens(n) {
30
- if (n >= 1_000_000_000)
31
- return `${(n / 1_000_000_000).toFixed(1)}B`;
32
- if (n >= 1_000_000)
33
- return `${(n / 1_000_000).toFixed(1)}M`;
34
- if (n >= 1_000)
35
- return `${(n / 1_000).toFixed(0)}K`;
36
- return String(n);
37
- }
38
- // ── Heatmap ─────────────────────────────────────────────────────────────────
39
- // Opacity per intensity tier (0 = empty), matching the web's 18/38/62/100% mix.
40
- const TIER_OPACITY = [0, 0.18, 0.38, 0.62, 1];
41
- // Build the HEAT_ROWS × HEAT_COLS grid from real daily usage. Mirrors the web
42
- // profile's buildRecentWeeks: columns are the latest 26 weeks ending on the
43
- // Saturday on/after today, rows are Sun→Sat, intensity bucketed vs the window
44
- // max. matrix[day][week] holds the tier for that date.
45
- function buildMatrix(daily) {
46
- const perDay = new Map();
47
- for (const e of daily) {
48
- perDay.set(e.date, (perDay.get(e.date) ?? 0) + e.tokens);
49
- }
50
- const today = new Date();
51
- const gridEnd = new Date(today);
52
- gridEnd.setUTCDate(today.getUTCDate() + (6 - today.getUTCDay()));
53
- const gridStart = new Date(gridEnd);
54
- gridStart.setUTCDate(gridEnd.getUTCDate() - HEAT_COLS * 7 + 1);
55
- const values = [];
56
- let max = 0;
57
- for (let d = 0; d < HEAT_ROWS; d++) {
58
- const row = [];
59
- for (let w = 0; w < HEAT_COLS; w++) {
60
- const date = new Date(gridStart);
61
- date.setUTCDate(gridStart.getUTCDate() + w * 7 + d);
62
- const v = perDay.get(date.toISOString().slice(0, 10)) ?? 0;
63
- row.push(v);
64
- if (v > max)
65
- max = v;
66
- }
67
- values.push(row);
68
- }
69
- return values.map((row) => row.map((v) => {
70
- if (v <= 0 || max === 0)
71
- return 0;
72
- const r = v / max;
73
- return r > 0.75 ? 4 : r > 0.5 ? 3 : r > 0.25 ? 2 : 1;
74
- }));
75
- }
76
- function Heatmap({ matrix, accent }) {
77
- return (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: HEAT_GAP }, children: matrix.map((row) => (
78
- // biome-ignore lint/correctness/useJsxKeyInIterable: satori has no keys
79
- _jsx("div", { style: { display: 'flex', gap: HEAT_GAP }, children: row.map((tier) => tier === 0 ? (
80
- // Empty slot: a tiny centred dot, not a full cell.
81
- // biome-ignore lint/correctness/useJsxKeyInIterable: satori has no keys
82
- _jsx("div", { style: {
83
- display: 'flex',
84
- width: HEAT_CELL,
85
- height: HEAT_CELL,
86
- alignItems: 'center',
87
- justifyContent: 'center',
88
- }, children: _jsx("div", { style: {
89
- display: 'flex',
90
- width: 3,
91
- height: 3,
92
- backgroundColor: accent.alpha(0.35),
93
- } }) })) : (
94
- // biome-ignore lint/correctness/useJsxKeyInIterable: satori has no keys
95
- _jsx("div", { style: {
96
- display: 'flex',
97
- width: HEAT_CELL,
98
- height: HEAT_CELL,
99
- backgroundColor: accent.alpha(TIER_OPACITY[tier] ?? 0),
100
- } }))) }))) }));
101
- }
102
- // ── Proficiency bar: solid mint fill over a 10%-mint track. ──────────────────
103
- function Bar({ pct, accent }) {
104
- const fill = Math.max(0, Math.min(100, pct));
105
- return (_jsx("div", { style: {
106
- display: 'flex',
107
- width: 64,
108
- height: 6,
109
- backgroundColor: accent.alpha(0.1),
110
- }, children: _jsx("div", { style: {
111
- display: 'flex',
112
- height: 6,
113
- width: `${fill}%`,
114
- backgroundColor: accent.solid,
115
- } }) }));
116
- }
117
- function StatCard({ value, label }) {
118
- return (_jsxs("div", { style: {
119
- display: 'flex',
120
- flexDirection: 'column',
121
- flex: 1,
122
- justifyContent: 'center',
123
- backgroundColor: CARD_BG,
124
- border: `1px solid ${BORDER}`,
125
- paddingLeft: 16,
126
- gap: 20,
127
- }, children: [_jsx("div", { style: {
128
- display: 'flex',
129
- fontFamily: 'Orbitron',
130
- fontWeight: 700,
131
- fontSize: 33,
132
- lineHeight: 1,
133
- letterSpacing: 0.5,
134
- color: WHITE,
135
- }, children: value }), _jsx("div", { style: {
136
- display: 'flex',
137
- fontSize: 16,
138
- letterSpacing: 2,
139
- color: LABEL,
140
- }, children: label })] }));
141
- }
142
- function PillStat({ value, label }) {
143
- return (_jsxs("div", { style: {
144
- display: 'flex',
145
- flex: 1,
146
- alignItems: 'center',
147
- justifyContent: 'space-between',
148
- backgroundColor: CARD_BG,
149
- border: `1px solid ${BORDER}`,
150
- paddingLeft: 17,
151
- paddingRight: 17,
152
- }, children: [_jsx("div", { style: {
153
- display: 'flex',
154
- fontFamily: 'Orbitron',
155
- fontWeight: 700,
156
- fontSize: 20,
157
- letterSpacing: 0.5,
158
- color: WHITE,
159
- }, children: value }), _jsx("div", { style: {
160
- display: 'flex',
161
- fontSize: 16,
162
- letterSpacing: 2,
163
- color: LABEL,
164
- }, children: label })] }));
165
- }
166
- function CornerBracket({ pos, accent, }) {
167
- const arm = 11;
168
- const thick = 2;
169
- const inset = 0;
170
- const vert = pos[0] === 't' ? 'top' : 'bottom';
171
- const horiz = pos[1] === 'l' ? 'left' : 'right';
172
- return (_jsx("div", { style: {
173
- display: 'flex',
174
- position: 'absolute',
175
- width: arm,
176
- height: arm,
177
- [vert]: inset,
178
- [horiz]: inset,
179
- [`border${vert === 'top' ? 'Top' : 'Bottom'}`]: `${thick}px solid ${accent.solid}`,
180
- [`border${horiz === 'left' ? 'Left' : 'Right'}`]: `${thick}px solid ${accent.solid}`,
181
- } }));
182
- }
183
- function ShareCard({ data, matrix, avatar, }) {
184
- const models = data.models.slice(0, 4);
185
- const modelMax = models.length > 0 ? (models[0]?.tokens ?? 1) : 1;
186
- const cost = Math.round(data.estimatedCost).toLocaleString('en-US');
187
- const progress = Math.max(0, Math.min(100, data.progressPercent));
188
- const initial = (data.handle[0] ?? '?').toUpperCase();
189
- const accent = accentShades(data.beltColor);
190
- const pills = [
191
- { value: `${data.longestStreak}D`, label: 'BEST STREAK' },
192
- ...(data.rank ? [{ value: `#${data.rank}`, label: 'RANK' }] : []),
193
- { value: String(data.followers ?? 0), label: 'FOLLOWERS' },
194
- ];
195
- return (_jsxs("div", { style: {
196
- position: 'relative',
197
- width: 800,
198
- height: 500,
199
- display: 'flex',
200
- flexDirection: 'column',
201
- backgroundColor: PAGE_BG,
202
- padding: 16,
203
- fontFamily: 'JetBrains Mono',
204
- color: WHITE,
205
- }, children: [_jsx(CornerBracket, { pos: 'tl', accent: accent }), _jsx(CornerBracket, { pos: 'tr', accent: accent }), _jsx(CornerBracket, { pos: 'bl', accent: accent }), _jsx(CornerBracket, { pos: 'br', accent: accent }), _jsxs("div", { style: {
206
- display: 'flex',
207
- height: 70,
208
- alignItems: 'center',
209
- justifyContent: 'space-between',
210
- backgroundColor: CARD_BG,
211
- border: `1px solid ${BORDER}`,
212
- paddingLeft: 12,
213
- paddingRight: 16,
214
- }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 18 }, children: [_jsx("div", { style: {
215
- display: 'flex',
216
- width: 46,
217
- height: 46,
218
- border: `1px solid ${BORDER}`,
219
- backgroundColor: '#0C100E',
220
- alignItems: 'center',
221
- justifyContent: 'center',
222
- overflow: 'hidden',
223
- }, children: avatar ? (
224
- // biome-ignore lint/performance/noImgElement: satori rasterises to SVG, not a DOM img
225
- _jsx("img", { src: avatar, width: 46, height: 46, alt: '' })) : (_jsx("div", { style: {
226
- display: 'flex',
227
- fontFamily: 'Orbitron',
228
- fontWeight: 700,
229
- fontSize: 22,
230
- color: accent.solid,
231
- }, children: initial })) }), _jsxs("div", { style: {
232
- display: 'flex',
233
- fontFamily: 'Orbitron',
234
- fontWeight: 700,
235
- fontSize: 20,
236
- letterSpacing: 0.5,
237
- color: WHITE,
238
- }, children: ["@", data.handle.toUpperCase()] })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 14 }, children: [_jsxs("div", { style: {
239
- display: 'flex',
240
- fontFamily: 'Orbitron',
241
- fontWeight: 700,
242
- fontSize: 17,
243
- letterSpacing: 1,
244
- color: WHITE,
245
- }, children: ["L", data.level] }), _jsx("div", { style: {
246
- display: 'flex',
247
- width: 104,
248
- height: 8,
249
- backgroundColor: accent.alpha(0.1),
250
- }, children: _jsx("div", { style: {
251
- display: 'flex',
252
- width: `${progress}%`,
253
- height: 8,
254
- backgroundColor: accent.solid,
255
- } }) })] })] }), _jsxs("div", { style: { display: 'flex', height: 114, gap: 26, marginTop: 18 }, children: [_jsx(StatCard, { value: formatTokens(data.tokensTotal), label: 'TOKENS BURNED' }), _jsx(StatCard, { value: `${data.streak}D`, label: 'STREAK' }), _jsx(StatCard, { value: `$${cost}`, label: 'EST. COST' })] }), _jsxs("div", { style: { display: 'flex', height: 142, gap: 18, marginTop: 18 }, children: [_jsx("div", { style: {
256
- display: 'flex',
257
- width: 284,
258
- flexDirection: 'column',
259
- justifyContent: 'center',
260
- backgroundColor: CARD_BG,
261
- border: `1px solid ${BORDER}`,
262
- paddingLeft: 17,
263
- paddingRight: 17,
264
- gap: 14,
265
- }, children: models.map((m) => (
266
- // biome-ignore lint/correctness/useJsxKeyInIterable: satori has no keys
267
- _jsxs("div", { style: {
268
- display: 'flex',
269
- alignItems: 'center',
270
- justifyContent: 'space-between',
271
- }, children: [_jsx("div", { style: {
272
- display: 'flex',
273
- fontSize: 15,
274
- letterSpacing: 0.4,
275
- color: LABEL_DIM,
276
- }, children: shortModelName(m.name) }), _jsx(Bar, { pct: (m.tokens / modelMax) * 100, accent: accent })] }))) }), _jsx("div", { style: {
277
- display: 'flex',
278
- flex: 1,
279
- alignItems: 'center',
280
- justifyContent: 'center',
281
- backgroundColor: CARD_BG,
282
- border: `1px solid ${BORDER}`,
283
- }, children: _jsx(Heatmap, { matrix: matrix, accent: accent }) })] }), _jsx("div", { style: { display: 'flex', height: 42, gap: 17, marginTop: 18 }, children: pills.map((pill) => (
284
- // biome-ignore lint/correctness/useJsxKeyInIterable: satori has no keys
285
- _jsx(PillStat, { value: pill.value, label: pill.label }))) }), _jsxs("div", { style: {
286
- display: 'flex',
287
- justifyContent: 'space-between',
288
- marginTop: 'auto',
289
- paddingLeft: 2,
290
- paddingRight: 2,
291
- }, children: [_jsxs("div", { style: { display: 'flex', fontSize: 15, color: FOOTER_FG }, children: ["hacklab.so/", data.handle] }), _jsx("div", { style: { display: 'flex', fontSize: 15, color: FOOTER_FG }, children: "#joinhacklab" })] })] }));
292
- }
293
- // ── Font loading (disk-cached so repeat renders are offline + fast) ──────────
294
- const FONT_SOURCES = {
295
- 'orbitron-700.woff': 'https://cdn.jsdelivr.net/fontsource/fonts/orbitron@latest/latin-700-normal.woff',
296
- 'jetbrains-400.woff': 'https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono@latest/latin-400-normal.woff',
297
- 'jetbrains-500.woff': 'https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono@latest/latin-500-normal.woff',
298
- };
299
- async function loadFont(name) {
300
- const dir = join(homedir(), '.hacklab', 'fonts');
301
- const file = join(dir, name);
302
- try {
303
- const cached = await readFile(file);
304
- return cached.buffer.slice(cached.byteOffset, cached.byteOffset + cached.byteLength);
305
- }
306
- catch {
307
- const url = FONT_SOURCES[name];
308
- if (!url)
309
- throw new Error(`unknown font: ${name}`);
310
- const buf = await fetch(url).then((r) => r.arrayBuffer());
311
- await mkdir(dir, { recursive: true });
312
- await writeFile(file, Buffer.from(buf));
313
- return buf;
314
- }
315
- }
316
- async function loadAvatar(url) {
317
- if (!url)
318
- return null;
319
- try {
320
- const res = await fetch(url);
321
- if (!res.ok)
322
- return null;
323
- const type = res.headers.get('content-type') ?? 'image/png';
324
- const buf = Buffer.from(await res.arrayBuffer());
325
- return `data:${type};base64,${buf.toString('base64')}`;
326
- }
327
- catch {
328
- return null;
329
- }
330
- }
331
- export async function generateShareCard(data) {
332
- const [orbitron700, jetbrains400, jetbrains500, avatar] = await Promise.all([
333
- loadFont('orbitron-700.woff'),
334
- loadFont('jetbrains-400.woff'),
335
- loadFont('jetbrains-500.woff'),
336
- loadAvatar(data.avatarUrl),
337
- ]);
338
- const matrix = buildMatrix(data.dailyActivity);
339
- const svg = await satori(_jsx(ShareCard, { data: data, matrix: matrix, avatar: avatar }), {
340
- width: 800,
341
- height: 500,
342
- fonts: [
343
- { name: 'Orbitron', data: orbitron700, weight: 700, style: 'normal' },
344
- {
345
- name: 'JetBrains Mono',
346
- data: jetbrains400,
347
- weight: 400,
348
- style: 'normal',
349
- },
350
- {
351
- name: 'JetBrains Mono',
352
- data: jetbrains500,
353
- weight: 500,
354
- style: 'normal',
355
- },
356
- ],
357
- });
358
- const resvg = new Resvg(svg, {
359
- fitTo: { mode: 'width', value: 1600 },
360
- });
361
- const png = Buffer.from(resvg.render().asPng());
362
- const dir = join(homedir(), '.hacklab');
363
- await mkdir(dir, { recursive: true });
364
- const filePath = join(dir, 'share-card.png');
365
- await writeFile(filePath, png);
366
- return filePath;
367
- }
368
- export function displayInTerminal(pngBuffer) {
369
- const env = process.env;
370
- const isKitty = env.TERM === 'xterm-kitty' ||
371
- env.TERM === 'xterm-ghostty' ||
372
- env.KITTY_WINDOW_ID !== undefined ||
373
- env.TERM_PROGRAM === 'WezTerm' ||
374
- env.TERM_PROGRAM === 'WarpTerminal' ||
375
- env.KONSOLE_VERSION !== undefined;
376
- const isITerm = env.TERM_PROGRAM === 'iTerm.app' ||
377
- env.TERM_PROGRAM === 'vscode' ||
378
- (!isKitty && env.TERM_PROGRAM === 'WezTerm');
379
- try {
380
- if (isKitty) {
381
- const base64 = pngBuffer.toString('base64');
382
- const chunkSize = 4096;
383
- for (let i = 0; i < base64.length; i += chunkSize) {
384
- const chunk = base64.slice(i, i + chunkSize);
385
- const isLast = i + chunkSize >= base64.length;
386
- if (i === 0) {
387
- process.stdout.write(`\x1b_Ga=T,f=100,m=${isLast ? 0 : 1};${chunk}\x1b\\`);
388
- }
389
- else {
390
- process.stdout.write(`\x1b_Gm=${isLast ? 0 : 1};${chunk}\x1b\\`);
391
- }
392
- }
393
- process.stdout.write('\n');
394
- return true;
395
- }
396
- if (isITerm) {
397
- const base64 = pngBuffer.toString('base64');
398
- const filename = Buffer.from('hacklab-card.png').toString('base64');
399
- process.stdout.write(`\x1b]1337;File=name=${filename};size=${pngBuffer.length};inline=1:${base64}\x07\n`);
400
- return true;
401
- }
402
- return false;
403
- }
404
- catch {
405
- return false;
406
- }
407
- }
408
- export async function copyToClipboard(imagePath) {
409
- if (process.platform !== 'darwin')
410
- return false;
411
- try {
412
- const script = `set the clipboard to (read POSIX file "${imagePath}" as «class PNGf»)`;
413
- execSync(`osascript -e '${script}'`, { timeout: 5000 });
414
- return true;
415
- }
416
- catch {
417
- return false;
418
- }
419
- }
420
- //# sourceMappingURL=share-card.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"share-card.js","sourceRoot":"","sources":["../src/share-card.tsx"],"names":[],"mappings":"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"}
package/dist/share.d.ts DELETED
@@ -1,17 +0,0 @@
1
- import type { ShareCardData } from './share-card.js';
2
- export type { ShareCardData } from './share-card.js';
3
- /**
4
- * Prefill for the X compose window. The paste line is only true when the png
5
- * really made it onto the clipboard — which only happens on macOS, so cmd is
6
- * the right modifier whenever it is printed at all.
7
- */
8
- export declare function shareTweetText(card: Pick<ShareCardData, 'handle' | 'tokensTotal'>, clipboardReady?: boolean): string;
9
- /** Generate the stats card and show it inline. Text fallback is the scan receipt. */
10
- export declare function renderShareCard(card: ShareCardData): Promise<string | null>;
11
- /**
12
- * A bare Enter opens X with the card; typing anything first, or a non-TTY,
13
- * declines. That one opt-in gates every sharing side effect — the Desktop copy
14
- * included, so declining leaves the user's Desktop untouched.
15
- */
16
- export declare function promptShareOnX(card: ShareCardData, cardPath: string | null): Promise<void>;
17
- //# sourceMappingURL=share.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAKpD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAIpD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,aAAa,CAAC,EACnD,cAAc,UAAQ,GACrB,MAAM,CAUR;AAMD,qFAAqF;AACrF,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
package/dist/share.js DELETED
@@ -1,77 +0,0 @@
1
- import { copyFile, readFile } from 'node:fs/promises';
2
- import { homedir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { formatTokens } from './scanners/util.js';
5
- import { dim, info, success } from './ui.js';
6
- import { openBrowser } from './utils/openBrowser.js';
7
- import { waitForBareEnter } from './utils/waitForEnter.js';
8
- const SHARE_ORIGIN = 'https://hacklab.so';
9
- /**
10
- * Prefill for the X compose window. The paste line is only true when the png
11
- * really made it onto the clipboard — which only happens on macOS, so cmd is
12
- * the right modifier whenever it is printed at all.
13
- */
14
- export function shareTweetText(card, clipboardReady = false) {
15
- return [
16
- `I burned ${formatTokens(card.tokensTotal)} tokens 🔥`,
17
- ...(clipboardReady ? ['', '(press cmd+v)'] : []),
18
- '',
19
- `${SHARE_ORIGIN}/${card.handle}`,
20
- '',
21
- '',
22
- '#joinhacklab #riplinkedin',
23
- ].join('\n');
24
- }
25
- function desktopCardPath() {
26
- return join(homedir(), 'Desktop', 'hacklab-card.png');
27
- }
28
- /** Generate the stats card and show it inline. Text fallback is the scan receipt. */
29
- export async function renderShareCard(card) {
30
- try {
31
- const { generateShareCard, displayInTerminal } = await import('./share-card.js');
32
- const cardPath = await generateShareCard(card);
33
- const imgBuf = Buffer.from(await readFile(cardPath));
34
- displayInTerminal(imgBuf);
35
- return cardPath;
36
- }
37
- catch {
38
- return null;
39
- }
40
- }
41
- /**
42
- * A bare Enter opens X with the card; typing anything first, or a non-TTY,
43
- * declines. That one opt-in gates every sharing side effect — the Desktop copy
44
- * included, so declining leaves the user's Desktop untouched.
45
- */
46
- export async function promptShareOnX(card, cardPath) {
47
- console.log('');
48
- const shareOnX = await waitForBareEnter(`(press enter to share) ${dim('· anything else skips')} `);
49
- if (!shareOnX)
50
- return;
51
- let clipboardReady = false;
52
- if (cardPath) {
53
- const dest = desktopCardPath();
54
- try {
55
- await copyFile(cardPath, dest);
56
- success(`saved to ${dest}`);
57
- }
58
- catch {
59
- // Desktop missing (headless/CI) — the working copy still lives in ~/.hacklab
60
- info(dim(`could not save ${dest}`));
61
- }
62
- try {
63
- const { copyToClipboard } = await import('./share-card.js');
64
- clipboardReady = await copyToClipboard(cardPath);
65
- if (clipboardReady)
66
- success('image copied to clipboard');
67
- }
68
- catch {
69
- info(dim('could not copy the image to the clipboard'));
70
- }
71
- }
72
- else {
73
- info(dim('image unavailable — opening X with the post text only.'));
74
- }
75
- await openBrowser(`https://x.com/intent/tweet?text=${encodeURIComponent(shareTweetText(card, clipboardReady))}`);
76
- }
77
- //# sourceMappingURL=share.js.map
package/dist/share.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"share.js","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"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"}
package/dist/sync.d.ts DELETED
@@ -1,100 +0,0 @@
1
- import type { PromptSyncTier } from './prompt-consent.js';
2
- import { type PromptStats } from './prompt-stats.js';
3
- import { type AggregateScan, type CursorScanStatus, type CursorStats, type DailyToolEntry, formatBytes, formatTokens } from './scanners/index.js';
4
- import { type Session } from './session.js';
5
- export type { CursorScanStatus, CursorStats, DailyToolEntry };
6
- export { formatBytes, formatTokens };
7
- export type SyncResult = {
8
- claudeTotal: number;
9
- codexTotal: number;
10
- cursorTotal: number;
11
- openclawTotal: number;
12
- hermesTotal: number;
13
- opencodeTotal: number;
14
- grokTotal: number;
15
- copilotTotal: number;
16
- antigravityTotal: number;
17
- messagesTotal: number;
18
- allEntries: DailyToolEntry[];
19
- cursorStats: CursorStats | null;
20
- result: Record<string, unknown>;
21
- models: Array<{
22
- name: string;
23
- tokens: number;
24
- }>;
25
- cursorScanStatus: CursorScanStatus;
26
- /** What was uploaded under the consent tier, or null when opted out. */
27
- promptStats: PromptStats | null;
28
- };
29
- export declare const LOGIN_EXPIRED_MESSAGE = "login expired. run hacklab login again";
30
- /**
31
- * A rejected upload, carrying the HTTP status and Retry-After. The minutely
32
- * tick needs to tell a 429 (back off, the server said so) from a 500 (retry
33
- * next minute); every other caller only ever reads `.message`, which is
34
- * unchanged from the plain Error this replaced.
35
- */
36
- export declare class SyncUploadError extends Error {
37
- readonly status: number;
38
- readonly retryAfter: string | null;
39
- constructor(message: string, status: number, retryAfter?: string | null);
40
- }
41
- type SessionCheck = {
42
- status: 'ok';
43
- } | {
44
- status: 'unauthorized';
45
- } | {
46
- status: 'failed';
47
- message: string;
48
- };
49
- export declare function fetchApi(session: Session, path: string, init?: RequestInit): Promise<Response>;
50
- export declare function checkSession(session: Session): Promise<SessionCheck>;
51
- /**
52
- * Ask the server to mirror the user's pinned GitHub repos into their projects
53
- * (and drop ones that are no longer pinned/public). Best-effort and non-fatal —
54
- * returns null on any failure so a GitHub hiccup never fails `sync`.
55
- */
56
- export declare function syncGithubRepos(session: Session): Promise<{
57
- synced: number;
58
- removed: number;
59
- } | null>;
60
- /**
61
- * Upload a scan's token totals to the backend (the `/api/claim/sync` capsule).
62
- * The single place the upload payload is built and the response is checked, so
63
- * the `sync` command and the daily background job all push the exact same
64
- * shape. Throws LOGIN_EXPIRED_MESSAGE on 401 so callers can tell an expired
65
- * session apart from a transient failure. Pass `timeoutMs` to hard-cap a slow
66
- * upload; omit it for an unbounded one-shot.
67
- *
68
- * Tags the upload with this machine's stable id so the backend can sum usage
69
- * across the user's machines while keeping each machine's re-sync idempotent.
70
- */
71
- export declare function uploadTokenScan(session: Session, scan: AggregateScan, opts?: {
72
- timeoutMs?: number;
73
- interactive?: boolean;
74
- /** Consented prompt statistics. Omitted entirely unless the user opted in. */
75
- promptStats?: PromptStats | null;
76
- }): Promise<Record<string, unknown>>;
77
- /**
78
- * Ask the backend to slide this session's expiry forward (token unchanged) and
79
- * persist the result. Returns the updated session, or null if the refresh failed
80
- * (e.g. the session already expired — that needs a fresh `hacklab login`).
81
- */
82
- export declare function refreshSession(session: Session): Promise<Session | null>;
83
- /**
84
- * Proactively refresh the session when it's nearing expiry, so a long-running
85
- * daily background sync never lapses. A no-op (returns the session unchanged)
86
- * when there's plenty of time left or the refresh fails.
87
- */
88
- export declare function ensureFreshSession(session: Session): Promise<Session>;
89
- export declare function runSync(session: Session, opts?: {
90
- interactive?: boolean;
91
- promptSync?: PromptSyncTier;
92
- }): Promise<SyncResult>;
93
- /**
94
- * Scan the local transcripts for the given consent tier, or return null when
95
- * there's no consent (or nothing to find). Never throws: prompt stats are an
96
- * extra on top of the token sync, so a scan failure must not cost the user
97
- * their token upload.
98
- */
99
- export declare function scanConsentedPromptStats(tier: PromptSyncTier | undefined): Promise<PromptStats | null>;
100
- //# sourceMappingURL=sync.d.ts.map