terminalhire 0.42.31 → 0.42.32

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.
@@ -304,7 +304,7 @@ function removeClaimIfStakeMatches(id, expectedStakePostedAt) {
304
304
  function countAwaitingFounderApproval(claims = readClaims()) {
305
305
  try {
306
306
  return claims.filter(
307
- (c) => c.approval?.mode === "approval-only" && c.approval?.state === "pending"
307
+ (c) => !TERMINAL_STATES.has(c.state) && c.approval?.mode === "approval-only" && c.approval?.state === "pending"
308
308
  ).length;
309
309
  } catch {
310
310
  return 0;
@@ -313,8 +313,17 @@ function countAwaitingFounderApproval(claims = readClaims()) {
313
313
  function acceptedPRRate(claims = readClaims()) {
314
314
  const total = claims.length;
315
315
  const merged = claims.filter((c) => c.state === "merged").length;
316
- const decided = claims.filter((c) => DECIDED_STATES.has(c.state)).length;
317
- return { merged, decided, inFlight: total - decided, total, rate: decided === 0 ? 0 : merged / decided };
316
+ const released = claims.filter(
317
+ (c) => c.state === "abandoned" && c.serverReleased === true && !c.posterVerdict
318
+ ).length;
319
+ const decided = claims.filter((c) => DECIDED_STATES.has(c.state)).length - released;
320
+ return {
321
+ merged,
322
+ decided,
323
+ inFlight: total - decided - released,
324
+ total,
325
+ rate: decided === 0 ? 0 : merged / decided
326
+ };
318
327
  }
319
328
  function formatAcceptedPRRate(rate) {
320
329
  const inFlight = rate.inFlight > 0 ? ` \xB7 ${rate.inFlight} in flight` : "";
@@ -113,25 +113,33 @@ async function fetchFounderVerdicts(pushToken, fetchImpl = fetch) {
113
113
  const verdicts = body.verdicts.filter(
114
114
  (v) => v && typeof v.claimId === "string" && v.claimId !== "" && (v.verdict === "accepted" || v.verdict === "rejected")
115
115
  );
116
- return { verdicts, latestAt: typeof body.latestAt === "string" ? body.latestAt : null };
116
+ const releases = (Array.isArray(body.releases) ? body.releases : []).filter(
117
+ (r) => r && typeof r.claimId === "string" && r.claimId !== "" && typeof r.at === "string" && Number.isFinite(Date.parse(r.at))
118
+ );
119
+ return {
120
+ verdicts,
121
+ latestAt: typeof body.latestAt === "string" ? body.latestAt : null,
122
+ ...releases.length ? { releases } : {}
123
+ };
117
124
  } catch {
118
125
  return null;
119
126
  }
120
127
  }
121
- function planVerdictTransitions(claims, verdicts, nextPolledState) {
128
+ function planVerdictTransitions(claims, verdicts, nextPolledState, releases = []) {
122
129
  if (!Array.isArray(claims) || !Array.isArray(verdicts)) return [];
123
130
  const byClaimId = /* @__PURE__ */ new Map();
124
131
  for (const v of verdicts) {
125
132
  if (v && typeof v.claimId === "string" && v.claimId !== "") byClaimId.set(v.claimId, v);
126
133
  }
134
+ const released = new Set(releases.map((r) => r.claimId));
127
135
  const plan = [];
128
136
  for (const c of claims) {
129
137
  const claimId = c?.approval?.claimId;
130
138
  if (!claimId) continue;
131
139
  const v = byClaimId.get(claimId);
132
- if (!v) continue;
140
+ if (!v && !released.has(claimId)) continue;
133
141
  if (TERMINAL.has(c.state)) continue;
134
- const to = verdictState(v.verdict);
142
+ const to = v ? verdictState(v.verdict) : "abandoned";
135
143
  const next = nextPolledState(c.state, to);
136
144
  if (next === c.state) continue;
137
145
  plan.push({
@@ -139,8 +147,8 @@ function planVerdictTransitions(claims, verdicts, nextPolledState) {
139
147
  claimId,
140
148
  from: c.state,
141
149
  to: next,
142
- verdict: v.verdict,
143
- settled: v.settled === true,
150
+ ...v ? { verdict: v.verdict } : { serverReleased: true },
151
+ settled: v?.settled === true,
144
152
  amountUSD: typeof c.amountUSD === "number" ? c.amountUSD : null,
145
153
  title: typeof c.title === "string" ? c.title : ""
146
154
  });
@@ -149,6 +157,7 @@ function planVerdictTransitions(claims, verdicts, nextPolledState) {
149
157
  }
150
158
  function buildVerdictNotice(t) {
151
159
  if (!t || typeof t.to !== "string") return null;
160
+ if (t.serverReleased === true) return " claim released \u2014 this request is closed";
152
161
  const amount = typeof t.amountUSD === "number" && t.amountUSD > 0 ? `$${t.amountUSD}` : null;
153
162
  if (t.verdict === "rejected") {
154
163
  return ` \u2717 poster rejected${amount ? ` \u2014 ${amount}` : ""} \xB7 claim moved to ${t.to}`;
@@ -178,11 +187,19 @@ async function syncFounderVerdicts({
178
187
  if (!pushToken) return quiet;
179
188
  const res = await fetchFounderVerdicts(pushToken, fetchImpl);
180
189
  if (!res) return { checked: false, unavailable: true, applied: [] };
181
- const plan = planVerdictTransitions(founderTargets, res.verdicts, claimsModule.nextPolledState);
190
+ const plan = planVerdictTransitions(
191
+ founderTargets,
192
+ res.verdicts,
193
+ claimsModule.nextPolledState,
194
+ res.releases
195
+ );
182
196
  const applied = [];
183
197
  for (const t of plan) {
184
198
  try {
185
- claimsModule.updateClaim(t.id, { state: t.to, posterVerdict: t.verdict });
199
+ claimsModule.updateClaim(t.id, {
200
+ state: t.to,
201
+ ...t.serverReleased === true ? { serverReleased: true } : { posterVerdict: t.verdict }
202
+ });
186
203
  applied.push(t);
187
204
  const line = buildVerdictNotice(t);
188
205
  if (line) log(line);
@@ -11362,7 +11362,7 @@ async function continuityForRepo(repoFullName, claims) {
11362
11362
  }
11363
11363
  function calibrationSummary(claims, repo) {
11364
11364
  const resolved = claims.filter(
11365
- (c) => c.repoFullName === repo && (c.state === "merged" || c.state === "abandoned") && c.review?.acceptanceScore != null
11365
+ (c) => c.repoFullName === repo && (c.state === "merged" || c.state === "abandoned") && !(c.state === "abandoned" && c.serverReleased === true && !c.posterVerdict) && c.review?.acceptanceScore != null
11366
11366
  );
11367
11367
  const n = resolved.length;
11368
11368
  if (n < 5) return { available: false, n, text: null };
@@ -11651,7 +11651,7 @@ function removeClaimIfStakeMatches(id, expectedStakePostedAt) {
11651
11651
  function countAwaitingFounderApproval(claims = readClaims()) {
11652
11652
  try {
11653
11653
  return claims.filter(
11654
- (c) => c.approval?.mode === "approval-only" && c.approval?.state === "pending"
11654
+ (c) => !TERMINAL_STATES.has(c.state) && c.approval?.mode === "approval-only" && c.approval?.state === "pending"
11655
11655
  ).length;
11656
11656
  } catch {
11657
11657
  return 0;
@@ -11660,8 +11660,17 @@ function countAwaitingFounderApproval(claims = readClaims()) {
11660
11660
  function acceptedPRRate(claims = readClaims()) {
11661
11661
  const total = claims.length;
11662
11662
  const merged = claims.filter((c) => c.state === "merged").length;
11663
- const decided = claims.filter((c) => DECIDED_STATES.has(c.state)).length;
11664
- return { merged, decided, inFlight: total - decided, total, rate: decided === 0 ? 0 : merged / decided };
11663
+ const released = claims.filter(
11664
+ (c) => c.state === "abandoned" && c.serverReleased === true && !c.posterVerdict
11665
+ ).length;
11666
+ const decided = claims.filter((c) => DECIDED_STATES.has(c.state)).length - released;
11667
+ return {
11668
+ merged,
11669
+ decided,
11670
+ inFlight: total - decided - released,
11671
+ total,
11672
+ rate: decided === 0 ? 0 : merged / decided
11673
+ };
11665
11674
  }
11666
11675
  function formatAcceptedPRRate(rate) {
11667
11676
  const inFlight = rate.inFlight > 0 ? ` \xB7 ${rate.inFlight} in flight` : "";