terminalhire 0.18.1 → 0.19.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # terminalhire — local-first job matching for developers
1
+ # terminalhire — your code is your résumé
2
2
 
3
- Pull curated job matches from a broad public pool. Matching runs entirely on your device. Your profile never leaves your machine.
3
+ Local-first job + bounty matching, and a verifiable **Proof of Work** credential earned from PRs that maintainers who aren't you merged into established repos — checkable on GitHub, impossible to self-report. Matching runs entirely on your device. Your profile never leaves your machine.
4
4
 
5
5
  **Domain:** [terminalhire.com](https://terminalhire.com)
6
6
 
@@ -47,6 +47,7 @@ terminalhire jobs --all # show all matches above zero score
47
47
 
48
48
  terminalhire bounties # day-sized paid tasks you can knock out today
49
49
  terminalhire bounties --priced # only bounties with a known $ amount
50
+ terminalhire contribute # credential-building issues matched to your stack — merges grow your Proof of Work
50
51
 
51
52
  terminalhire claim record <id|issueUrl> # claim a bounty locally + print the executor brief
52
53
  terminalhire claim list --active # list your active claims + accepted-PR rate
@@ -56,6 +57,11 @@ terminalhire trajectory # trajectory from your local Claude Code corpus
56
57
  terminalhire trajectory --export # write a derived score + Markdown to ~/.terminalhire/
57
58
  terminalhire trajectory --inward # also show private rework/recovery (never exported)
58
59
 
60
+ terminalhire devs # opted-in peers & founders, matched 100% locally
61
+ terminalhire intro <login> # request a double-opt-in intro (typed-yes consent)
62
+ terminalhire inbox # unread chats, connections & pending intros in one place
63
+ terminalhire mcp --print-config # read-only MCP server config for VS Code/Cursor/Codex/Zed/JetBrains
64
+
59
65
  terminalhire profile --show # inspect your encrypted local profile (incl. GitHub fields)
60
66
  terminalhire profile --edit # set displayName, contactEmail, prefs
61
67
  terminalhire profile --delete # wipe profile and encryption key from disk
@@ -391,6 +391,11 @@ ${body}`;
391
391
  for (const tok of tokens) {
392
392
  const r = resolveToken(tok);
393
393
  if (!r) continue;
394
+ const synGate = AMBIGUOUS_SYNONYM[tok] ?? AMBIGUOUS_SYNONYM[tok.replace(/^[.\-+#]+|[.\-+#]+$/g, "")];
395
+ if (synGate && r.id === synGate.id) {
396
+ if (synGate.cue.test(text)) ids.add(r.id);
397
+ continue;
398
+ }
394
399
  if (NON_EXTRACTABLE.has(r.id)) continue;
395
400
  if (SYNONYM_ONLY.has(r.id) && !r.viaSynonym) continue;
396
401
  const cue = AMBIGUOUS[r.id];
@@ -408,7 +413,7 @@ ${body}`;
408
413
  function coreTagsFromTitle(title) {
409
414
  return extractSkillTags(title, "").filter((t) => !SOFT_DOMAIN.has(t));
410
415
  }
411
- var SOFT_DOMAIN, SYNONYM_ONLY, NON_EXTRACTABLE, AMBIGUOUS, ENG_INTENT, NON_ENG_TITLE;
416
+ var SOFT_DOMAIN, SYNONYM_ONLY, NON_EXTRACTABLE, AMBIGUOUS, AMBIGUOUS_SYNONYM, ENG_INTENT, NON_ENG_TITLE;
412
417
  var init_extract = __esm({
413
418
  "../../packages/core/src/vocab/extract.ts"() {
414
419
  "use strict";
@@ -445,6 +450,16 @@ var init_extract = __esm({
445
450
  r: /\b(rstudio|tidyverse|ggplot|shiny|dplyr|cran|r-lang|rlang)\b/i,
446
451
  ml: /\b(machine[\s-]?learning|pytorch|tensorflow|scikit|sklearn|keras|neural|model training|deep[\s-]?learning|numpy|pandas|ml\s+(?:engineer|platform|researcher|infrastructure)|(?:ml|ai)\s+research)\b/i
447
452
  };
453
+ AMBIGUOUS_SYNONYM = {
454
+ // "prompt" is the LLM skill only in AI context. In raw JD prose it is "prompt
455
+ // delivery / response / payment / communication / attention". Accept only with
456
+ // the explicit "prompt engineering" phrase OR an LLM/AI ecosystem cue; the cue
457
+ // deliberately excludes the bare word "prompt(s)" itself so it can't self-satisfy.
458
+ prompt: {
459
+ id: "prompt-engineering",
460
+ cue: /\bprompt[\s-]?engineer(?:ing|s)?\b|\b(llms?|gpt-?[0-9o]*|claude|gemini|llama|mistral|openai|anthropic|langchain|llama[\s-]?index|rag|retrieval[\s-]?augmented|embeddings?|fine[\s-]?tun(?:e|ed|ing)|vector[\s-]?(?:db|database|store)|agentic|ai agents?|chatbots?|generative ai|gen[\s-]?ai|genai|few[\s-]?shot|zero[\s-]?shot)\b/i
461
+ }
462
+ };
448
463
  ENG_INTENT = /\b(engineer|engineering|developer|dev\b|swe|sde|programmer|architect|full[\s-]?stack|front[\s-]?end|back[\s-]?end|devops|sre|software|coding|codebase|technical staff|tech(?:nical)? lead)\b/i;
449
464
  NON_ENG_TITLE = /\b(account executive|account manager|sales (?:rep|representative|development|manager|lead)|sdr|bdr|recruiter|recruiting|talent|marketing|administrative|business partner|billing coordinator|operations (?:administrator|coordinator)|customer success|project finance|controller|bookkeeper|graphic|brand)\b/i;
450
465
  }
@@ -1166,9 +1181,26 @@ function harmonicMean(a, b) {
1166
1181
  if (a <= 0 || b <= 0) return 0;
1167
1182
  return 2 * a * b / (a + b);
1168
1183
  }
1184
+ function mergeSoftCoverage(covMap, softTags, cap) {
1185
+ for (const st of softTags) {
1186
+ const w = Math.max(0, Math.min(1, st.weight)) * cap;
1187
+ for (const [tag, hit] of expandWeighted([st.tag])) {
1188
+ const scaled = hit.weight * w;
1189
+ const existing = covMap.get(tag);
1190
+ if (!existing || scaled > existing.weight) {
1191
+ covMap.set(tag, {
1192
+ weight: existing ? Math.max(existing.weight, scaled) : scaled,
1193
+ via: existing?.via ?? st.tag
1194
+ });
1195
+ }
1196
+ }
1197
+ }
1198
+ return covMap;
1199
+ }
1169
1200
  function match(fp, jobs, limit = 5, now = Date.now(), opts = {}) {
1170
1201
  const idfOf = backgroundIdf;
1171
1202
  const expanded = expandWeighted(fp.skillTags);
1203
+ const covMap = opts.softTags && opts.softTags.length > 0 ? mergeSoftCoverage(new Map(expanded), opts.softTags, INTEREST_CAP) : expanded;
1172
1204
  const maxDevScore = fp.skillTags.reduce((acc, t) => acc + idfOf(t), 0);
1173
1205
  const candidates = jobs.filter((j) => passesFilters(fp, j));
1174
1206
  const scored = candidates.map((job) => {
@@ -1179,12 +1211,13 @@ function match(fp, jobs, limit = 5, now = Date.now(), opts = {}) {
1179
1211
  for (const tag of job.tags) {
1180
1212
  const w = idfOf(tag);
1181
1213
  jobMaxScore += w;
1182
- const hit = expanded.get(tag);
1183
- if (hit) {
1184
- const credit = Math.pow(hit.weight, SHARPEN);
1185
- jobMatchScore += w * credit;
1186
- details.push({ tag, weight: hit.weight, via: hit.via });
1187
- if (credit > (devCovByTag.get(hit.via) ?? 0)) devCovByTag.set(hit.via, credit);
1214
+ const covHit = covMap.get(tag);
1215
+ if (covHit) jobMatchScore += w * Math.pow(covHit.weight, SHARPEN);
1216
+ const fpHit = expanded.get(tag);
1217
+ if (fpHit) {
1218
+ const credit = Math.pow(fpHit.weight, SHARPEN);
1219
+ details.push({ tag, weight: fpHit.weight, via: fpHit.via });
1220
+ if (credit > (devCovByTag.get(fpHit.via) ?? 0)) devCovByTag.set(fpHit.via, credit);
1188
1221
  }
1189
1222
  }
1190
1223
  let devScore = 0;
@@ -1222,7 +1255,7 @@ function match(fp, jobs, limit = 5, now = Date.now(), opts = {}) {
1222
1255
  return byScore;
1223
1256
  }).slice(0, limit);
1224
1257
  }
1225
- var MIN_SCORE, TIEBREAK_EPS, SHARPEN, CORE_MISS_PENALTY, SENIORITY_RANK, SENIORITY_PATTERNS, ENG_TITLE, UNKNOWN_RECENCY;
1258
+ var MIN_SCORE, TIEBREAK_EPS, SHARPEN, CORE_MISS_PENALTY, INTEREST_CAP, SENIORITY_RANK, SENIORITY_PATTERNS, ENG_TITLE, UNKNOWN_RECENCY;
1226
1259
  var init_matcher = __esm({
1227
1260
  "../../packages/core/src/matcher.ts"() {
1228
1261
  "use strict";
@@ -1232,6 +1265,7 @@ var init_matcher = __esm({
1232
1265
  TIEBREAK_EPS = 5e-3;
1233
1266
  SHARPEN = 1.6;
1234
1267
  CORE_MISS_PENALTY = 0.4;
1268
+ INTEREST_CAP = 0.6;
1235
1269
  SENIORITY_RANK = {
1236
1270
  junior: 0,
1237
1271
  mid: 1,
@@ -1249,6 +1283,54 @@ var init_matcher = __esm({
1249
1283
  }
1250
1284
  });
1251
1285
 
1286
+ // ../../packages/core/src/rerank.ts
1287
+ function jaccardSim(a, b) {
1288
+ if (a.size === 0 && b.size === 0) return 1;
1289
+ let inter = 0;
1290
+ for (const x of a) if (b.has(x)) inter++;
1291
+ const union = a.size + b.size - inter;
1292
+ return union === 0 ? 1 : inter / union;
1293
+ }
1294
+ function tagDissimilarity(a, b) {
1295
+ return 1 - jaccardSim(new Set(a.job.tags ?? []), new Set(b.job.tags ?? []));
1296
+ }
1297
+ function mmrRerank(results, opts = {}) {
1298
+ const lambda = opts.lambda ?? 0.7;
1299
+ const k = opts.k ?? 8;
1300
+ const simOf = opts.simOf ?? tagDissimilarity;
1301
+ if (results.length < 2 || k < 2) return results.slice();
1302
+ let maxScore = 0;
1303
+ for (const r of results) if (r.score > maxScore) maxScore = r.score;
1304
+ const relNorm = (r) => maxScore > 0 ? r.score / maxScore : 0;
1305
+ const remaining = results.slice();
1306
+ const selected = [];
1307
+ const window = Math.min(k, remaining.length);
1308
+ for (let pos = 0; pos < window; pos++) {
1309
+ let bestIdx = 0;
1310
+ let bestObj = -Infinity;
1311
+ for (let i = 0; i < remaining.length; i++) {
1312
+ const cand = remaining[i];
1313
+ let minDissim = selected.length === 0 ? 0 : Infinity;
1314
+ for (const s of selected) {
1315
+ const d = simOf(cand, s);
1316
+ if (d < minDissim) minDissim = d;
1317
+ }
1318
+ const obj = lambda * relNorm(cand) + (1 - lambda) * minDissim;
1319
+ if (obj > bestObj) {
1320
+ bestObj = obj;
1321
+ bestIdx = i;
1322
+ }
1323
+ }
1324
+ selected.push(remaining.splice(bestIdx, 1)[0]);
1325
+ }
1326
+ return [...selected, ...remaining];
1327
+ }
1328
+ var init_rerank = __esm({
1329
+ "../../packages/core/src/rerank.ts"() {
1330
+ "use strict";
1331
+ }
1332
+ });
1333
+
1252
1334
  // ../../packages/core/src/feeds/http.ts
1253
1335
  function fetchWithTimeout(input, init, timeoutMs = FEED_FETCH_TIMEOUT_MS) {
1254
1336
  return fetch(input, { ...init, signal: AbortSignal.timeout(timeoutMs) });
@@ -2660,6 +2742,55 @@ var init_feeds = __esm({
2660
2742
  }
2661
2743
  });
2662
2744
 
2745
+ // ../../packages/core/src/feeds/contribution-classify.ts
2746
+ function hasStrongCodeSignal(title, body, labels) {
2747
+ if (labels.some((l) => CODE_LABEL_RE.test(l))) return true;
2748
+ const text = `${title}
2749
+ ${body}`;
2750
+ if (CODE_TERM_RE.test(text)) return true;
2751
+ if (CODE_EXCEPTION_RE.test(text)) return true;
2752
+ if (CODE_FENCE_RE.test(body)) return true;
2753
+ if (FILE_PATH_RE.test(text)) return true;
2754
+ return false;
2755
+ }
2756
+ function hasContentSignal(title, body, labels) {
2757
+ if (labels.some((l) => CONTENT_LABEL_RE.test(l))) return true;
2758
+ const text = `${title}
2759
+ ${body}`;
2760
+ if (CONTENT_ADD_RE.test(text)) return true;
2761
+ if (ADD_TO_CORPUS_RE.test(text)) return true;
2762
+ if (TRANSLATE_RE.test(text)) return true;
2763
+ if (TYPO_RE.test(text)) return true;
2764
+ return false;
2765
+ }
2766
+ function classifyContributionKind(input) {
2767
+ const title = input.title ?? "";
2768
+ const body = input.body ?? "";
2769
+ const labels = input.labels ?? [];
2770
+ if (hasStrongCodeSignal(title, body, labels)) return "code";
2771
+ if (hasContentSignal(title, body, labels)) return "content";
2772
+ return "ambiguous";
2773
+ }
2774
+ function looksLikeContentTask(input) {
2775
+ return classifyContributionKind(input) === "content";
2776
+ }
2777
+ var CONTENT_LABEL_RE, CODE_LABEL_RE, CODE_TERM_RE, CODE_EXCEPTION_RE, CODE_FENCE_RE, FILE_PATH_RE, CONTENT_ADD_RE, ADD_TO_CORPUS_RE, TRANSLATE_RE, TYPO_RE;
2778
+ var init_contribution_classify = __esm({
2779
+ "../../packages/core/src/feeds/contribution-classify.ts"() {
2780
+ "use strict";
2781
+ CONTENT_LABEL_RE = /\b(content|copy|copywriting|wording|translation|translations|i18n|l10n|localization|localisation|data|dataset|documentation|docs)\b/i;
2782
+ CODE_LABEL_RE = /\b(bug|bugfix|fix|enhancement|feature|refactor|refactoring|test|tests|testing|performance|perf|security|api|backend|frontend|typescript|javascript|golang|rust|python|build|ci)\b/i;
2783
+ CODE_TERM_RE = /\b(bug|crash|crashes|crashing|exception|stack\s?trace|stacktrace|null\s?pointer|npe|segfault|refactor|implement|endpoint|api|component|function|method|class|module|compile|compiler|build\s+(?:error|fail)|runtime|regression|unit\s+test|integration\s+test|test\s+coverage|typecheck|lint|dependency|dependencies|import|async|await|race\s+condition|memory\s+leak|deadlock|parser|serialize|deserialize|schema|migration|websocket|http|json|sql|cli|sdk)\b/i;
2784
+ CODE_EXCEPTION_RE = /exception|stacktrace|segfault|traceback/i;
2785
+ CODE_FENCE_RE = /```|(?:^|\n)\s{4,}\S/;
2786
+ FILE_PATH_RE = /\b[\w./-]+\.(?:ts|tsx|js|jsx|mjs|cjs|py|rb|go|rs|java|kt|scala|c|cc|cpp|cxx|h|hpp|cs|php|swift|m|mm|sh|bash|zsh|sql|graphql|proto|css|scss|sass|less|vue|svelte|toml|ini|gradle|dockerfile)\b/i;
2787
+ CONTENT_ADD_RE = /\badd(?:ing|s)?\s+(?:\w+\s+){0,4}?(?:proverbs?|words?|phrases?|sayings?|quotes?|quotations?|translations?|entry|entries|definitions?|terms?|idioms?|synonyms?|antonyms?|acronyms?|abbreviations?)\b/i;
2788
+ ADD_TO_CORPUS_RE = /\badd\b[\s\S]*?\bto\s+(?:the\s+)?(?:word\s?list|dictionary|glossary|phrasebook)\b/i;
2789
+ TRANSLATE_RE = /\b(?:translate|translating|translation|localize|localise|localization|localisation)\b/i;
2790
+ TYPO_RE = /\bfix(?:ing)?\s+(?:a\s+|the\s+|some\s+)?typos?\b/i;
2791
+ }
2792
+ });
2793
+
2663
2794
  // ../../packages/core/src/feeds/contributions.ts
2664
2795
  function authHeaders2() {
2665
2796
  const token = process.env["GITHUB_TOKEN"] ?? process.env["GH_TOKEN"];
@@ -2716,11 +2847,11 @@ async function contributorCount(client, fullName) {
2716
2847
  }
2717
2848
  }
2718
2849
  async function openPRIssueRefs(client, fullName) {
2719
- const refs = /* @__PURE__ */ new Set();
2720
2850
  const prs = await client.json(
2721
2851
  `/repos/${fullName}/pulls?state=open&per_page=100`
2722
2852
  );
2723
- if (!Array.isArray(prs)) return refs;
2853
+ if (!Array.isArray(prs)) return null;
2854
+ const refs = /* @__PURE__ */ new Set();
2724
2855
  for (const pr of prs) {
2725
2856
  for (const m of `${pr.title ?? ""}
2726
2857
  ${pr.body ?? ""}`.matchAll(/#(\d+)\b/g)) {
@@ -2765,8 +2896,7 @@ async function aggregateContributions(opts = {}) {
2765
2896
  return n;
2766
2897
  }
2767
2898
  async function repoPRRefs(fullName) {
2768
- const hit = prRefsCache.get(fullName);
2769
- if (hit !== void 0) return hit;
2899
+ if (prRefsCache.has(fullName)) return prRefsCache.get(fullName) ?? null;
2770
2900
  const refs = await openPRIssueRefs(client, fullName);
2771
2901
  prRefsCache.set(fullName, refs);
2772
2902
  return refs;
@@ -2798,10 +2928,12 @@ async function aggregateContributions(opts = {}) {
2798
2928
  continue;
2799
2929
  }
2800
2930
  if (repo.disabled) continue;
2801
- const prRefs = await repoPRRefs(fullName);
2802
- if (prRefs.has(issue.number)) continue;
2803
2931
  const body = issue.body ? decodeEntities(issue.body) : "";
2804
2932
  const labels = labelNames2(issue.labels);
2933
+ if (looksLikeContentTask({ title, body, labels })) continue;
2934
+ const prRefs = await repoPRRefs(fullName);
2935
+ if (prRefs && prRefs.has(issue.number)) continue;
2936
+ const openPRsAtDiscovery = prRefs ? 0 : void 0;
2805
2937
  const tags = normalize(
2806
2938
  tokenize4([title, repo.language ?? "", labels.join(" "), body.slice(0, 2e3)].join(" "))
2807
2939
  );
@@ -2827,7 +2959,14 @@ async function aggregateContributions(opts = {}) {
2827
2959
  issueNumber: issue.number,
2828
2960
  labels,
2829
2961
  issueUrl: issue.html_url,
2830
- issueBody: body.slice(0, 1e3) || void 0
2962
+ issueBody: body.slice(0, 1e3) || void 0,
2963
+ // Provably 0 open PRs at discovery ONLY when the open-PR check actually
2964
+ // ran and returned a verified-empty/non-matching set (`openPRsAtDiscovery
2965
+ // === 0`). When the check FAILED (rate-limit/error → `prRefs === null`)
2966
+ // this is `undefined`, NOT a fabricated 0 — the claim path then falls
2967
+ // through to a live re-count / honest "unknown" (jpi-claim.js:242-260)
2968
+ // instead of persisting an unverified "0 open PRs" as fact.
2969
+ openPRsAtDiscovery
2831
2970
  },
2832
2971
  raw: issue
2833
2972
  });
@@ -2842,6 +2981,7 @@ var init_contributions = __esm({
2842
2981
  init_entities();
2843
2982
  init_bounty_gate();
2844
2983
  init_contribution_gate();
2984
+ init_contribution_classify();
2845
2985
  init_github_bounties();
2846
2986
  init_http();
2847
2987
  GITHUB_API2 = "https://api.github.com";
@@ -6179,7 +6319,7 @@ function funnelCounts(map) {
6179
6319
  for (const key of Object.keys(map)) {
6180
6320
  const rec = map[key];
6181
6321
  if (rec.clicked === true) counts.clicked++;
6182
- if (rec.status) counts[rec.status]++;
6322
+ if (rec.status && Object.prototype.hasOwnProperty.call(counts, rec.status)) counts[rec.status]++;
6183
6323
  }
6184
6324
  return counts;
6185
6325
  }
@@ -6496,6 +6636,7 @@ __export(src_exports, {
6496
6636
  GRAPH: () => GRAPH,
6497
6637
  GREENHOUSE_SLUGS_BY_TIER: () => GREENHOUSE_SLUGS_BY_TIER,
6498
6638
  IDF_BACKGROUND: () => IDF_BACKGROUND,
6639
+ INTEREST_CAP: () => INTEREST_CAP,
6499
6640
  INTRO_ACCEPTED_TTL_MS: () => INTRO_ACCEPTED_TTL_MS,
6500
6641
  INTRO_ALLOWED_FIELDS: () => INTRO_ALLOWED_FIELDS,
6501
6642
  INTRO_PENDING_TTL_MS: () => INTRO_PENDING_TTL_MS,
@@ -6565,6 +6706,7 @@ __export(src_exports, {
6565
6706
  loadPartnerRoles: () => loadPartnerRoles,
6566
6707
  looksLikeEngRole: () => looksLikeEngRole,
6567
6708
  match: () => match,
6709
+ mmrRerank: () => mmrRerank,
6568
6710
  normalize: () => normalize,
6569
6711
  opire: () => opire,
6570
6712
  opportunityShortToken: () => opportunityShortToken,
@@ -6580,6 +6722,7 @@ __export(src_exports, {
6580
6722
  sameLogin: () => sameLogin,
6581
6723
  setStatus: () => setStatus,
6582
6724
  signalLabel: () => signalLabel,
6725
+ tagDissimilarity: () => tagDissimilarity,
6583
6726
  tokenize: () => tokenize,
6584
6727
  validateGraph: () => validateGraph,
6585
6728
  validateIntroPayload: () => validateIntroPayload,
@@ -6593,6 +6736,7 @@ var init_src = __esm({
6593
6736
  init_types();
6594
6737
  init_vocabulary();
6595
6738
  init_matcher();
6739
+ init_rerank();
6596
6740
  init_feeds();
6597
6741
  init_indexer();
6598
6742
  init_partners();
@@ -482,6 +482,13 @@ var init_matcher = __esm({
482
482
  }
483
483
  });
484
484
 
485
+ // ../../packages/core/src/rerank.ts
486
+ var init_rerank = __esm({
487
+ "../../packages/core/src/rerank.ts"() {
488
+ "use strict";
489
+ }
490
+ });
491
+
485
492
  // ../../packages/core/src/feeds/http.ts
486
493
  var init_http = __esm({
487
494
  "../../packages/core/src/feeds/http.ts"() {
@@ -736,6 +743,13 @@ var init_feeds = __esm({
736
743
  }
737
744
  });
738
745
 
746
+ // ../../packages/core/src/feeds/contribution-classify.ts
747
+ var init_contribution_classify = __esm({
748
+ "../../packages/core/src/feeds/contribution-classify.ts"() {
749
+ "use strict";
750
+ }
751
+ });
752
+
739
753
  // ../../packages/core/src/feeds/contributions.ts
740
754
  var init_contributions = __esm({
741
755
  "../../packages/core/src/feeds/contributions.ts"() {
@@ -744,6 +758,7 @@ var init_contributions = __esm({
744
758
  init_entities();
745
759
  init_bounty_gate();
746
760
  init_contribution_gate();
761
+ init_contribution_classify();
747
762
  init_github_bounties();
748
763
  init_http();
749
764
  }
@@ -3912,6 +3927,7 @@ var init_src = __esm({
3912
3927
  init_types();
3913
3928
  init_vocabulary();
3914
3929
  init_matcher();
3930
+ init_rerank();
3915
3931
  init_feeds();
3916
3932
  init_indexer();
3917
3933
  init_partners();
@@ -4389,7 +4405,8 @@ var init_config = __esm({
4389
4405
  inboundNudgeMuted: false,
4390
4406
  inboundNudgeDisclosed: false,
4391
4407
  contributeEnabled: false,
4392
- contributePrompted: false
4408
+ contributePrompted: false,
4409
+ betaOptIn: false
4393
4410
  };
4394
4411
  }
4395
4412
  });
@@ -499,6 +499,13 @@ var init_matcher = __esm({
499
499
  }
500
500
  });
501
501
 
502
+ // ../../packages/core/src/rerank.ts
503
+ var init_rerank = __esm({
504
+ "../../packages/core/src/rerank.ts"() {
505
+ "use strict";
506
+ }
507
+ });
508
+
502
509
  // ../../packages/core/src/feeds/http.ts
503
510
  var init_http = __esm({
504
511
  "../../packages/core/src/feeds/http.ts"() {
@@ -753,6 +760,13 @@ var init_feeds = __esm({
753
760
  }
754
761
  });
755
762
 
763
+ // ../../packages/core/src/feeds/contribution-classify.ts
764
+ var init_contribution_classify = __esm({
765
+ "../../packages/core/src/feeds/contribution-classify.ts"() {
766
+ "use strict";
767
+ }
768
+ });
769
+
756
770
  // ../../packages/core/src/feeds/contributions.ts
757
771
  var init_contributions = __esm({
758
772
  "../../packages/core/src/feeds/contributions.ts"() {
@@ -761,6 +775,7 @@ var init_contributions = __esm({
761
775
  init_entities();
762
776
  init_bounty_gate();
763
777
  init_contribution_gate();
778
+ init_contribution_classify();
764
779
  init_github_bounties();
765
780
  init_http();
766
781
  }
@@ -3940,6 +3955,7 @@ var init_src = __esm({
3940
3955
  init_types();
3941
3956
  init_vocabulary();
3942
3957
  init_matcher();
3958
+ init_rerank();
3943
3959
  init_feeds();
3944
3960
  init_indexer();
3945
3961
  init_partners();
@@ -4417,7 +4433,8 @@ var init_config = __esm({
4417
4433
  inboundNudgeMuted: false,
4418
4434
  inboundNudgeDisclosed: false,
4419
4435
  contributeEnabled: false,
4420
- contributePrompted: false
4436
+ contributePrompted: false,
4437
+ betaOptIn: false
4421
4438
  };
4422
4439
  }
4423
4440
  });