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
package/dist/session.js DELETED
@@ -1,191 +0,0 @@
1
- import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
2
- import { homedir } from 'node:os';
3
- import { dirname, join } from 'node:path';
4
- const SESSION_PATH = join(homedir(), '.hacklab', 'session.json');
5
- const LEGACY_SESSION_TTL_MS = 7 * 24 * 60 * 60 * 1000;
6
- export function getSessionPath() {
7
- return process.env.HACKLAB_SESSION_PATH ?? SESSION_PATH;
8
- }
9
- export async function saveSession(session) {
10
- const path = getSessionPath();
11
- await mkdir(dirname(path), { recursive: true });
12
- await writeFile(path, `${JSON.stringify(session, null, 2)}\n`, 'utf8');
13
- }
14
- function parseDate(value) {
15
- if (!value)
16
- return null;
17
- const date = new Date(value);
18
- return Number.isNaN(date.getTime()) ? null : date;
19
- }
20
- export function getSessionExpiresAt(session) {
21
- const explicit = parseDate(session.expiresAt);
22
- if (explicit)
23
- return explicit;
24
- const savedAt = parseDate(session.savedAt);
25
- if (!savedAt)
26
- return null;
27
- return new Date(savedAt.getTime() + LEGACY_SESSION_TTL_MS);
28
- }
29
- export function isSessionExpired(session, now = new Date()) {
30
- const expiresAt = getSessionExpiresAt(session);
31
- return expiresAt ? expiresAt.getTime() <= now.getTime() : false;
32
- }
33
- export async function loadSessionState() {
34
- let raw;
35
- try {
36
- raw = await readFile(getSessionPath(), 'utf8');
37
- }
38
- catch {
39
- return { status: 'missing', session: null };
40
- }
41
- let data;
42
- try {
43
- data = JSON.parse(raw);
44
- }
45
- catch {
46
- return { status: 'invalid', session: null };
47
- }
48
- if (!data.token || !data.email || !data.appUrl) {
49
- return { status: 'invalid', session: null };
50
- }
51
- const session = data;
52
- if (isSessionExpired(session)) {
53
- return { status: 'expired', session: null };
54
- }
55
- return { status: 'ok', session };
56
- }
57
- export async function loadSession() {
58
- return (await loadSessionState()).session;
59
- }
60
- /**
61
- * Delete the local session file. Returns true if a file was removed, false if
62
- * there was nothing to clear (no session). Local-only — it doesn't revoke the
63
- * token server-side, so the token stays valid until it expires.
64
- */
65
- export async function clearSession() {
66
- try {
67
- await rm(getSessionPath());
68
- return true;
69
- }
70
- catch {
71
- return false;
72
- }
73
- }
74
- /**
75
- * Named backends the CLI can target via `--env`. Any other backend (e.g. an
76
- * internal preview or self-hosted instance) can be targeted with
77
- * `HACKLAB_APP_URL`.
78
- */
79
- export const HACKLAB_ENVIRONMENTS = {
80
- production: 'https://hacklab.so',
81
- development: 'http://localhost:3000',
82
- };
83
- export function isHacklabEnv(value) {
84
- return Object.hasOwn(HACKLAB_ENVIRONMENTS, value);
85
- }
86
- // Natural words that aren't a prefix of a canonical name but mean the same env.
87
- const ENV_ALIASES = {
88
- local: 'development',
89
- localhost: 'development',
90
- };
91
- /**
92
- * Resolve an `--env` value to a canonical backend name. Accepts the full name,
93
- * any unambiguous prefix (`dev`/`prod`, mirroring how command names resolve so
94
- * abbreviations work everywhere), and a couple of natural aliases
95
- * (`local`/`localhost`). Returns null if it matches none — the env names start
96
- * with distinct letters, so a prefix is never ambiguous.
97
- */
98
- export function resolveHacklabEnv(value) {
99
- if (isHacklabEnv(value))
100
- return value;
101
- if (Object.hasOwn(ENV_ALIASES, value))
102
- return ENV_ALIASES[value];
103
- const names = Object.keys(HACKLAB_ENVIRONMENTS);
104
- const matches = names.filter((n) => n.startsWith(value));
105
- return matches.length === 1 ? matches[0] : null;
106
- }
107
- /**
108
- * Reverse of HACKLAB_ENVIRONMENTS: the canonical env name for a backend URL, or
109
- * null when it isn't one of the three known backends (e.g. a custom
110
- * HACKLAB_APP_URL). Used to suggest the right `hacklab login --env <name>` when
111
- * a per-backend token is rejected.
112
- */
113
- export function envNameForUrl(url) {
114
- const normalized = url.replace(/\/$/, '');
115
- for (const [name, backend] of Object.entries(HACKLAB_ENVIRONMENTS)) {
116
- if (backend === normalized)
117
- return name;
118
- }
119
- return null;
120
- }
121
- /**
122
- * Which backend to talk to, by precedence:
123
- * 1. an explicit `HACKLAB_APP_URL` (also how `--env` is applied — see
124
- * index.ts) so `--env development` always switches backends;
125
- * 2. the backend you logged into (`session.appUrl`), when a session is given;
126
- * 3. the production default, so a freshly-installed `hacklab` hits hacklab.so
127
- * rather than a localhost server that isn't running.
128
- *
129
- * The single source of this precedence: `getAppUrl()` is the no-session form,
130
- * and the chat command's `baseUrl()` is the session-aware form. Note the token
131
- * is per-backend, so pointing `--env` at an env you haven't logged into will
132
- * 401 until you `hacklab login --env <that>`.
133
- */
134
- export function resolveAppUrl(session) {
135
- const url = process.env.HACKLAB_APP_URL ??
136
- session?.appUrl ??
137
- HACKLAB_ENVIRONMENTS.production;
138
- // Normalize here so callers never re-strip the trailing slash themselves.
139
- return url.replace(/\/$/, '');
140
- }
141
- // Turn a 401 from any authenticated endpoint into something the user can act
142
- // on. A bare "Unauthorized" is almost always a per-backend token mismatch: the
143
- // saved session only authenticates against the backend you logged into, but
144
- // this command targets a different one (via --env / HACKLAB_APP_URL), so its
145
- // token isn't valid there. Point at the exact re-login command for the *target*
146
- // backend instead of dead-ending.
147
- export function unauthorizedHint(session) {
148
- const target = resolveAppUrl(session);
149
- const env = envNameForUrl(target);
150
- const loginCmd = env && env !== 'production' ? `hacklab login --env ${env}` : 'hacklab login';
151
- const sessionUrl = session.appUrl.replace(/\/$/, '');
152
- if (sessionUrl !== target) {
153
- return `unauthorized — your session is for ${sessionUrl}, but this targets ${target}. run \`${loginCmd}\` to sign in there.`;
154
- }
155
- return `unauthorized — your session may have expired. run \`${loginCmd}\` to sign in again.`;
156
- }
157
- export function getAppUrl() {
158
- return resolveAppUrl();
159
- }
160
- /**
161
- * Ask the backend whether this session still works.
162
- *
163
- * `GET /api/hackers/me` is the cheapest authenticated read there is, and its
164
- * answer is unambiguous: the route resolves the bearer token against the live
165
- * session rows, so only a token with no unexpired session behind it comes back
166
- * 401. That is the *one* status that means signed out, and the only one that
167
- * may cost someone their local session. The route has no 403 on GET (the one
168
- * 403 it can return belongs to PATCH, for a profile that hasn't been claimed),
169
- * so 403 is not treated as a refusal here.
170
- *
171
- * Everything else is 'unverified' — a 429 from either of the route's rate
172
- * limiters (the per-IP one fires before auth is even looked at), a 5xx, a DNS
173
- * failure on a plane, the 10s timeout. A machine that can't reach the server is
174
- * not a machine whose account is gone, and guessing otherwise would throw away
175
- * a working session over a flaky network.
176
- */
177
- export async function verifySession(session) {
178
- try {
179
- const res = await fetch(`${resolveAppUrl(session)}/api/hackers/me?src=cli`, {
180
- headers: { Authorization: `Bearer ${session.token}` },
181
- signal: AbortSignal.timeout(10_000),
182
- });
183
- if (res.ok)
184
- return 'ok';
185
- return res.status === 401 ? 'unauthorized' : 'unverified';
186
- }
187
- catch {
188
- return 'unverified';
189
- }
190
- }
191
- //# sourceMappingURL=session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAmBzC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAA;AAChE,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAMrD,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,YAAY,CAAA;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB;IAChD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;IAC7B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAEvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAA+C;IAE/C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC7C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,qBAAqB,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAA+C,EAC/C,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC9C,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,IAAI,IAAsB,CAAA;IAC1B,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,IAAe,CAAA;IAC/B,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAA;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,oBAAoB;IAChC,WAAW,EAAE,uBAAuB;CAC5B,CAAA;AAIV,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;AACnD,CAAC;AAED,gFAAgF;AAChF,MAAM,WAAW,GAA+B;IAC9C,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,aAAa;CACzB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,KAAK,CAAE,CAAA;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAiB,CAAA;IAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAG9D,EAAE,CAAC;QACJ,IAAI,OAAO,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;IACzC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAwC;IAExC,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,OAAO,EAAE,MAAM;QACf,oBAAoB,CAAC,UAAU,CAAA;IACjC,0EAA0E;IAC1E,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,4EAA4E;AAC5E,6EAA6E;AAC7E,gFAAgF;AAChF,kCAAkC;AAClC,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACjC,MAAM,QAAQ,GACZ,GAAG,IAAI,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC,CAAC,eAAe,CAAA;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,sCAAsC,UAAU,sBAAsB,MAAM,WAAW,QAAQ,sBAAsB,CAAA;IAC9H,CAAC;IACD,OAAO,uDAAuD,QAAQ,sBAAsB,CAAA;AAC9F,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,aAAa,EAAE,CAAA;AACxB,CAAC;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,aAAa,CAAC,OAAO,CAAC,yBAAyB,EAClD;YACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE,EAAE;YACrD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CACF,CAAA;QACD,IAAI,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACvB,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAA;IACrB,CAAC;AACH,CAAC"}
@@ -1,19 +0,0 @@
1
- export declare const BELT_COLOR_HEX: Record<string, string>;
2
- /** Unknown / missing belt falls back to the white-belt hex (matches the web). */
3
- export declare const DEFAULT_ACCENT_HEX = "#E8E8E8";
4
- export type Accent = {
5
- solid: string;
6
- alpha: (a: number) => string;
7
- };
8
- export declare function hexToRgb(hex: string): {
9
- r: number;
10
- g: number;
11
- b: number;
12
- };
13
- /**
14
- * The accent for a belt/rank colour: the solid hue plus an alpha() helper that
15
- * reuses the original mint opacities (0.1 track, 0.18/0.38/0.62/1 heat tiers) in
16
- * this hue, so only the colour changes, not the relative brightness.
17
- */
18
- export declare function accentShades(beltColor: string): Accent;
19
- //# sourceMappingURL=share-card-colors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"share-card-colors.d.ts","sourceRoot":"","sources":["../src/share-card-colors.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAYjD,CAAA;AAED,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,YAAY,CAAA;AAE3C,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAA;AAEpE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAItD"}
@@ -1,36 +0,0 @@
1
- // Accent palette for the share card. The accent is the user's belt/rank colour
2
- // (same hex values as the web profile's BELT_COLOR_HEX), so the card reads
3
- // identically to hacklab.so/<handle>. Kept separate from share-card.tsx so it's
4
- // testable without loading the satori/resvg renderer.
5
- export const BELT_COLOR_HEX = {
6
- white: '#E8E8E8',
7
- orange: '#FF8C00',
8
- red: '#DC2626',
9
- blue: '#2563EB',
10
- cyan: '#06B6D4',
11
- yellow: '#EAB308',
12
- lime: '#84CC16',
13
- green: '#22C55E',
14
- pink: '#EC4899',
15
- purple: '#A855F7',
16
- black: '#FFFFFF',
17
- };
18
- /** Unknown / missing belt falls back to the white-belt hex (matches the web). */
19
- export const DEFAULT_ACCENT_HEX = '#E8E8E8';
20
- export function hexToRgb(hex) {
21
- const h = hex.replace('#', '');
22
- const full = h.length === 3 ? h.replace(/(.)/g, '$1$1') : h;
23
- const n = Number.parseInt(full, 16);
24
- return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };
25
- }
26
- /**
27
- * The accent for a belt/rank colour: the solid hue plus an alpha() helper that
28
- * reuses the original mint opacities (0.1 track, 0.18/0.38/0.62/1 heat tiers) in
29
- * this hue, so only the colour changes, not the relative brightness.
30
- */
31
- export function accentShades(beltColor) {
32
- const hex = BELT_COLOR_HEX[beltColor] ?? DEFAULT_ACCENT_HEX;
33
- const { r, g, b } = hexToRgb(hex);
34
- return { solid: hex, alpha: (a) => `rgba(${r}, ${g}, ${b}, ${a})` };
35
- }
36
- //# sourceMappingURL=share-card-colors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"share-card-colors.js","sourceRoot":"","sources":["../src/share-card-colors.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2EAA2E;AAC3E,gFAAgF;AAChF,sDAAsD;AAEtD,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;CACjB,CAAA;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAA;AAI3C,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACnC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAA;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAA;IAC3D,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;AACrE,CAAC"}
@@ -1,32 +0,0 @@
1
- export type ShareCardData = {
2
- handle: string;
3
- level: number;
4
- title: string;
5
- beltColor: string;
6
- tokensTotal: number;
7
- /** Absent when the caller has no rank to show — the pill is dropped, not zeroed. */
8
- rank?: number;
9
- streak: number;
10
- longestStreak: number;
11
- progressPercent: number;
12
- estimatedCost: number;
13
- followers?: number;
14
- avatarUrl?: string;
15
- toolBreakdown: {
16
- claudeCode: number;
17
- codex: number;
18
- cursor: number;
19
- };
20
- models: Array<{
21
- name: string;
22
- tokens: number;
23
- }>;
24
- dailyActivity: Array<{
25
- date: string;
26
- tokens: number;
27
- }>;
28
- };
29
- export declare function generateShareCard(data: ShareCardData): Promise<string>;
30
- export declare function displayInTerminal(pngBuffer: Buffer): boolean;
31
- export declare function copyToClipboard(imagePath: string): Promise<boolean>;
32
- //# sourceMappingURL=share-card.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"share-card.d.ts","sourceRoot":"","sources":["../src/share-card.tsx"],"names":[],"mappings":"AAqCA,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACvD,CAAA;AAweD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA4C5E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CA4C5D;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASzE"}