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 +8 -2
- package/dist/bin/jpi-bounties.js +160 -16
- package/dist/bin/jpi-chat-read.js +18 -1
- package/dist/bin/jpi-chat.js +18 -1
- package/dist/bin/jpi-claim.js +1743 -514
- package/dist/bin/jpi-config.js +2 -1
- package/dist/bin/jpi-contribute.js +60 -9
- package/dist/bin/jpi-devs.js +160 -16
- package/dist/bin/jpi-dispatch.js +1160 -213
- package/dist/bin/jpi-inbox.js +18 -1
- package/dist/bin/jpi-intro.js +16 -0
- package/dist/bin/jpi-jobs.js +161 -17
- package/dist/bin/jpi-learn.js +16 -0
- package/dist/bin/jpi-link.js +2 -1
- package/dist/bin/jpi-login.js +162 -17
- package/dist/bin/jpi-mcp.js +6 -1
- package/dist/bin/jpi-profile.js +16 -0
- package/dist/bin/jpi-project.js +160 -16
- package/dist/bin/jpi-refresh.js +609 -130
- package/dist/bin/jpi-save.js +16 -0
- package/dist/bin/jpi-sync.js +16 -0
- package/dist/bin/jpi-trajectory.js +16 -0
- package/dist/bin/peer-connect-prompt.js +2 -1
- package/dist/bin/spinner.js +4 -2
- package/dist/bin/version-nudge.js +46 -4
- package/dist/src/claims.js +12 -0
- package/dist/src/config.js +6 -1
- package/dist/src/intro.js +16 -0
- package/dist/src/link.js +2 -1
- package/dist/src/trajectory.js +16 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# terminalhire —
|
|
1
|
+
# terminalhire — your code is your résumé
|
|
2
2
|
|
|
3
|
-
|
|
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
|
package/dist/bin/jpi-bounties.js
CHANGED
|
@@ -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
|
|
1183
|
-
if (
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
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
|
|
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
|
-
|
|
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
|
});
|
package/dist/bin/jpi-chat.js
CHANGED
|
@@ -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
|
});
|