@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.
- package/README.md +118 -25
- package/dist/{chunk-X232W4TG.js → chunk-2TG4YHEC.js} +89 -59
- package/dist/chunk-2TG4YHEC.js.map +1 -0
- package/dist/{chunk-DCGV6ALH.js → chunk-4WVH2ITA.js} +158 -9
- package/dist/chunk-4WVH2ITA.js.map +1 -0
- package/dist/{chunk-U5A7MHBP.js → chunk-7VIVQHRG.js} +1 -1
- package/dist/chunk-7VIVQHRG.js.map +1 -0
- package/dist/chunk-CHVOXCDV.js +0 -0
- package/dist/chunk-CHVOXCDV.js.map +1 -0
- package/dist/{chunk-XCLUB2CY.js → chunk-LMZSAFAB.js} +44 -15
- package/dist/chunk-LMZSAFAB.js.map +1 -0
- package/dist/{chunk-JBFBD7HV.js → chunk-QKL53YZS.js} +7 -3
- package/dist/chunk-QKL53YZS.js.map +1 -0
- package/dist/{chunk-UE5TAFEU.js → chunk-ZQGXFFBP.js} +4 -4
- package/dist/chunk-ZQGXFFBP.js.map +1 -0
- package/dist/{ci-serve-AYFZOY4O.js → ci-serve-BU7NDT7O.js} +152 -26
- package/dist/ci-serve-BU7NDT7O.js.map +1 -0
- package/dist/cli/rig.js +6 -5
- package/dist/cli/rig.js.map +1 -1
- package/dist/index.d.ts +117 -4
- package/dist/index.js +40 -7
- package/dist/index.js.map +1 -1
- package/dist/standalone/index.d.ts +109 -74
- package/dist/standalone/index.js +13 -3
- package/dist/{standalone-mode-UQSP4677.js → standalone-mode-AT4S5EZG.js} +148 -50
- package/dist/standalone-mode-AT4S5EZG.js.map +1 -0
- package/package.json +2 -2
- package/dist/chunk-DCGV6ALH.js.map +0 -1
- package/dist/chunk-JBFBD7HV.js.map +0 -1
- package/dist/chunk-U5A7MHBP.js.map +0 -1
- package/dist/chunk-UE5TAFEU.js.map +0 -1
- package/dist/chunk-X232W4TG.js.map +0 -1
- package/dist/chunk-XCLUB2CY.js.map +0 -1
- package/dist/ci-serve-AYFZOY4O.js.map +0 -1
- 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-
|
|
15
|
+
} from "./chunk-QKL53YZS.js";
|
|
16
16
|
import {
|
|
17
17
|
defaultDaemonPort,
|
|
18
18
|
standaloneForced,
|
|
19
19
|
uploadChargeFor
|
|
20
|
-
} from "./chunk-
|
|
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
|
|
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 (!
|
|
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 (
|
|
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 (!
|
|
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 (
|
|
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 (!
|
|
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-
|
|
4326
|
+
//# sourceMappingURL=chunk-4WVH2ITA.js.map
|