terminalhire 0.2.3 → 0.2.4

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.
@@ -533,16 +533,102 @@ var init_ashby = __esm({
533
533
  }
534
534
  });
535
535
 
536
- // ../../packages/core/src/feeds/himalayas.ts
536
+ // ../../packages/core/src/feeds/lever.ts
537
537
  function tokenize3(text) {
538
538
  return text.toLowerCase().replace(/[^a-z0-9.\-+#]/g, " ").split(/\s+/).filter(Boolean);
539
539
  }
540
- function extractTags3(job) {
540
+ function extractTags3(p) {
541
+ const cat = p.categories ?? {};
542
+ const texts = [
543
+ p.text,
544
+ cat.team ?? "",
545
+ cat.department ?? "",
546
+ cat.location ?? "",
547
+ ...cat.allLocations ?? [],
548
+ p.descriptionPlain ?? ""
549
+ ];
550
+ return normalize(texts.flatMap(tokenize3));
551
+ }
552
+ function mapCommitment(raw) {
553
+ if (!raw) return "full_time";
554
+ const lower = raw.toLowerCase();
555
+ if (lower.includes("contract") || lower.includes("contractor")) return "contract";
556
+ if (lower.includes("freelance")) return "freelance";
557
+ return "full_time";
558
+ }
559
+ function inferRemote3(p) {
560
+ if ((p.workplaceType ?? "").toLowerCase() === "remote") return true;
561
+ const cat = p.categories ?? {};
562
+ const haystack = [cat.location ?? "", ...cat.allLocations ?? []].join(" ").toLowerCase();
563
+ return haystack.includes("remote") || haystack.includes("anywhere");
564
+ }
565
+ function toIso(ms) {
566
+ if (typeof ms !== "number" || !Number.isFinite(ms)) return void 0;
567
+ try {
568
+ return new Date(ms).toISOString();
569
+ } catch {
570
+ return void 0;
571
+ }
572
+ }
573
+ async function fetchSlug3(slug) {
574
+ const url = `https://api.lever.co/v0/postings/${slug}?mode=json`;
575
+ const res = await fetch(url, { headers: { Accept: "application/json" } });
576
+ if (!res.ok) {
577
+ throw new Error(`Lever ${slug}: HTTP ${res.status}`);
578
+ }
579
+ const data = await res.json();
580
+ const postings = Array.isArray(data) ? data : [];
581
+ if (postings.length === 0) {
582
+ console.warn(`[lever] ${slug}: 0 jobs returned (board may be private or slug invalid)`);
583
+ } else {
584
+ console.info(`[lever] ${slug}: ${postings.length} jobs`);
585
+ }
586
+ return postings.filter((p) => p && p.id && p.text).map((p) => ({
587
+ id: `lever:${p.id}`,
588
+ source: "lever",
589
+ title: p.text,
590
+ company: slug,
591
+ url: p.hostedUrl ?? p.applyUrl ?? `https://jobs.lever.co/${slug}/${p.id}`,
592
+ remote: inferRemote3(p),
593
+ location: p.categories?.location,
594
+ tags: extractTags3(p),
595
+ roleType: mapCommitment(p.categories?.commitment),
596
+ postedAt: toIso(p.createdAt),
597
+ applyMode: "direct",
598
+ raw: p
599
+ }));
600
+ }
601
+ var lever;
602
+ var init_lever = __esm({
603
+ "../../packages/core/src/feeds/lever.ts"() {
604
+ "use strict";
605
+ init_vocabulary();
606
+ lever = {
607
+ source: "lever",
608
+ async fetch(opts) {
609
+ const slugs = opts?.slugs ?? [];
610
+ const results = await Promise.allSettled(slugs.map(fetchSlug3));
611
+ const jobs = [];
612
+ for (const r of results) {
613
+ if (r.status === "fulfilled") jobs.push(...r.value);
614
+ else console.warn("[lever] slug fetch rejected:", r.reason);
615
+ }
616
+ return jobs;
617
+ }
618
+ };
619
+ }
620
+ });
621
+
622
+ // ../../packages/core/src/feeds/himalayas.ts
623
+ function tokenize4(text) {
624
+ return text.toLowerCase().replace(/[^a-z0-9.\-+#]/g, " ").split(/\s+/).filter(Boolean);
625
+ }
626
+ function extractTags4(job) {
541
627
  const texts = [
542
628
  job.title,
543
629
  ...job.tags ?? []
544
630
  ];
545
- return normalize(texts.flatMap(tokenize3));
631
+ return normalize(texts.flatMap(tokenize4));
546
632
  }
547
633
  function mapJobType(raw) {
548
634
  if (!raw) return "full_time";
@@ -588,7 +674,7 @@ var init_himalayas = __esm({
588
674
  location: (j.locationRestrictions ?? []).join(", ") || "Remote",
589
675
  compMin: j.salaryMin,
590
676
  compMax: j.salaryMax,
591
- tags: extractTags3(j),
677
+ tags: extractTags4(j),
592
678
  roleType: mapJobType(j.jobType),
593
679
  postedAt: j.pubDate ?? j.createdAt,
594
680
  applyMode: "direct",
@@ -600,7 +686,7 @@ var init_himalayas = __esm({
600
686
  });
601
687
 
602
688
  // ../../packages/core/src/feeds/wwr.ts
603
- function tokenize4(text) {
689
+ function tokenize5(text) {
604
690
  return text.toLowerCase().replace(/[^a-z0-9.\-+#]/g, " ").split(/\s+/).filter(Boolean);
605
691
  }
606
692
  function stripHtml(html) {
@@ -642,9 +728,9 @@ function parseRss(xml) {
642
728
  }
643
729
  return items;
644
730
  }
645
- function extractTags4(item) {
731
+ function extractTags5(item) {
646
732
  const text = [item.title, item.category, stripHtml(item.description)].join(" ");
647
- return normalize(tokenize4(text));
733
+ return normalize(tokenize5(text));
648
734
  }
649
735
  var WWR_RSS_URL, wwr;
650
736
  var init_wwr = __esm({
@@ -673,7 +759,7 @@ var init_wwr = __esm({
673
759
  // WWR is a remote-only board
674
760
  remote: true,
675
761
  location: "Remote",
676
- tags: extractTags4(item),
762
+ tags: extractTags5(item),
677
763
  roleType: inferRoleType(item.category),
678
764
  postedAt: item.pubDate ? new Date(item.pubDate).toISOString() : void 0,
679
765
  applyMode: "direct",
@@ -685,7 +771,7 @@ var init_wwr = __esm({
685
771
  });
686
772
 
687
773
  // ../../packages/core/src/feeds/hn.ts
688
- function tokenize5(text) {
774
+ function tokenize6(text) {
689
775
  return text.toLowerCase().replace(/[^a-z0-9.\-+#]/g, " ").split(/\s+/).filter(Boolean);
690
776
  }
691
777
  function stripHtml2(html) {
@@ -695,7 +781,7 @@ function extractUrl(text) {
695
781
  const match2 = text.match(/https?:\/\/[^\s<>"']+/);
696
782
  return match2?.[0] ?? "";
697
783
  }
698
- function inferRemote3(text) {
784
+ function inferRemote4(text) {
699
785
  const lower = text.toLowerCase();
700
786
  return lower.includes("remote") || lower.includes("anywhere") || lower.includes("distributed");
701
787
  }
@@ -718,7 +804,7 @@ function parseComment(item) {
718
804
  return null;
719
805
  }
720
806
  const url = extractUrl(raw) || `https://news.ycombinator.com/item?id=${item.id}`;
721
- const tags = extractTags5(raw);
807
+ const tags = extractTags6(raw);
722
808
  if (tags.length === 0) return null;
723
809
  return {
724
810
  id: `hn:${item.id}`,
@@ -726,7 +812,7 @@ function parseComment(item) {
726
812
  title: title.slice(0, 120),
727
813
  company: company.slice(0, 80),
728
814
  url,
729
- remote: inferRemote3(raw),
815
+ remote: inferRemote4(raw),
730
816
  location: location || void 0,
731
817
  tags,
732
818
  roleType: inferRoleType2(raw),
@@ -735,8 +821,8 @@ function parseComment(item) {
735
821
  raw: item
736
822
  };
737
823
  }
738
- function extractTags5(text) {
739
- return normalize(tokenize5(text));
824
+ function extractTags6(text) {
825
+ return normalize(tokenize6(text));
740
826
  }
741
827
  var ALGOLIA_SEARCH, ALGOLIA_ITEMS, hn;
742
828
  var init_hn = __esm({
@@ -780,20 +866,25 @@ var init_hn = __esm({
780
866
  });
781
867
 
782
868
  // ../../packages/core/src/feeds/index.ts
869
+ function flattenTiers(t) {
870
+ return [.../* @__PURE__ */ new Set([...t.bigco, ...t.scaleup, ...t.startup])];
871
+ }
783
872
  async function aggregate(opts) {
784
873
  const ghSlugs = opts?.slugs?.["greenhouse"] ?? DEFAULT_GREENHOUSE_SLUGS;
785
874
  const ashbySlugs = opts?.slugs?.["ashby"] ?? DEFAULT_ASHBY_SLUGS;
875
+ const leverSlugs = opts?.slugs?.["lever"] ?? DEFAULT_LEVER_SLUGS;
786
876
  const limit = opts?.limit ?? 150;
787
877
  const settled = await Promise.allSettled([
788
878
  greenhouse.fetch({ slugs: ghSlugs, limit }),
789
879
  ashby.fetch({ slugs: ashbySlugs, limit }),
880
+ lever.fetch({ slugs: leverSlugs, limit }),
790
881
  himalayas.fetch({ limit }),
791
882
  wwr.fetch({ limit }),
792
883
  hn.fetch({ limit })
793
884
  ]);
794
885
  const seen = /* @__PURE__ */ new Set();
795
886
  const jobs = [];
796
- const sourceNames = ["greenhouse", "ashby", "himalayas", "wwr", "hn"];
887
+ const sourceNames = ["greenhouse", "ashby", "lever", "himalayas", "wwr", "hn"];
797
888
  for (let i = 0; i < settled.length; i++) {
798
889
  const result = settled[i];
799
890
  if (result.status === "rejected") {
@@ -809,46 +900,122 @@ async function aggregate(opts) {
809
900
  }
810
901
  return jobs;
811
902
  }
812
- var FEEDS, DEFAULT_GREENHOUSE_SLUGS, DEFAULT_ASHBY_SLUGS;
903
+ var FEEDS, GREENHOUSE_SLUGS_BY_TIER, ASHBY_SLUGS_BY_TIER, LEVER_SLUGS_BY_TIER, DEFAULT_GREENHOUSE_SLUGS, DEFAULT_ASHBY_SLUGS, DEFAULT_LEVER_SLUGS;
813
904
  var init_feeds = __esm({
814
905
  "../../packages/core/src/feeds/index.ts"() {
815
906
  "use strict";
816
907
  init_greenhouse();
817
908
  init_ashby();
909
+ init_lever();
818
910
  init_himalayas();
819
911
  init_wwr();
820
912
  init_hn();
821
- FEEDS = [greenhouse, ashby, himalayas, wwr, hn];
822
- DEFAULT_GREENHOUSE_SLUGS = [
823
- "stripe",
824
- "linear",
825
- "vercel",
826
- "ramp",
827
- "notion",
828
- "airbnb",
829
- "anthropic",
830
- "figma",
831
- "discord",
832
- "brex",
833
- "mercury",
834
- "retool",
835
- "vanta",
836
- "plaid",
837
- "gusto",
838
- "scale",
839
- "databricks",
840
- "coinbase",
841
- "robinhood",
842
- "doordash"
843
- ];
844
- DEFAULT_ASHBY_SLUGS = [
845
- "ramp",
846
- "notion",
847
- "linear",
848
- "vercel",
849
- "replit",
850
- "posthog"
851
- ];
913
+ FEEDS = [greenhouse, ashby, lever, himalayas, wwr, hn];
914
+ GREENHOUSE_SLUGS_BY_TIER = {
915
+ bigco: [
916
+ "stripe",
917
+ "anthropic",
918
+ "figma",
919
+ "discord",
920
+ "brex",
921
+ "mercury",
922
+ "plaid",
923
+ "gusto",
924
+ "scale",
925
+ "databricks",
926
+ "coinbase",
927
+ "robinhood",
928
+ "doordash",
929
+ "airbnb",
930
+ "dropbox",
931
+ "datadog",
932
+ "cloudflare",
933
+ "reddit",
934
+ "lyft",
935
+ "instacart"
936
+ ],
937
+ scaleup: [
938
+ "samsara",
939
+ "verkada",
940
+ "affirm",
941
+ "gitlab",
942
+ "asana",
943
+ "flexport",
944
+ "faire",
945
+ "twitch",
946
+ "airtable",
947
+ "retool"
948
+ ],
949
+ startup: [
950
+ "watershed"
951
+ ]
952
+ };
953
+ ASHBY_SLUGS_BY_TIER = {
954
+ bigco: [
955
+ "openai"
956
+ ],
957
+ scaleup: [
958
+ "harvey",
959
+ "elevenlabs",
960
+ "notion",
961
+ "sierra",
962
+ "cohere",
963
+ "ramp",
964
+ "vanta",
965
+ "decagon",
966
+ "cursor",
967
+ "replit",
968
+ "perplexity",
969
+ "baseten",
970
+ "drata",
971
+ "writer",
972
+ "temporal",
973
+ "supabase"
974
+ ],
975
+ startup: [
976
+ "suno",
977
+ "attio",
978
+ "modal",
979
+ "workos",
980
+ "linear",
981
+ "render",
982
+ "warp",
983
+ "plain",
984
+ "posthog",
985
+ "pylon",
986
+ "resend",
987
+ "langfuse",
988
+ "railway",
989
+ "mintlify",
990
+ "neon",
991
+ "browserbase",
992
+ "knock",
993
+ "speakeasy",
994
+ "stytch",
995
+ "runway",
996
+ "doppler",
997
+ "inngest",
998
+ "hightouch",
999
+ "zed"
1000
+ ]
1001
+ };
1002
+ LEVER_SLUGS_BY_TIER = {
1003
+ bigco: [
1004
+ "palantir",
1005
+ "spotify"
1006
+ ],
1007
+ scaleup: [
1008
+ "mistral",
1009
+ "ro",
1010
+ "secureframe"
1011
+ ],
1012
+ startup: [
1013
+ "anyscale"
1014
+ ]
1015
+ };
1016
+ DEFAULT_GREENHOUSE_SLUGS = flattenTiers(GREENHOUSE_SLUGS_BY_TIER);
1017
+ DEFAULT_ASHBY_SLUGS = flattenTiers(ASHBY_SLUGS_BY_TIER);
1018
+ DEFAULT_LEVER_SLUGS = flattenTiers(LEVER_SLUGS_BY_TIER);
852
1019
  }
853
1020
  });
854
1021
 
@@ -1035,10 +1202,14 @@ var init_github = __esm({
1035
1202
  // ../../packages/core/src/index.ts
1036
1203
  var src_exports = {};
1037
1204
  __export(src_exports, {
1205
+ ASHBY_SLUGS_BY_TIER: () => ASHBY_SLUGS_BY_TIER,
1038
1206
  COASTAL_BUYER: () => COASTAL_BUYER,
1039
1207
  DEFAULT_ASHBY_SLUGS: () => DEFAULT_ASHBY_SLUGS,
1040
1208
  DEFAULT_GREENHOUSE_SLUGS: () => DEFAULT_GREENHOUSE_SLUGS,
1209
+ DEFAULT_LEVER_SLUGS: () => DEFAULT_LEVER_SLUGS,
1041
1210
  FEEDS: () => FEEDS,
1211
+ GREENHOUSE_SLUGS_BY_TIER: () => GREENHOUSE_SLUGS_BY_TIER,
1212
+ LEVER_SLUGS_BY_TIER: () => LEVER_SLUGS_BY_TIER,
1042
1213
  SYNONYMS: () => SYNONYMS,
1043
1214
  VOCABULARY: () => VOCABULARY,
1044
1215
  aggregate: () => aggregate,
@@ -1046,10 +1217,12 @@ __export(src_exports, {
1046
1217
  buildIndex: () => buildIndex,
1047
1218
  buildReason: () => buildReason,
1048
1219
  fetchGitHubProfile: () => fetchGitHubProfile,
1220
+ flattenTiers: () => flattenTiers,
1049
1221
  githubToFingerprint: () => githubToFingerprint,
1050
1222
  greenhouse: () => greenhouse,
1051
1223
  himalayas: () => himalayas,
1052
1224
  hn: () => hn,
1225
+ lever: () => lever,
1053
1226
  loadCoastalRoles: () => loadCoastalRoles,
1054
1227
  match: () => match,
1055
1228
  matchOne: () => matchOne,
@@ -257,6 +257,14 @@ var init_ashby = __esm({
257
257
  }
258
258
  });
259
259
 
260
+ // ../../packages/core/src/feeds/lever.ts
261
+ var init_lever = __esm({
262
+ "../../packages/core/src/feeds/lever.ts"() {
263
+ "use strict";
264
+ init_vocabulary();
265
+ }
266
+ });
267
+
260
268
  // ../../packages/core/src/feeds/himalayas.ts
261
269
  var init_himalayas = __esm({
262
270
  "../../packages/core/src/feeds/himalayas.ts"() {
@@ -282,14 +290,124 @@ var init_hn = __esm({
282
290
  });
283
291
 
284
292
  // ../../packages/core/src/feeds/index.ts
293
+ function flattenTiers(t) {
294
+ return [.../* @__PURE__ */ new Set([...t.bigco, ...t.scaleup, ...t.startup])];
295
+ }
296
+ var GREENHOUSE_SLUGS_BY_TIER, ASHBY_SLUGS_BY_TIER, LEVER_SLUGS_BY_TIER, DEFAULT_GREENHOUSE_SLUGS, DEFAULT_ASHBY_SLUGS, DEFAULT_LEVER_SLUGS;
285
297
  var init_feeds = __esm({
286
298
  "../../packages/core/src/feeds/index.ts"() {
287
299
  "use strict";
288
300
  init_greenhouse();
289
301
  init_ashby();
302
+ init_lever();
290
303
  init_himalayas();
291
304
  init_wwr();
292
305
  init_hn();
306
+ GREENHOUSE_SLUGS_BY_TIER = {
307
+ bigco: [
308
+ "stripe",
309
+ "anthropic",
310
+ "figma",
311
+ "discord",
312
+ "brex",
313
+ "mercury",
314
+ "plaid",
315
+ "gusto",
316
+ "scale",
317
+ "databricks",
318
+ "coinbase",
319
+ "robinhood",
320
+ "doordash",
321
+ "airbnb",
322
+ "dropbox",
323
+ "datadog",
324
+ "cloudflare",
325
+ "reddit",
326
+ "lyft",
327
+ "instacart"
328
+ ],
329
+ scaleup: [
330
+ "samsara",
331
+ "verkada",
332
+ "affirm",
333
+ "gitlab",
334
+ "asana",
335
+ "flexport",
336
+ "faire",
337
+ "twitch",
338
+ "airtable",
339
+ "retool"
340
+ ],
341
+ startup: [
342
+ "watershed"
343
+ ]
344
+ };
345
+ ASHBY_SLUGS_BY_TIER = {
346
+ bigco: [
347
+ "openai"
348
+ ],
349
+ scaleup: [
350
+ "harvey",
351
+ "elevenlabs",
352
+ "notion",
353
+ "sierra",
354
+ "cohere",
355
+ "ramp",
356
+ "vanta",
357
+ "decagon",
358
+ "cursor",
359
+ "replit",
360
+ "perplexity",
361
+ "baseten",
362
+ "drata",
363
+ "writer",
364
+ "temporal",
365
+ "supabase"
366
+ ],
367
+ startup: [
368
+ "suno",
369
+ "attio",
370
+ "modal",
371
+ "workos",
372
+ "linear",
373
+ "render",
374
+ "warp",
375
+ "plain",
376
+ "posthog",
377
+ "pylon",
378
+ "resend",
379
+ "langfuse",
380
+ "railway",
381
+ "mintlify",
382
+ "neon",
383
+ "browserbase",
384
+ "knock",
385
+ "speakeasy",
386
+ "stytch",
387
+ "runway",
388
+ "doppler",
389
+ "inngest",
390
+ "hightouch",
391
+ "zed"
392
+ ]
393
+ };
394
+ LEVER_SLUGS_BY_TIER = {
395
+ bigco: [
396
+ "palantir",
397
+ "spotify"
398
+ ],
399
+ scaleup: [
400
+ "mistral",
401
+ "ro",
402
+ "secureframe"
403
+ ],
404
+ startup: [
405
+ "anyscale"
406
+ ]
407
+ };
408
+ DEFAULT_GREENHOUSE_SLUGS = flattenTiers(GREENHOUSE_SLUGS_BY_TIER);
409
+ DEFAULT_ASHBY_SLUGS = flattenTiers(ASHBY_SLUGS_BY_TIER);
410
+ DEFAULT_LEVER_SLUGS = flattenTiers(LEVER_SLUGS_BY_TIER);
293
411
  }
294
412
  });
295
413