@opencrater/sdk 0.8.52 → 0.8.54

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.

Potentially problematic release.


This version of @opencrater/sdk might be problematic. Click here for more details.

package/dist/hook.js CHANGED
@@ -778,6 +778,23 @@ async function renderPlain(card, state, media, impressionId, campaignId) {
778
778
  }
779
779
  return { ...state, lastShownAt: Date.now(), disclosureShown: true };
780
780
  }
781
+ function windowsCardShowing(displayMs) {
782
+ if (process.platform !== "win32") return false;
783
+ try {
784
+ const lockPath = path3__namespace.join(os2__namespace.homedir(), ".config", "opencrater", "painter.lock");
785
+ const lock = JSON.parse(fs3__namespace.readFileSync(lockPath, "utf8"));
786
+ if (typeof lock.pid !== "number" || typeof lock.startedAt !== "number") return false;
787
+ if (Date.now() - lock.startedAt > displayMs + 1e3) return false;
788
+ try {
789
+ process.kill(lock.pid, 0);
790
+ } catch {
791
+ return false;
792
+ }
793
+ return true;
794
+ } catch {
795
+ return false;
796
+ }
797
+ }
781
798
  var RENDER_SLOT_TTL_MS = 8e3;
782
799
  function claimRenderSlot() {
783
800
  const slot = path3__namespace.join(os2__namespace.homedir(), ".config", "opencrater", "render.lock");
@@ -902,6 +919,11 @@ async function main() {
902
919
  debug("hook: pooled ad skipped \u2014 campaign inside a local cooldown");
903
920
  ({ ad: pooled, pool } = takeFromPool({ pool }, Date.now()));
904
921
  }
922
+ if ((pooled || args.key) && windowsCardShowing((config.displayDurationSeconds ?? 25) * 1e3)) {
923
+ writeState(state);
924
+ debug("hook: a card is already on screen \u2014 not rendering another");
925
+ return;
926
+ }
905
927
  if (pooled || args.key) {
906
928
  if (!claimRenderSlot()) {
907
929
  writeState(state);
package/dist/paint.js CHANGED
@@ -1164,6 +1164,18 @@ function main() {
1164
1164
  }
1165
1165
  clear();
1166
1166
  releaseLock();
1167
+ if (IS_WINDOWS) {
1168
+ let gone = false;
1169
+ const bye = () => {
1170
+ if (!gone) {
1171
+ gone = true;
1172
+ process.exit(0);
1173
+ }
1174
+ };
1175
+ void sink.closeAndWait().then(bye);
1176
+ setTimeout(bye, 1500).unref?.();
1177
+ return;
1178
+ }
1167
1179
  sink.close();
1168
1180
  process.exit(0);
1169
1181
  };
@@ -1298,7 +1310,7 @@ function main() {
1298
1310
  args.push(file);
1299
1311
  }
1300
1312
  try {
1301
- audioProc = child_process.spawn(cmd, args, { stdio: "ignore" });
1313
+ audioProc = IS_WINDOWS ? child_process.spawn(cmd, args, { stdio: "ignore", detached: true, windowsHide: true }) : child_process.spawn(cmd, args, { stdio: "ignore" });
1302
1314
  audioState = "playing";
1303
1315
  audioStartedAt = Date.now();
1304
1316
  audioProc.on("exit", () => {
@@ -1455,10 +1467,12 @@ function main() {
1455
1467
  } catch {
1456
1468
  }
1457
1469
  }
1470
+ takeOverLock(sink);
1458
1471
  const framesNow = ansiFrames;
1459
1472
  const animated = !!(framesNow && framesNow.length > 1);
1460
1473
  paint();
1461
1474
  interval = setInterval(paint, animated ? ANIM_MS : REPAINT_MS);
1475
+ startActivityWatch();
1462
1476
  setTimeout(() => cleanup(), duration2);
1463
1477
  return;
1464
1478
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencrater/sdk",
3
- "version": "0.8.52",
3
+ "version": "0.8.54",
4
4
  "description": "OpenCrater SDK — sponsor cards for CLI tools and MCP servers. Fail-silent, zero dependencies.",
5
5
  "keywords": [
6
6
  "opencrater",