@toon-protocol/rig 4.6.0 → 5.0.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.
Files changed (35) hide show
  1. package/README.md +118 -25
  2. package/dist/{chunk-X232W4TG.js → chunk-2TG4YHEC.js} +89 -59
  3. package/dist/chunk-2TG4YHEC.js.map +1 -0
  4. package/dist/{chunk-DCGV6ALH.js → chunk-4WVH2ITA.js} +158 -9
  5. package/dist/chunk-4WVH2ITA.js.map +1 -0
  6. package/dist/{chunk-U5A7MHBP.js → chunk-7VIVQHRG.js} +1 -1
  7. package/dist/chunk-7VIVQHRG.js.map +1 -0
  8. package/dist/chunk-CHVOXCDV.js +0 -0
  9. package/dist/chunk-CHVOXCDV.js.map +1 -0
  10. package/dist/{chunk-XCLUB2CY.js → chunk-LMZSAFAB.js} +44 -15
  11. package/dist/chunk-LMZSAFAB.js.map +1 -0
  12. package/dist/{chunk-JBFBD7HV.js → chunk-QKL53YZS.js} +7 -3
  13. package/dist/chunk-QKL53YZS.js.map +1 -0
  14. package/dist/{chunk-UE5TAFEU.js → chunk-ZQGXFFBP.js} +4 -4
  15. package/dist/chunk-ZQGXFFBP.js.map +1 -0
  16. package/dist/{ci-serve-AYFZOY4O.js → ci-serve-BU7NDT7O.js} +152 -26
  17. package/dist/ci-serve-BU7NDT7O.js.map +1 -0
  18. package/dist/cli/rig.js +6 -5
  19. package/dist/cli/rig.js.map +1 -1
  20. package/dist/index.d.ts +117 -4
  21. package/dist/index.js +40 -7
  22. package/dist/index.js.map +1 -1
  23. package/dist/standalone/index.d.ts +109 -74
  24. package/dist/standalone/index.js +13 -3
  25. package/dist/{standalone-mode-UQSP4677.js → standalone-mode-AT4S5EZG.js} +148 -50
  26. package/dist/standalone-mode-AT4S5EZG.js.map +1 -0
  27. package/package.json +2 -2
  28. package/dist/chunk-DCGV6ALH.js.map +0 -1
  29. package/dist/chunk-JBFBD7HV.js.map +0 -1
  30. package/dist/chunk-U5A7MHBP.js.map +0 -1
  31. package/dist/chunk-UE5TAFEU.js.map +0 -1
  32. package/dist/chunk-X232W4TG.js.map +0 -1
  33. package/dist/chunk-XCLUB2CY.js.map +0 -1
  34. package/dist/ci-serve-AYFZOY4O.js.map +0 -1
  35. package/dist/standalone-mode-UQSP4677.js.map +0 -1
@@ -12,12 +12,12 @@ import {
12
12
  parseMaintainers,
13
13
  queryRelay,
14
14
  resolveIdentity
15
- } from "./chunk-JBFBD7HV.js";
15
+ } from "./chunk-QKL53YZS.js";
16
16
  import {
17
17
  defaultDaemonPort,
18
18
  standaloneForced,
19
19
  uploadChargeFor
20
- } from "./chunk-U5A7MHBP.js";
20
+ } from "./chunk-7VIVQHRG.js";
21
21
 
22
22
  // src/objects.ts
23
23
  import { createHash } from "crypto";
@@ -1677,10 +1677,16 @@ var CI_MANUAL_TRIGGER_KIND = 9840;
1677
1677
  var CI_JOB_RESULT_KIND = 9841;
1678
1678
  var CI_WORKFLOW_RESULT_KIND = 9842;
1679
1679
  var CI_WORKFLOW_PROGRESS_KIND = 39842;
1680
+ var CI_LIVE_LOG_TAIL_KIND = 39841;
1680
1681
  var CI_RUNNER_FAMILY = "act";
1681
1682
  var CI_SOFTWARE = "rig";
1682
1683
  var CI_MAX_ADVERTISEMENT_TTL = 30 * 60;
1683
1684
  var CI_MAX_PROGRESS_TTL = 30 * 60;
1685
+ var CI_MAX_LIVE_LOG_TAIL_TTL = 30 * 60;
1686
+ var CI_LIVE_LOG_TAIL_INTERVAL_MS = 1e4;
1687
+ var CI_LIVE_LOG_TAIL_JOB_BYTES = 16 * 1024;
1688
+ var CI_LIVE_LOG_TAIL_MAX_BYTES = 64 * 1024;
1689
+ var CI_RUNNER_CHANNEL_KEY = "~runner";
1684
1690
  var REPO_ANNOUNCEMENT_KIND = 30617;
1685
1691
  var CONCLUSIONS = /* @__PURE__ */ new Set([
1686
1692
  "success",
@@ -2412,6 +2418,138 @@ function parseCiWorkflowProgress(ev) {
2412
2418
  if (provenance) result.provenance = provenance;
2413
2419
  return result;
2414
2420
  }
2421
+ function liveLogTailBudget(entries) {
2422
+ if (!Number.isFinite(entries) || entries <= 1) {
2423
+ return CI_LIVE_LOG_TAIL_JOB_BYTES;
2424
+ }
2425
+ const share = Math.floor(CI_LIVE_LOG_TAIL_MAX_BYTES / entries);
2426
+ return Math.max(1, Math.min(CI_LIVE_LOG_TAIL_JOB_BYTES, share));
2427
+ }
2428
+ function liveLogTailEventBudget(runTimeoutMs) {
2429
+ if (!Number.isFinite(runTimeoutMs) || runTimeoutMs <= 0) return 1;
2430
+ return Math.ceil(runTimeoutMs / CI_LIVE_LOG_TAIL_INTERVAL_MS) + 1;
2431
+ }
2432
+ function sliceLogTail(text, maxBytes) {
2433
+ const bytes = Buffer.from(text, "utf8");
2434
+ if (bytes.length <= maxBytes) return { tail: text, omitted: 0 };
2435
+ if (maxBytes <= 0) return { tail: "", omitted: bytes.length };
2436
+ let start = bytes.length - maxBytes;
2437
+ while (start < bytes.length && (bytes[start] & 192) === 128) {
2438
+ start += 1;
2439
+ }
2440
+ return { tail: bytes.subarray(start).toString("utf8"), omitted: start };
2441
+ }
2442
+ function assertOmitted(omitted, what) {
2443
+ if (!Number.isSafeInteger(omitted) || omitted < 0) {
2444
+ throw new Error(`${what}: omitted must be a non-negative byte count`);
2445
+ }
2446
+ }
2447
+ function buildCiLiveLogTail(input, createdAt = now()) {
2448
+ if (input.runId === "") throw new Error("a live log tail needs a run id");
2449
+ assertExpiration(createdAt, input.expiresAt, CI_MAX_LIVE_LOG_TAIL_TTL);
2450
+ const seen = /* @__PURE__ */ new Set();
2451
+ for (const job of input.jobs) {
2452
+ if (job.job === "") throw new Error("a live log tail job needs a job id");
2453
+ if (job.job === CI_RUNNER_CHANNEL_KEY) {
2454
+ throw new Error(
2455
+ `the runner channel is not a job: ${CI_RUNNER_CHANNEL_KEY} may not appear in jobs`
2456
+ );
2457
+ }
2458
+ if (seen.has(job.job)) {
2459
+ throw new Error(`job ${job.job} appears twice in one live log tail`);
2460
+ }
2461
+ seen.add(job.job);
2462
+ assertOmitted(job.omitted, `job ${job.job}`);
2463
+ }
2464
+ if (input.runner) assertOmitted(input.runner.omitted, "runner channel");
2465
+ const content = {
2466
+ jobs: input.jobs.map((j) => ({
2467
+ job: j.job,
2468
+ tail: j.tail,
2469
+ omitted: j.omitted
2470
+ }))
2471
+ };
2472
+ if (input.runner) {
2473
+ content.runner = {
2474
+ tail: input.runner.tail,
2475
+ omitted: input.runner.omitted
2476
+ };
2477
+ }
2478
+ return {
2479
+ kind: CI_LIVE_LOG_TAIL_KIND,
2480
+ content: JSON.stringify(content),
2481
+ tags: [
2482
+ ...commonTriggerTags(input.trigger),
2483
+ ["d", input.runId],
2484
+ ["expiration", String(input.expiresAt)]
2485
+ ],
2486
+ created_at: createdAt
2487
+ };
2488
+ }
2489
+ function isRecord(value) {
2490
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2491
+ }
2492
+ function parseOmitted(value) {
2493
+ if (value === void 0) return 0;
2494
+ if (!Number.isSafeInteger(value) || value < 0) return null;
2495
+ return value;
2496
+ }
2497
+ function parseTailChannel(value) {
2498
+ if (!isRecord(value)) return null;
2499
+ const omitted = parseOmitted(value["omitted"]);
2500
+ const tail = value["tail"];
2501
+ if (typeof tail !== "string" || omitted === null) return null;
2502
+ return { tail, omitted };
2503
+ }
2504
+ function parseCiLiveLogTail(ev) {
2505
+ if (ev.kind !== CI_LIVE_LOG_TAIL_KIND) return null;
2506
+ const { tags } = ev;
2507
+ const trigger = parseCiTriggerContext(tags);
2508
+ if (!trigger) return null;
2509
+ const d = single(tags, "d");
2510
+ const exp = single(tags, "expiration");
2511
+ if (!d || !d[1] || !exp) return null;
2512
+ const expiresAt = Number(exp[1]);
2513
+ if (!Number.isInteger(expiresAt) || expiresAt <= ev.created_at || expiresAt - ev.created_at > CI_MAX_LIVE_LOG_TAIL_TTL) {
2514
+ return null;
2515
+ }
2516
+ let content;
2517
+ try {
2518
+ content = JSON.parse(ev.content);
2519
+ } catch {
2520
+ return null;
2521
+ }
2522
+ if (!isRecord(content) || !Array.isArray(content["jobs"])) return null;
2523
+ const jobs = [];
2524
+ const seen = /* @__PURE__ */ new Set();
2525
+ for (const entry of content["jobs"]) {
2526
+ if (!isRecord(entry)) return null;
2527
+ const job = entry["job"];
2528
+ if (typeof job !== "string" || job === "") return null;
2529
+ if (job === CI_RUNNER_CHANNEL_KEY || seen.has(job)) return null;
2530
+ const channel = parseTailChannel(entry);
2531
+ if (!channel) return null;
2532
+ seen.add(job);
2533
+ jobs.push({ job, tail: channel.tail, omitted: channel.omitted });
2534
+ }
2535
+ let runner;
2536
+ if (content["runner"] !== void 0) {
2537
+ const parsed = parseTailChannel(content["runner"]);
2538
+ if (!parsed) return null;
2539
+ runner = parsed;
2540
+ }
2541
+ const result = {
2542
+ eventId: ev.id,
2543
+ pubkey: ev.pubkey.toLowerCase(),
2544
+ createdAt: ev.created_at,
2545
+ trigger,
2546
+ runId: d[1],
2547
+ jobs,
2548
+ expiresAt
2549
+ };
2550
+ if (runner) result.runner = runner;
2551
+ return result;
2552
+ }
2415
2553
 
2416
2554
  // src/ci/secrets.ts
2417
2555
  import { v2 as nip44 } from "nostr-tools/nip44";
@@ -2651,7 +2789,7 @@ var WORKFLOW_FILE_RE = /\.ya?ml$/i;
2651
2789
  function sha256Hex(bytes) {
2652
2790
  return createHash2("sha256").update(bytes).digest("hex");
2653
2791
  }
2654
- function isRecord(value) {
2792
+ function isRecord2(value) {
2655
2793
  return value !== null && typeof value === "object" && !Array.isArray(value);
2656
2794
  }
2657
2795
  function stringList(value) {
@@ -2662,7 +2800,7 @@ function stringList(value) {
2662
2800
  return void 0;
2663
2801
  }
2664
2802
  function refFilters(value) {
2665
- if (!isRecord(value)) return {};
2803
+ if (!isRecord2(value)) return {};
2666
2804
  const out = {};
2667
2805
  const branches = stringList(value["branches"]);
2668
2806
  const tags = stringList(value["tags"]);
@@ -2680,17 +2818,17 @@ function parseTriggers(on) {
2680
2818
  };
2681
2819
  if (typeof on === "string") enable(on, void 0);
2682
2820
  else if (Array.isArray(on)) for (const name of on) enable(name, void 0);
2683
- else if (isRecord(on)) {
2821
+ else if (isRecord2(on)) {
2684
2822
  for (const [name, options] of Object.entries(on)) enable(name, options);
2685
2823
  }
2686
2824
  return triggers;
2687
2825
  }
2688
2826
  function parseJobs(jobs) {
2689
- if (!isRecord(jobs)) return [];
2827
+ if (!isRecord2(jobs)) return [];
2690
2828
  const out = [];
2691
2829
  for (const [id, spec] of Object.entries(jobs)) {
2692
2830
  const job = { id };
2693
- if (isRecord(spec)) {
2831
+ if (isRecord2(spec)) {
2694
2832
  if (typeof spec["name"] === "string") job.name = spec["name"];
2695
2833
  const runsOn = stringList(spec["runs-on"]);
2696
2834
  if (runsOn) job.runsOn = runsOn;
@@ -2716,7 +2854,7 @@ function parseWorkflow(path, content) {
2716
2854
  parseError: err instanceof Error ? err.message : String(err)
2717
2855
  };
2718
2856
  }
2719
- if (!isRecord(doc)) {
2857
+ if (!isRecord2(doc)) {
2720
2858
  return { ...base, parseError: "workflow is not a YAML mapping" };
2721
2859
  }
2722
2860
  const on = doc["on"] ?? doc["true"];
@@ -4098,10 +4236,16 @@ export {
4098
4236
  CI_JOB_RESULT_KIND,
4099
4237
  CI_WORKFLOW_RESULT_KIND,
4100
4238
  CI_WORKFLOW_PROGRESS_KIND,
4239
+ CI_LIVE_LOG_TAIL_KIND,
4101
4240
  CI_RUNNER_FAMILY,
4102
4241
  CI_SOFTWARE,
4103
4242
  CI_MAX_ADVERTISEMENT_TTL,
4104
4243
  CI_MAX_PROGRESS_TTL,
4244
+ CI_MAX_LIVE_LOG_TAIL_TTL,
4245
+ CI_LIVE_LOG_TAIL_INTERVAL_MS,
4246
+ CI_LIVE_LOG_TAIL_JOB_BYTES,
4247
+ CI_LIVE_LOG_TAIL_MAX_BYTES,
4248
+ CI_RUNNER_CHANNEL_KEY,
4105
4249
  isCiConclusion,
4106
4250
  repoAddress,
4107
4251
  parseRepoAddress,
@@ -4124,6 +4268,11 @@ export {
4124
4268
  parseCiWorkflowResult,
4125
4269
  buildCiWorkflowProgress,
4126
4270
  parseCiWorkflowProgress,
4271
+ liveLogTailBudget,
4272
+ liveLogTailEventBudget,
4273
+ sliceLogTail,
4274
+ buildCiLiveLogTail,
4275
+ parseCiLiveLogTail,
4127
4276
  SECRET_NAME_RE,
4128
4277
  RESERVED_SECRET_NAMES,
4129
4278
  MAX_SECRET_NAMES,
@@ -4174,4 +4323,4 @@ export {
4174
4323
  assembleCiStatus,
4175
4324
  runCiStatus
4176
4325
  };
4177
- //# sourceMappingURL=chunk-DCGV6ALH.js.map
4326
+ //# sourceMappingURL=chunk-4WVH2ITA.js.map