@clossys/launcher 0.3.1 → 0.5.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 +1373 -60
- package/contracts/conversation-contract.md +2 -2
- package/contracts/product-ci-workflow.yml +74 -0
- package/contracts/repository-inventory.json +53 -0
- package/dist/admission-fixture.d.ts +168 -0
- package/dist/admission-fixture.d.ts.map +1 -0
- package/dist/admission-fixture.js +467 -0
- package/dist/admission-fixture.js.map +1 -0
- package/dist/admission.d.ts +124 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/admission.js +804 -0
- package/dist/admission.js.map +1 -0
- package/dist/agents-guide.d.ts +9 -0
- package/dist/agents-guide.d.ts.map +1 -0
- package/dist/agents-guide.js +26 -0
- package/dist/agents-guide.js.map +1 -0
- package/dist/apply-command-options.check.d.ts +12 -0
- package/dist/apply-command-options.check.d.ts.map +1 -0
- package/dist/apply-command-options.check.js +20 -0
- package/dist/apply-command-options.check.js.map +1 -0
- package/dist/apply-plan-cli.d.ts +39 -1
- package/dist/apply-plan-cli.d.ts.map +1 -1
- package/dist/apply-plan-cli.js +432 -15
- package/dist/apply-plan-cli.js.map +1 -1
- package/dist/apply-plan.d.ts +46 -59
- package/dist/apply-plan.d.ts.map +1 -1
- package/dist/apply-plan.js +112 -97
- package/dist/apply-plan.js.map +1 -1
- package/dist/apply-step-fixture.d.ts +87 -0
- package/dist/apply-step-fixture.d.ts.map +1 -0
- package/dist/apply-step-fixture.js +199 -0
- package/dist/apply-step-fixture.js.map +1 -0
- package/dist/apply-store.d.ts +93 -0
- package/dist/apply-store.d.ts.map +1 -0
- package/dist/apply-store.js +625 -0
- package/dist/apply-store.js.map +1 -0
- package/dist/approval-sheet.d.ts +21 -0
- package/dist/approval-sheet.d.ts.map +1 -0
- package/dist/approval-sheet.js +163 -0
- package/dist/approval-sheet.js.map +1 -0
- package/dist/body-command.d.ts +42 -0
- package/dist/body-command.d.ts.map +1 -0
- package/dist/body-command.js +143 -0
- package/dist/body-command.js.map +1 -0
- package/dist/change-set-contract.d.ts +403 -0
- package/dist/change-set-contract.d.ts.map +1 -0
- package/dist/change-set-contract.js +781 -0
- package/dist/change-set-contract.js.map +1 -0
- package/dist/change-set-digest.d.ts +28 -0
- package/dist/change-set-digest.d.ts.map +1 -0
- package/dist/change-set-digest.js +65 -0
- package/dist/change-set-digest.js.map +1 -0
- package/dist/check-cli.d.ts.map +1 -1
- package/dist/check-cli.js +14 -3
- package/dist/check-cli.js.map +1 -1
- package/dist/cli.d.ts +17 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +84 -23
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +79 -22
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +843 -268
- package/dist/core.js.map +1 -1
- package/dist/dry-materialize.d.ts +63 -0
- package/dist/dry-materialize.d.ts.map +1 -0
- package/dist/dry-materialize.js +330 -0
- package/dist/dry-materialize.js.map +1 -0
- package/dist/existing-declaration-adoption.check.d.ts +2 -0
- package/dist/existing-declaration-adoption.check.d.ts.map +1 -0
- package/dist/existing-declaration-adoption.check.js +10 -0
- package/dist/existing-declaration-adoption.check.js.map +1 -0
- package/dist/generated/contract-schema.generated.d.ts +97 -0
- package/dist/generated/contract-schema.generated.d.ts.map +1 -0
- package/dist/generated/contract-schema.generated.js +496 -0
- package/dist/generated/contract-schema.generated.js.map +1 -0
- package/dist/generated/package-scope.generated.d.ts +6 -0
- package/dist/generated/package-scope.generated.d.ts.map +1 -0
- package/dist/generated/package-scope.generated.js +10 -0
- package/dist/generated/package-scope.generated.js.map +1 -0
- package/dist/generated/plan-contracts.generated.d.ts +3 -0
- package/dist/generated/plan-contracts.generated.d.ts.map +1 -0
- package/dist/generated/plan-contracts.generated.js +3101 -0
- package/dist/generated/plan-contracts.generated.js.map +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +11 -0
- package/dist/host.js.map +1 -1
- package/dist/identity.d.ts +15 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +48 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +35 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/inventory-adoption.d.ts +24 -5
- package/dist/inventory-adoption.d.ts.map +1 -1
- package/dist/inventory-adoption.js +70 -25
- package/dist/inventory-adoption.js.map +1 -1
- package/dist/inventory-choice.d.ts +40 -0
- package/dist/inventory-choice.d.ts.map +1 -0
- package/dist/inventory-choice.js +156 -0
- package/dist/inventory-choice.js.map +1 -0
- package/dist/inventory-contract.d.ts +89 -0
- package/dist/inventory-contract.d.ts.map +1 -0
- package/dist/inventory-contract.js +121 -0
- package/dist/inventory-contract.js.map +1 -0
- package/dist/key-editor.d.ts +30 -0
- package/dist/key-editor.d.ts.map +1 -0
- package/dist/key-editor.js +445 -0
- package/dist/key-editor.js.map +1 -0
- package/dist/ledger-contract.d.ts +190 -0
- package/dist/ledger-contract.d.ts.map +1 -0
- package/dist/ledger-contract.js +555 -0
- package/dist/ledger-contract.js.map +1 -0
- package/dist/ledger-trust.d.ts +90 -0
- package/dist/ledger-trust.d.ts.map +1 -0
- package/dist/ledger-trust.js +203 -0
- package/dist/ledger-trust.js.map +1 -0
- package/dist/lockfile-invariants.d.ts +48 -0
- package/dist/lockfile-invariants.d.ts.map +1 -0
- package/dist/lockfile-invariants.js +375 -0
- package/dist/lockfile-invariants.js.map +1 -0
- package/dist/lockfile-readers.d.ts +72 -0
- package/dist/lockfile-readers.d.ts.map +1 -0
- package/dist/lockfile-readers.js +713 -0
- package/dist/lockfile-readers.js.map +1 -0
- package/dist/lockfile-regen.d.ts +106 -0
- package/dist/lockfile-regen.d.ts.map +1 -0
- package/dist/lockfile-regen.js +760 -0
- package/dist/lockfile-regen.js.map +1 -0
- package/dist/lockfile-tool-env.d.ts +29 -0
- package/dist/lockfile-tool-env.d.ts.map +1 -0
- package/dist/lockfile-tool-env.js +111 -0
- package/dist/lockfile-tool-env.js.map +1 -0
- package/dist/materialize.d.ts +113 -0
- package/dist/materialize.d.ts.map +1 -0
- package/dist/materialize.js +881 -0
- package/dist/materialize.js.map +1 -0
- package/dist/observe-repository.d.ts +90 -0
- package/dist/observe-repository.d.ts.map +1 -0
- package/dist/observe-repository.js +1367 -0
- package/dist/observe-repository.js.map +1 -0
- package/dist/plan-bundle-setup-fixture.d.ts +68 -0
- package/dist/plan-bundle-setup-fixture.d.ts.map +1 -0
- package/dist/plan-bundle-setup-fixture.js +167 -0
- package/dist/plan-bundle-setup-fixture.js.map +1 -0
- package/dist/plan-bundle.d.ts +256 -0
- package/dist/plan-bundle.d.ts.map +1 -0
- package/dist/plan-bundle.js +882 -0
- package/dist/plan-bundle.js.map +1 -0
- package/dist/plan-command.d.ts +29 -0
- package/dist/plan-command.d.ts.map +1 -0
- package/dist/plan-command.js +523 -0
- package/dist/plan-command.js.map +1 -0
- package/dist/plan-contract.d.ts +153 -0
- package/dist/plan-contract.d.ts.map +1 -0
- package/dist/plan-contract.js +61 -0
- package/dist/plan-contract.js.map +1 -0
- package/dist/plan-digest.d.ts +25 -0
- package/dist/plan-digest.d.ts.map +1 -0
- package/dist/plan-digest.js +106 -0
- package/dist/plan-digest.js.map +1 -0
- package/dist/plan-rules.d.ts +23 -0
- package/dist/plan-rules.d.ts.map +1 -0
- package/dist/plan-rules.js +177 -0
- package/dist/plan-rules.js.map +1 -0
- package/dist/planned-bundle.d.ts +20 -0
- package/dist/planned-bundle.d.ts.map +1 -0
- package/dist/planned-bundle.js +191 -0
- package/dist/planned-bundle.js.map +1 -0
- package/dist/product-repository.d.ts +4 -0
- package/dist/product-repository.d.ts.map +1 -1
- package/dist/product-repository.js +9 -1
- package/dist/product-repository.js.map +1 -1
- package/dist/provenance-gate.d.ts +48 -0
- package/dist/provenance-gate.d.ts.map +1 -0
- package/dist/provenance-gate.js +324 -0
- package/dist/provenance-gate.js.map +1 -0
- package/dist/pull-request-body.d.ts +45 -0
- package/dist/pull-request-body.d.ts.map +1 -0
- package/dist/pull-request-body.js +232 -0
- package/dist/pull-request-body.js.map +1 -0
- package/dist/registry-snapshot.d.ts +141 -0
- package/dist/registry-snapshot.d.ts.map +1 -0
- package/dist/registry-snapshot.js +483 -0
- package/dist/registry-snapshot.js.map +1 -0
- package/dist/release-age-edit.d.ts +52 -0
- package/dist/release-age-edit.d.ts.map +1 -0
- package/dist/release-age-edit.js +413 -0
- package/dist/release-age-edit.js.map +1 -0
- package/dist/root-entries.d.ts +36 -0
- package/dist/root-entries.d.ts.map +1 -0
- package/dist/root-entries.js +80 -0
- package/dist/root-entries.js.map +1 -0
- package/dist/setup-template-scripts.d.ts +36 -0
- package/dist/setup-template-scripts.d.ts.map +1 -0
- package/dist/setup-template-scripts.js +568 -0
- package/dist/setup-template-scripts.js.map +1 -0
- package/dist/setup-templates.d.ts +55 -0
- package/dist/setup-templates.d.ts.map +1 -0
- package/dist/setup-templates.js +438 -0
- package/dist/setup-templates.js.map +1 -0
- package/dist/skills.d.ts +34 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +129 -17
- package/dist/skills.js.map +1 -1
- package/dist/status.d.ts +63 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +539 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +151 -13
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/skeleton/README.md +14 -9
- package/skeleton/package.json +2 -1
- package/skill/SKILL.md +23 -7
- package/skill-catalogue/advisor/SKILL.md +59 -6
- package/skill-catalogue/architect/SKILL.md +2 -2
- package/skill-catalogue/bouncer/SKILL.md +2 -2
- package/skill-catalogue/builder/SKILL.md +2 -2
- package/skill-catalogue/butler/SKILL.md +2 -2
- package/skill-catalogue/controller/SKILL.md +2 -2
- package/skill-catalogue/customer/SKILL.md +2 -2
- package/skill-catalogue/designer/SKILL.md +4 -2
- package/skill-catalogue/giver/SKILL.md +2 -2
- package/skill-catalogue/influencer/SKILL.md +2 -2
- package/skill-catalogue/inspector/SKILL.md +2 -2
- package/skill-catalogue/integrator/SKILL.md +2 -2
- package/skill-catalogue/keeper/SKILL.md +2 -2
- package/skill-catalogue/launcher/SKILL.md +23 -7
- package/skill-catalogue/locksmith/SKILL.md +2 -2
- package/skill-catalogue/messenger/SKILL.md +2 -2
- package/skill-catalogue/observer/SKILL.md +2 -2
- package/skill-catalogue/publisher/SKILL.md +2 -2
- package/skill-catalogue/starter/SKILL.md +3 -2
- package/skill-catalogue/strategist/SKILL.md +12 -4
- package/skill-catalogue/writer/SKILL.md +2 -2
- package/src/admission-fixture.ts +585 -0
- package/src/admission.ts +819 -0
- package/src/agents-guide.ts +29 -0
- package/src/apply-command-options.check.ts +27 -0
- package/src/apply-plan-cli.ts +454 -14
- package/src/apply-plan.ts +112 -124
- package/src/apply-step-fixture.ts +236 -0
- package/src/apply-store.ts +584 -0
- package/src/approval-sheet.ts +170 -0
- package/src/body-command.ts +162 -0
- package/src/change-set-contract.ts +987 -0
- package/src/change-set-digest.ts +70 -0
- package/src/check-cli.ts +14 -3
- package/src/cli.ts +90 -22
- package/src/core.ts +973 -275
- package/src/dry-materialize.ts +353 -0
- package/src/existing-declaration-adoption.check.ts +12 -0
- package/src/generated/contract-schema.generated.ts +520 -0
- package/src/generated/package-scope.generated.ts +10 -0
- package/src/generated/plan-contracts.generated.ts +3101 -0
- package/src/host.ts +10 -0
- package/src/identity.ts +51 -0
- package/src/index.ts +74 -3
- package/src/inventory-adoption.ts +107 -29
- package/src/inventory-choice.ts +172 -0
- package/src/inventory-contract.ts +166 -0
- package/src/key-editor.ts +446 -0
- package/src/ledger-contract.ts +660 -0
- package/src/ledger-trust.ts +272 -0
- package/src/lockfile-invariants.ts +421 -0
- package/src/lockfile-readers.ts +749 -0
- package/src/lockfile-regen.ts +851 -0
- package/src/lockfile-tool-env.ts +131 -0
- package/src/materialize.ts +915 -0
- package/src/observe-repository.ts +1365 -0
- package/src/plan-bundle-setup-fixture.ts +200 -0
- package/src/plan-bundle.ts +1014 -0
- package/src/plan-command.ts +532 -0
- package/src/plan-contract.ts +179 -0
- package/src/plan-digest.ts +102 -0
- package/src/plan-rules.ts +188 -0
- package/src/planned-bundle.ts +211 -0
- package/src/product-repository.ts +10 -1
- package/src/provenance-gate.ts +352 -0
- package/src/pull-request-body.ts +261 -0
- package/src/registry-snapshot.ts +534 -0
- package/src/release-age-edit.ts +430 -0
- package/src/root-entries.ts +81 -0
- package/src/setup-template-scripts.ts +580 -0
- package/src/setup-templates.ts +479 -0
- package/src/skills.ts +161 -18
- package/src/status.ts +557 -0
- package/src/types.ts +148 -13
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
// Test support for the admission tests (#1178): builders for an approved plan, a
|
|
2
|
+
// setup/apply pair from the shared corpus, apply bundles, a temporary git hub
|
|
3
|
+
// and clone, and a stub readiness executable. Nothing here is imported by the
|
|
4
|
+
// shipped code, and every name, id and digest is an example value.
|
|
5
|
+
import { execFileSync } from "node:child_process";
|
|
6
|
+
import { chmodSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
|
+
import { storeApplyBundle, storeChangeSet } from "./apply-store.js";
|
|
10
|
+
import { LEDGER_PATH, contentDigest, discoveryLinkRole, discoveryLinkTarget, lockfilePath } from "./change-set-contract.js";
|
|
11
|
+
import { bundleDigest, changeSetDigest } from "./change-set-digest.js";
|
|
12
|
+
import { readInstalledLedger, renderInstalledLedger, serializeInstalledLedger } from "./ledger-contract.js";
|
|
13
|
+
import { approvedSubject } from "./apply-plan.js";
|
|
14
|
+
import { planDigest } from "./plan-digest.js";
|
|
15
|
+
export const SITE_ID = "example-owner/site";
|
|
16
|
+
export const SITE_NODE_ID = "R_exampleSite1";
|
|
17
|
+
export const DOCS_ID = "example-owner/docs";
|
|
18
|
+
export const STARTER = "example-owner/site:@example/starter";
|
|
19
|
+
export const STRATEGIST = "example-owner/site:@example/strategist";
|
|
20
|
+
export const WRITER = "example-owner/site:@example/writer";
|
|
21
|
+
export const PLAN_FILE = "clossys/advisor/plan.json";
|
|
22
|
+
export const ASSESSMENT_FILE = "clossys/advisor/assessment-input.json";
|
|
23
|
+
export const READINESS_BIN = "node_modules/.bin/advisor-execution-readiness";
|
|
24
|
+
export const FAR_FUTURE = "2999-01-01T00:00:00Z";
|
|
25
|
+
const REPO = new URL("../../../", import.meta.url);
|
|
26
|
+
const readRepo = (path) => readFileSync(new URL(path, REPO), "utf8");
|
|
27
|
+
export const clone = (value) => structuredClone(value);
|
|
28
|
+
/** Recomputes a set's own digest, and the branch and title that follow from it. */
|
|
29
|
+
export function reseal(set) {
|
|
30
|
+
const digest = changeSetDigest(set);
|
|
31
|
+
set.changeSetDigest = digest;
|
|
32
|
+
set.branch = `${set.agentProvenance ?? "clossys"}/apply-${digest.slice(7, 19)}`;
|
|
33
|
+
set.pullRequest = { title: `Clossys: apply plan ${digest.slice(7, 19)}` };
|
|
34
|
+
return set;
|
|
35
|
+
}
|
|
36
|
+
const CORPUS = JSON.parse(readRepo("docs/contracts/apply-change-set-digest.fixture.json"));
|
|
37
|
+
const PLAN_CORPUS = JSON.parse(readRepo("docs/contracts/advisor-plan-digest.fixture.json"));
|
|
38
|
+
export const corpusSet = (name) => clone(CORPUS.changeSets.find((entry) => entry.name === name).changeSet);
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// git
|
|
41
|
+
const gitEnv = {
|
|
42
|
+
...process.env,
|
|
43
|
+
PATH: process.env.PATH ?? "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
|
44
|
+
GIT_CONFIG_GLOBAL: "/dev/null",
|
|
45
|
+
GIT_CONFIG_NOSYSTEM: "1",
|
|
46
|
+
GIT_AUTHOR_NAME: "Example Author",
|
|
47
|
+
GIT_AUTHOR_EMAIL: "author@example.com",
|
|
48
|
+
GIT_COMMITTER_NAME: "Example Author",
|
|
49
|
+
GIT_COMMITTER_EMAIL: "author@example.com",
|
|
50
|
+
};
|
|
51
|
+
export function git(cwd, ...args) {
|
|
52
|
+
return execFileSync("git", ["-c", "commit.gpgsign=false", "-c", "core.hooksPath=/dev/null", ...args], {
|
|
53
|
+
cwd,
|
|
54
|
+
env: gitEnv,
|
|
55
|
+
encoding: "utf8",
|
|
56
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function decision(at, chosen, subjectDigest) {
|
|
60
|
+
return { at, recommended: "the Launch kit", chosen, by: "sponsor", ...(subjectDigest === undefined ? {} : { subjectDigest }) };
|
|
61
|
+
}
|
|
62
|
+
/** The corpus plan with staffing and exact packages, with its decisions replaced. */
|
|
63
|
+
export function withDecisions(plan, decisions) {
|
|
64
|
+
return { ...clone(plan), decisions: decisions.map((entry) => clone(entry)) };
|
|
65
|
+
}
|
|
66
|
+
/** The corpus plan before any decision: its digest does not depend on decisions. */
|
|
67
|
+
export function basePlan() {
|
|
68
|
+
return { ...clone(PLAN_CORPUS.plans.find((entry) => entry.name === "staffed-with-packages").plan), decisions: [] };
|
|
69
|
+
}
|
|
70
|
+
export const FIRST_AT = "2026-09-24T10:00:00Z";
|
|
71
|
+
export const LATER_AT = "2026-09-25T10:00:00Z";
|
|
72
|
+
/** A plan whose latest decision approves `subject`. */
|
|
73
|
+
export function approvedPlan(subject, base = basePlan()) {
|
|
74
|
+
return withDecisions(base, [decision(FIRST_AT, "approved", subject)]);
|
|
75
|
+
}
|
|
76
|
+
/** `decide(plan, chosen, at, subject?)`: the plan with one more decision. */
|
|
77
|
+
export function decide(plan, chosen, at, subject) {
|
|
78
|
+
return withDecisions(plan, [...plan.decisions, decision(at, chosen, subject)]);
|
|
79
|
+
}
|
|
80
|
+
/** The head commit of each hub hubRepo built, by the hub's path, so two hubs for one plan keep their own heads. */
|
|
81
|
+
const HUB_HEADS = new Map();
|
|
82
|
+
/** The head of the hub most recently built for a plan digest, for a test that names the plan and no hub. */
|
|
83
|
+
const LAST_HEADS = new Map();
|
|
84
|
+
/** What readHubAuthority returns for the plan: the head is that of `hub`, else of the hub last built for this plan, or a placeholder commit id when none was. */
|
|
85
|
+
export function authorityOf(plan, hub) {
|
|
86
|
+
const subject = approvedSubject(plan);
|
|
87
|
+
if (subject === null)
|
|
88
|
+
throw new Error("the fixture plan is not approved");
|
|
89
|
+
const digest = planDigest(plan);
|
|
90
|
+
return { plan, planDigest: digest, subject, head: (hub === undefined ? LAST_HEADS.get(digest) : HUB_HEADS.get(hub)) ?? "0".repeat(40) };
|
|
91
|
+
}
|
|
92
|
+
/** The plan's identity for each package act of one repository. */
|
|
93
|
+
export function committedPlanPackages(plan, repositoryId) {
|
|
94
|
+
return (plan.packages ?? [])
|
|
95
|
+
.filter((act) => act.repository === repositoryId)
|
|
96
|
+
.map(({ planItem, act, name, version, integrity, placement }) => ({ planItem, act, name, version, integrity, placement }));
|
|
97
|
+
}
|
|
98
|
+
/** A valid report bundle for `plan`, holding the given change sets, with its digest computed. */
|
|
99
|
+
export function bundleOf(plan, entries, extra = {}) {
|
|
100
|
+
const digestOfPlan = extra.planDigest ?? planDigest(plan);
|
|
101
|
+
const held = entries.map((entry) => ({ id: entry.id, changeSet: entry.set?.changeSetDigest ?? entry.changeSet, phase: entry.phase ?? entry.set?.phase ?? "apply" }));
|
|
102
|
+
return {
|
|
103
|
+
schemaVersion: 1,
|
|
104
|
+
kind: "clossys.apply-bundle",
|
|
105
|
+
mode: "report",
|
|
106
|
+
plan: { path: "clossys/advisor/plan.json", digest: digestOfPlan, committed: true },
|
|
107
|
+
snapshot: { path: "clossys/.state/apply/registry-snapshot.json", digest: plan.resolution.snapshotDigest },
|
|
108
|
+
engine: { name: "@example/advisor", version: "0.8.0", integrity: plan.packages[0].integrity },
|
|
109
|
+
authorization: { planDigest: digestOfPlan, expiresAt: FAR_FUTURE },
|
|
110
|
+
computedAt: extra.computedAt ?? "2026-09-24T12:00:00Z",
|
|
111
|
+
repositories: held.map((entry) => ({ id: entry.id, verdict: "satisfied", phase: entry.phase, changeSet: entry.changeSet, checks: [] })),
|
|
112
|
+
bundleDigest: bundleDigest(digestOfPlan, held.map((entry) => ({ id: entry.id, changeSetDigest: entry.changeSet }))),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const utf8 = (text) => Buffer.from(text, "utf8");
|
|
116
|
+
export const MANIFEST = `${JSON.stringify({ name: "site", private: true, devDependencies: { "@example/starter": "0.9.2" } }, null, 2)}\n`;
|
|
117
|
+
export function lockfileText(packages, placement = "devDependencies") {
|
|
118
|
+
const root = { name: "site", version: "1.0.0", [placement]: Object.fromEntries(packages.map((pkg) => [pkg.name, pkg.version])) };
|
|
119
|
+
const entries = Object.fromEntries(packages.map((pkg) => [
|
|
120
|
+
`node_modules/${pkg.name}`,
|
|
121
|
+
{ version: pkg.version, resolved: `https://registry.npmjs.org/${pkg.name}/-/${pkg.name.split("/")[1]}-${pkg.version}.tgz`, integrity: pkg.integrity, dev: true },
|
|
122
|
+
]));
|
|
123
|
+
return `${JSON.stringify({ name: "site", version: "1.0.0", lockfileVersion: 3, requires: true, packages: { "": root, ...entries } }, null, 2)}\n`;
|
|
124
|
+
}
|
|
125
|
+
/** The in-memory readers the pure core takes over a base tree, and the hub's stored bundles and sets. */
|
|
126
|
+
export function memoryReaders(state) {
|
|
127
|
+
return {
|
|
128
|
+
bundle: (digest) => state.bundles.find((bundle) => bundle.bundleDigest === digest) ?? null,
|
|
129
|
+
setupSet: (digest) => state.sets.find((set) => set.changeSetDigest === digest) ?? null,
|
|
130
|
+
baseEntry: (path) => {
|
|
131
|
+
const entry = state.tree.get(path);
|
|
132
|
+
if (entry !== undefined)
|
|
133
|
+
return entry;
|
|
134
|
+
const isDirectory = [...state.tree.keys()].some((key) => key.startsWith(`${path}/`));
|
|
135
|
+
return isDirectory ? { mode: "040000", bytes: new Uint8Array(0) } : null;
|
|
136
|
+
},
|
|
137
|
+
baseDirectory: (dir) => {
|
|
138
|
+
const prefix = dir === "" ? "" : `${dir}/`;
|
|
139
|
+
const names = new Set();
|
|
140
|
+
for (const key of state.tree.keys())
|
|
141
|
+
if (key.startsWith(prefix))
|
|
142
|
+
names.add(key.slice(prefix.length).split("/")[0]);
|
|
143
|
+
return names.size === 0 ? null : [...names];
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
export const DEFAULT_BASE_COMMIT = "c".repeat(40);
|
|
148
|
+
/** Whole-file bytes for every whole file of a set: a discovery link's target, or a line of text. */
|
|
149
|
+
export function textsFor(set) {
|
|
150
|
+
const texts = {};
|
|
151
|
+
for (const file of set.files) {
|
|
152
|
+
if (file.derived === true)
|
|
153
|
+
continue;
|
|
154
|
+
if (file.mode === "120000")
|
|
155
|
+
texts[file.path] = discoveryLinkTarget(discoveryLinkRole(file.path));
|
|
156
|
+
else
|
|
157
|
+
texts[file.path] = `fixture ${file.path}\n`;
|
|
158
|
+
}
|
|
159
|
+
return texts;
|
|
160
|
+
}
|
|
161
|
+
function applyTexts(set, texts, keep) {
|
|
162
|
+
for (const file of set.files) {
|
|
163
|
+
if (file.derived === true)
|
|
164
|
+
continue;
|
|
165
|
+
const text = texts[file.path];
|
|
166
|
+
file.after = contentDigest(text);
|
|
167
|
+
file.before = keep ? file.after : null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** The ledger a setup set writes from nothing: `renderInstalledLedger(null, ...)` with the plan's identities. */
|
|
171
|
+
export function setupLedgerBytes(set, subject, plan) {
|
|
172
|
+
return Buffer.from(renderInstalledLedger(null, set, { kind: "approved", subjectDigest: subject }, committedPlanPackages(plan, set.repository.id)), "utf8");
|
|
173
|
+
}
|
|
174
|
+
/** Re-serializes a ledger after `edit`, canonically: for rows that must still pass L1 to L10. */
|
|
175
|
+
export function editLedger(bytes, edit) {
|
|
176
|
+
const ledger = clone(readInstalledLedger(bytes));
|
|
177
|
+
edit(ledger);
|
|
178
|
+
return Buffer.from(serializeInstalledLedger(ledger), "utf8");
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The corpus pair `setup-site` / `apply-after-setup`, retargeted to a plan and
|
|
182
|
+
* resealed, with the approved bundle, the later run's bundle, the ledger the
|
|
183
|
+
* merged setup leaves, and the tree of the base it lives in.
|
|
184
|
+
*/
|
|
185
|
+
export function buildWorld(options = {}) {
|
|
186
|
+
const plan0 = basePlan();
|
|
187
|
+
options.editPlan?.(plan0);
|
|
188
|
+
const digestOfPlan = planDigest(plan0);
|
|
189
|
+
const setup = corpusSet("setup-site");
|
|
190
|
+
setup.planDigest = digestOfPlan;
|
|
191
|
+
const texts = textsFor(setup);
|
|
192
|
+
options.editSetup?.(setup, texts);
|
|
193
|
+
applyTexts(setup, texts, false);
|
|
194
|
+
reseal(setup);
|
|
195
|
+
const sealedSetup = setup;
|
|
196
|
+
const approvedBundle = bundleOf(plan0, [{ id: SITE_ID, set: sealedSetup }]);
|
|
197
|
+
const setupWithBundle = { ...sealedSetup, bundle: approvedBundle.bundleDigest };
|
|
198
|
+
const plan = approvedPlan(approvedBundle.bundleDigest, plan0);
|
|
199
|
+
const authority = authorityOf(plan);
|
|
200
|
+
const ledgerBytes = setupLedgerBytes(setupWithBundle, approvedBundle.bundleDigest, plan);
|
|
201
|
+
const ledger = readInstalledLedger(ledgerBytes);
|
|
202
|
+
const tree = new Map();
|
|
203
|
+
tree.set("README.md", { mode: "100644", bytes: utf8("# Site\n") });
|
|
204
|
+
for (const file of setup.files) {
|
|
205
|
+
if (file.derived === true)
|
|
206
|
+
continue;
|
|
207
|
+
tree.set(file.path, { mode: file.mode, bytes: utf8(texts[file.path]) });
|
|
208
|
+
}
|
|
209
|
+
tree.set("package.json", { mode: "100644", bytes: utf8(MANIFEST) });
|
|
210
|
+
const starter = setup.items.find((item) => item.act === "pin-starter");
|
|
211
|
+
tree.set(lockfilePath(setup.observed), { mode: "100644", bytes: utf8(lockfileText([{ name: starter.package.name, version: starter.package.version, integrity: starter.package.integrity }])) });
|
|
212
|
+
tree.set(LEDGER_PATH, { mode: "100644", bytes: ledgerBytes });
|
|
213
|
+
const baseCommit = options.commitBase?.(tree) ?? DEFAULT_BASE_COMMIT;
|
|
214
|
+
const apply = corpusSet("apply-after-setup");
|
|
215
|
+
apply.planDigest = digestOfPlan;
|
|
216
|
+
apply.repository.baseCommit = baseCommit;
|
|
217
|
+
const applyTextsMap = { ...texts };
|
|
218
|
+
applyTexts(apply, applyTextsMap, true);
|
|
219
|
+
options.editApply?.(apply, applyTextsMap);
|
|
220
|
+
reseal(apply);
|
|
221
|
+
const sealedApply = apply;
|
|
222
|
+
const applyBundle = bundleOf(plan0, [{ id: SITE_ID, set: sealedApply }], { computedAt: "2026-09-26T12:00:00Z" });
|
|
223
|
+
const applyWithBundle = { ...sealedApply, bundle: applyBundle.bundleDigest };
|
|
224
|
+
return { plan, planDigest: digestOfPlan, authority, setup: setupWithBundle, apply: applyWithBundle, texts, approvedBundle, applyBundle, ledgerBytes, ledger, tree, baseCommit };
|
|
225
|
+
}
|
|
226
|
+
/** The same world's apply set as a fresh copy that changed `edit` and was resealed (its `bundle` kept). */
|
|
227
|
+
export function mutateSet(set, edit) {
|
|
228
|
+
const copy = clone(set);
|
|
229
|
+
edit(copy);
|
|
230
|
+
const bundle = copy.bundle;
|
|
231
|
+
reseal(copy);
|
|
232
|
+
copy.bundle = bundle;
|
|
233
|
+
return copy;
|
|
234
|
+
}
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// a temporary hub and a temporary clone
|
|
237
|
+
export function makeRoot(roots, prefix = "launcher-admission-") {
|
|
238
|
+
const root = mkdtempSync(join(tmpdir(), prefix));
|
|
239
|
+
roots.push(root);
|
|
240
|
+
return root;
|
|
241
|
+
}
|
|
242
|
+
function writeTreeEntry(root, path, entry) {
|
|
243
|
+
const target = join(root, path);
|
|
244
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
245
|
+
if (entry.mode === "120000") {
|
|
246
|
+
symlinkSync(Buffer.from(entry.bytes).toString("utf8"), target);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
writeFileSync(target, entry.bytes);
|
|
250
|
+
if (entry.mode === "100755")
|
|
251
|
+
chmodSync(target, 0o755);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* A local clone whose default branch holds exactly `tree`. With `squash`, the
|
|
255
|
+
* files arrive on a side branch and land as one new commit with no ancestor on
|
|
256
|
+
* that branch, the way a squash merge leaves them.
|
|
257
|
+
*/
|
|
258
|
+
export function siteRepo(roots, tree, options = {}) {
|
|
259
|
+
const root = makeRoot(roots, "launcher-admission-site-");
|
|
260
|
+
const clonePath = join(root, "site");
|
|
261
|
+
mkdirSync(clonePath);
|
|
262
|
+
git(clonePath, "init", "-b", "main");
|
|
263
|
+
git(clonePath, "config", "core.autocrlf", "false");
|
|
264
|
+
writeFileSync(join(clonePath, "README.md"), "# Site\n");
|
|
265
|
+
git(clonePath, "add", "README.md");
|
|
266
|
+
git(clonePath, "commit", "-m", "init");
|
|
267
|
+
const writeAll = () => {
|
|
268
|
+
for (const [path, entry] of tree)
|
|
269
|
+
if (path !== "README.md")
|
|
270
|
+
writeTreeEntry(clonePath, path, entry);
|
|
271
|
+
git(clonePath, "add", "-A");
|
|
272
|
+
// The admitted base is a Git tree. A case-insensitive worktree cannot
|
|
273
|
+
// materialize two distinct raw paths, so bind each index entry to its
|
|
274
|
+
// supplied bytes instead of trusting the filesystem's spelling/content.
|
|
275
|
+
for (const [path, entry] of tree)
|
|
276
|
+
if (path !== "README.md") {
|
|
277
|
+
const blob = execFileSync("git", ["hash-object", "-w", "--stdin"], {
|
|
278
|
+
cwd: clonePath,
|
|
279
|
+
env: gitEnv,
|
|
280
|
+
input: entry.bytes,
|
|
281
|
+
encoding: "utf8",
|
|
282
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
283
|
+
}).trim();
|
|
284
|
+
git(clonePath, "-c", "core.ignorecase=false", "update-index", "--add", "--cacheinfo", entry.mode, blob, path);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
if (options.mergeStyle === "squash") {
|
|
288
|
+
git(clonePath, "checkout", "-b", "setup");
|
|
289
|
+
writeAll();
|
|
290
|
+
git(clonePath, "commit", "-m", "setup");
|
|
291
|
+
const sideTip = git(clonePath, "rev-parse", "HEAD").trim();
|
|
292
|
+
git(clonePath, "checkout", "main");
|
|
293
|
+
// An unrelated commit first, so the squashed commit is not a fast-forward of the side branch.
|
|
294
|
+
writeFileSync(join(clonePath, "NOTES.md"), "notes\n");
|
|
295
|
+
git(clonePath, "add", "NOTES.md");
|
|
296
|
+
git(clonePath, "commit", "-m", "notes");
|
|
297
|
+
git(clonePath, "merge", "--squash", "setup");
|
|
298
|
+
git(clonePath, "commit", "-m", "setup (squashed)");
|
|
299
|
+
return { clone: realpathSync(clonePath), baseCommit: git(clonePath, "rev-parse", "HEAD").trim(), sideTip };
|
|
300
|
+
}
|
|
301
|
+
writeAll();
|
|
302
|
+
git(clonePath, "commit", "-m", "setup");
|
|
303
|
+
return { clone: realpathSync(clonePath), baseCommit: git(clonePath, "rev-parse", "HEAD").trim(), sideTip: null };
|
|
304
|
+
}
|
|
305
|
+
/** A stub for advisor-execution-readiness: exit 0 when expiresAt is later than argv[3], 1 when not, 2 when unreadable. */
|
|
306
|
+
export const READINESS_STUB = `#!/usr/bin/env node
|
|
307
|
+
const fs = require("node:fs");
|
|
308
|
+
let document;
|
|
309
|
+
try {
|
|
310
|
+
document = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
|
|
311
|
+
} catch {
|
|
312
|
+
process.exit(2);
|
|
313
|
+
}
|
|
314
|
+
const engagement = document && document.engagement;
|
|
315
|
+
if (engagement && engagement.hang === true) setTimeout(() => process.exit(0), 60000);
|
|
316
|
+
else {
|
|
317
|
+
const authorization = engagement && engagement.executionAuthorization;
|
|
318
|
+
const expires = authorization ? Date.parse(authorization.expiresAt) : NaN;
|
|
319
|
+
const asOf = Date.parse(process.argv[3]);
|
|
320
|
+
if (Number.isNaN(expires) || Number.isNaN(asOf)) process.exit(2);
|
|
321
|
+
process.exit(expires > asOf ? 0 : 1);
|
|
322
|
+
}
|
|
323
|
+
`;
|
|
324
|
+
export function writeReadinessStub(hub) {
|
|
325
|
+
const bin = join(hub, READINESS_BIN);
|
|
326
|
+
mkdirSync(dirname(bin), { recursive: true });
|
|
327
|
+
writeFileSync(bin, READINESS_STUB, { mode: 0o755 });
|
|
328
|
+
chmodSync(bin, 0o755);
|
|
329
|
+
return bin;
|
|
330
|
+
}
|
|
331
|
+
/** An assessment-input document carrying an execution authorization for a plan. */
|
|
332
|
+
export function assessmentFor(plan, patch = {}, permitted = [SITE_ID]) {
|
|
333
|
+
// Every distinct package of the plan is permitted, whatever the repository: admission requires the list to equal the plan's packages exactly.
|
|
334
|
+
const packages = [...new Map((plan.packages ?? []).map(({ name, version, integrity }) => [`${name}@${version}#${integrity}`, { name, version, integrity }])).values()];
|
|
335
|
+
return {
|
|
336
|
+
engagement: {
|
|
337
|
+
executionAuthorization: {
|
|
338
|
+
planDigest: planDigest(plan),
|
|
339
|
+
permittedRepositoryIds: [...permitted],
|
|
340
|
+
permittedPackages: packages,
|
|
341
|
+
grantedAt: "2026-09-24T12:00:00Z",
|
|
342
|
+
expiresAt: FAR_FUTURE,
|
|
343
|
+
...patch,
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** A current authorization for the plan; none when the plan has no digest (it is invalid). */
|
|
349
|
+
function defaultAssessment(plan) {
|
|
350
|
+
try {
|
|
351
|
+
return assessmentFor(plan);
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
const jsonText = (value) => `${JSON.stringify(value, null, 2)}\n`;
|
|
358
|
+
/** A temporary git hub with plan.json (and assessment-input.json) committed, and sets and bundles stored in it. */
|
|
359
|
+
export function hubRepo(roots, options) {
|
|
360
|
+
const repository = realpathSync(makeRoot(roots, "launcher-admission-hub-"));
|
|
361
|
+
git(repository, "init", "-b", "main");
|
|
362
|
+
git(repository, "config", "core.autocrlf", "false");
|
|
363
|
+
const hub = options.nested === true ? join(repository, "nested", "hub") : repository;
|
|
364
|
+
mkdirSync(join(hub, "clossys", "advisor"), { recursive: true });
|
|
365
|
+
const commits = [];
|
|
366
|
+
const mode = options.planMode ?? "regular";
|
|
367
|
+
const last = options.plans[options.plans.length - 1];
|
|
368
|
+
const relative = (path) => (options.nested === true ? join("nested", "hub", path) : path);
|
|
369
|
+
for (const [index, plan] of options.plans.entries()) {
|
|
370
|
+
const target = join(hub, PLAN_FILE);
|
|
371
|
+
const text = options.planBytes ?? jsonText(plan);
|
|
372
|
+
const paths = [];
|
|
373
|
+
if (mode === "absent") {
|
|
374
|
+
writeFileSync(join(hub, "clossys", "advisor", "placeholder.txt"), `${index}\n`);
|
|
375
|
+
paths.push(relative("clossys/advisor/placeholder.txt"));
|
|
376
|
+
}
|
|
377
|
+
else if (mode === "symlink") {
|
|
378
|
+
writeFileSync(join(hub, "clossys", "advisor", "plan-real.json"), text);
|
|
379
|
+
rmSync(target, { force: true });
|
|
380
|
+
symlinkSync("plan-real.json", target);
|
|
381
|
+
paths.push(relative(PLAN_FILE), relative("clossys/advisor/plan-real.json"));
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
writeFileSync(target, text);
|
|
385
|
+
if (mode === "executable")
|
|
386
|
+
chmodSync(target, 0o755);
|
|
387
|
+
paths.push(relative(PLAN_FILE));
|
|
388
|
+
}
|
|
389
|
+
if (index === options.plans.length - 1) {
|
|
390
|
+
const document = options.assessment === undefined ? defaultAssessment(last) : options.assessment;
|
|
391
|
+
if (document !== null) {
|
|
392
|
+
writeFileSync(join(hub, ASSESSMENT_FILE), jsonText(document));
|
|
393
|
+
paths.push(relative(ASSESSMENT_FILE));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
git(repository, "add", "-f", ...paths);
|
|
397
|
+
git(repository, "commit", "-m", `plan ${index}`);
|
|
398
|
+
commits.push(git(repository, "rev-parse", "HEAD").trim());
|
|
399
|
+
}
|
|
400
|
+
let origin = null;
|
|
401
|
+
if (options.upstream !== false) {
|
|
402
|
+
origin = join(makeRoot(roots, "launcher-admission-origin-"), "hub.git");
|
|
403
|
+
execFileSync("git", ["init", "--bare", "-b", "main", origin], { env: gitEnv, stdio: "ignore" });
|
|
404
|
+
git(repository, "remote", "add", "origin", origin);
|
|
405
|
+
git(repository, "push", "-q", "-u", "origin", "main");
|
|
406
|
+
}
|
|
407
|
+
if (options.detachAt !== undefined)
|
|
408
|
+
git(repository, "checkout", "-q", "--detach", commits[options.detachAt]);
|
|
409
|
+
if (options.worktreePlan !== undefined) {
|
|
410
|
+
rmSync(join(hub, PLAN_FILE), { force: true });
|
|
411
|
+
writeFileSync(join(hub, PLAN_FILE), jsonText(options.worktreePlan));
|
|
412
|
+
}
|
|
413
|
+
if (mode === "absent")
|
|
414
|
+
writeFileSync(join(hub, PLAN_FILE), jsonText(last));
|
|
415
|
+
if (options.readiness !== false)
|
|
416
|
+
writeReadinessStub(hub);
|
|
417
|
+
const realHub = realpathSync(hub);
|
|
418
|
+
HUB_HEADS.set(realHub, commits[commits.length - 1]);
|
|
419
|
+
try {
|
|
420
|
+
LAST_HEADS.set(planDigest(last), commits[commits.length - 1]);
|
|
421
|
+
}
|
|
422
|
+
catch {
|
|
423
|
+
// An invalid plan has no digest, and no authority is built for it.
|
|
424
|
+
}
|
|
425
|
+
for (const set of options.sets ?? [])
|
|
426
|
+
storeChangeSet(realHub, set);
|
|
427
|
+
for (const bundle of options.bundles ?? [])
|
|
428
|
+
storeApplyBundle(realHub, bundle);
|
|
429
|
+
return { hub: realHub, repository, commits, origin };
|
|
430
|
+
}
|
|
431
|
+
/** Whether the hub's current branch has an upstream. */
|
|
432
|
+
function hasUpstream(hub) {
|
|
433
|
+
try {
|
|
434
|
+
git(hub, "rev-parse", "--verify", "-q", "@{upstream}");
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/** Commits `plan` as clossys/advisor/plan.json at the hub's current branch, and pushes it when the branch has an upstream: one more decision, or a whole other plan. */
|
|
442
|
+
export function commitHubPlan(hub, plan, message = "plan decision") {
|
|
443
|
+
writeFileSync(join(hub, PLAN_FILE), jsonText(plan));
|
|
444
|
+
git(hub, "add", "-f", PLAN_FILE);
|
|
445
|
+
git(hub, "commit", "-m", message);
|
|
446
|
+
if (hasUpstream(hub))
|
|
447
|
+
git(hub, "push", "-q");
|
|
448
|
+
return git(hub, "rev-parse", "HEAD").trim();
|
|
449
|
+
}
|
|
450
|
+
/** Commits a new assessment-input.json at the hub's current branch, and pushes it when the branch has an upstream. */
|
|
451
|
+
export function commitHubAssessment(hub, document, message = "assessment") {
|
|
452
|
+
writeFileSync(join(hub, ASSESSMENT_FILE), jsonText(document));
|
|
453
|
+
git(hub, "add", "-f", ASSESSMENT_FILE);
|
|
454
|
+
git(hub, "commit", "-m", message);
|
|
455
|
+
if (hasUpstream(hub))
|
|
456
|
+
git(hub, "push", "-q");
|
|
457
|
+
return git(hub, "rev-parse", "HEAD").trim();
|
|
458
|
+
}
|
|
459
|
+
/** Puts one more commit on the hub's origin from a separate clone, then fetches it: the hub's branch is now behind its upstream. */
|
|
460
|
+
export function advanceHubUpstream(roots, hub, origin) {
|
|
461
|
+
const other = join(makeRoot(roots, "launcher-admission-other-"), "hub");
|
|
462
|
+
execFileSync("git", ["clone", "-q", origin, other], { env: gitEnv, stdio: "ignore" });
|
|
463
|
+
git(other, "commit", "-q", "--allow-empty", "-m", "elsewhere");
|
|
464
|
+
git(other, "push", "-q", "origin", "main");
|
|
465
|
+
git(hub, "fetch", "-q", "origin");
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=admission-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission-fixture.js","sourceRoot":"","sources":["../src/admission-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { ApplyBundle, ApprovalBinding, RepositoryChangeSet } from "./change-set-contract.js";
|
|
2
|
+
import type { InstalledLedger, LedgerPackageIdentity } from "./ledger-contract.js";
|
|
3
|
+
import type { AdvisorPlan } from "./plan-contract.js";
|
|
4
|
+
/** A refusal: exit 1 is violated, exit 2 is indeterminate. `detail` is a fixed token, never a value. */
|
|
5
|
+
export interface AdmissionRefusal {
|
|
6
|
+
readonly state: "refused";
|
|
7
|
+
readonly exitCode: 1 | 2;
|
|
8
|
+
readonly reason: string;
|
|
9
|
+
readonly detail?: string;
|
|
10
|
+
}
|
|
11
|
+
/** What the hub's committed plan says: the plan itself, its digest, the bundle digest its latest decision approves, and the commit id it was read from. */
|
|
12
|
+
export interface HubAuthority {
|
|
13
|
+
readonly plan: AdvisorPlan;
|
|
14
|
+
readonly planDigest: string;
|
|
15
|
+
readonly subject: string;
|
|
16
|
+
/** The commit id HEAD resolved to, which equalled its branch's upstream, and which the plan was read from. */
|
|
17
|
+
readonly head: string;
|
|
18
|
+
}
|
|
19
|
+
export type AdmissionDecision = {
|
|
20
|
+
readonly state: "bound";
|
|
21
|
+
readonly binding: ApprovalBinding;
|
|
22
|
+
} | AdmissionRefusal;
|
|
23
|
+
/** One package act, as RENDER and the trust check take it. */
|
|
24
|
+
export type PlanPackageIdentity = LedgerPackageIdentity & {
|
|
25
|
+
readonly act: "install" | "pin-starter";
|
|
26
|
+
};
|
|
27
|
+
/** What the base tree holds at one path: git's own mode, and the raw bytes (empty for a directory or a gitlink). */
|
|
28
|
+
export interface BaseTreeEntry {
|
|
29
|
+
readonly mode: string;
|
|
30
|
+
readonly bytes: Uint8Array;
|
|
31
|
+
}
|
|
32
|
+
/** Everything the pure core reads from outside itself. A reader that throws is read as unreadable. */
|
|
33
|
+
export interface AdmissionReaders {
|
|
34
|
+
/** The apply bundle the hub stored for a digest, verified, or null. */
|
|
35
|
+
readonly bundle: (digest: string) => ApplyBundle | null;
|
|
36
|
+
/** The change set the hub stored for a digest, verified, or null. */
|
|
37
|
+
readonly setupSet: (digest: string) => RepositoryChangeSet | null;
|
|
38
|
+
/** The entry at a path in the base tree: null when there is none. */
|
|
39
|
+
readonly baseEntry: (path: string) => BaseTreeEntry | null | "unreadable";
|
|
40
|
+
/** The names directly under a directory of the base tree (`""` is the root): null when there is no such directory. */
|
|
41
|
+
readonly baseDirectory: (dir: string) => readonly string[] | null | "unreadable";
|
|
42
|
+
}
|
|
43
|
+
export interface DecideBindingInput {
|
|
44
|
+
readonly set: RepositoryChangeSet;
|
|
45
|
+
readonly authority: HubAuthority;
|
|
46
|
+
/** The base ledger, already trusted by the caller (trustInstalledLedger), or null when the base has none. */
|
|
47
|
+
readonly baseLedger: InstalledLedger | null;
|
|
48
|
+
/** The base ledger's exact bytes, or null when the base has none. */
|
|
49
|
+
readonly baseLedgerBytes: Uint8Array | null;
|
|
50
|
+
readonly readers: AdmissionReaders;
|
|
51
|
+
}
|
|
52
|
+
/** Runs advisor-execution-readiness; `status` is its exit code, or null when it did not exit on its own. */
|
|
53
|
+
export type ReadinessRunner = (request: {
|
|
54
|
+
bin: string;
|
|
55
|
+
assessmentPath: string;
|
|
56
|
+
asOf: string;
|
|
57
|
+
cwd: string;
|
|
58
|
+
}) => {
|
|
59
|
+
status: number | null;
|
|
60
|
+
};
|
|
61
|
+
export interface DecideSetBindingInput {
|
|
62
|
+
readonly hub: string;
|
|
63
|
+
/** The real path of the local clone, for git object reads. */
|
|
64
|
+
readonly clone: string;
|
|
65
|
+
readonly set: RepositoryChangeSet;
|
|
66
|
+
readonly authority: HubAuthority;
|
|
67
|
+
readonly baseLedger: InstalledLedger | null;
|
|
68
|
+
readonly baseLedgerBytes: Uint8Array | null;
|
|
69
|
+
readonly now?: () => Date;
|
|
70
|
+
readonly runReadiness?: ReadinessRunner;
|
|
71
|
+
/** How long the default readiness runner waits; default 120000. */
|
|
72
|
+
readonly readinessTimeoutMs?: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* K1. The plan committed at the hub's HEAD, and the bundle digest its latest
|
|
76
|
+
* decision approves. Exit 2, `awaiting-approval`, with `hub-not-upstream` when
|
|
77
|
+
* the attached HEAD is not its branch's upstream (H1: no upstream, ahead or
|
|
78
|
+
* behind), `plan-unreadable` when the plan cannot be read as one strict-JSON
|
|
79
|
+
* regular blob at an attached HEAD, and `plan-not-approved` when it does not
|
|
80
|
+
* validate, or nothing in it is approved with a subject (see approvedSubject).
|
|
81
|
+
* HEAD is resolved once (H2): `head` is that commit id, and the plan is read
|
|
82
|
+
* from it.
|
|
83
|
+
*/
|
|
84
|
+
export declare function readHubAuthority(hub: string): HubAuthority | AdmissionRefusal;
|
|
85
|
+
/**
|
|
86
|
+
* The plan's identity for each package act of one repository (exact id), in
|
|
87
|
+
* the shape renderInstalledLedger and trustInstalledLedger take. Trust and
|
|
88
|
+
* render use the committed plan's acts, never the acts of the set being
|
|
89
|
+
* admitted: a set cannot vouch for itself.
|
|
90
|
+
*/
|
|
91
|
+
export declare function planPackagesFor(authority: HubAuthority, repositoryId: string): PlanPackageIdentity[];
|
|
92
|
+
/** K10's last word on a pair of ledgers: exactly one admitted next generation, with no violation. Null when it holds. */
|
|
93
|
+
export declare function checkSuccession(baseBytes: Uint8Array | null, headBytes: Uint8Array): AdmissionRefusal | null;
|
|
94
|
+
/**
|
|
95
|
+
* K10. Renders the ledger the admitted set would write over the base ledger,
|
|
96
|
+
* with the committed plan's package identities, and requires it to be exactly
|
|
97
|
+
* one admitted generation over the base's bytes. A render that throws is
|
|
98
|
+
* `render-refused`; a pair the succession rules refuse is `succession-refused`.
|
|
99
|
+
*/
|
|
100
|
+
export declare function verifyAdmittedSuccession(input: {
|
|
101
|
+
readonly baseLedger: InstalledLedger | null;
|
|
102
|
+
readonly baseLedgerBytes: Uint8Array | null;
|
|
103
|
+
readonly set: RepositoryChangeSet;
|
|
104
|
+
readonly authority: HubAuthority;
|
|
105
|
+
readonly setupChangeSet: string;
|
|
106
|
+
}): AdmissionDecision;
|
|
107
|
+
/**
|
|
108
|
+
* The pure core. `set` is bound approved when the hub's approved bundle holds
|
|
109
|
+
* it, admitted when it is the apply set that follows the approved, merged
|
|
110
|
+
* setup set (D26), and refused otherwise. Every read goes through `readers`;
|
|
111
|
+
* nothing here touches a filesystem or runs git. Never throws: a failure it
|
|
112
|
+
* did not foresee is `admission-failed`.
|
|
113
|
+
*/
|
|
114
|
+
export declare function decideBinding(input: DecideBindingInput): AdmissionDecision;
|
|
115
|
+
/**
|
|
116
|
+
* The binding of one change set, from the hub alone: the pure core wired to
|
|
117
|
+
* the hub's stores (never a caller-supplied list) and to git objects at the
|
|
118
|
+
* set's base commit in the clone, then the execution authorization for any set
|
|
119
|
+
* that has package acts. `authority` is what readHubAuthority returned, and
|
|
120
|
+
* `baseLedger` and `baseLedgerBytes` the base ledger the caller already
|
|
121
|
+
* trusted (trustInstalledLedger, over the committed plan's acts).
|
|
122
|
+
*/
|
|
123
|
+
export declare function decideSetBinding(input: DecideSetBindingInput): Promise<AdmissionDecision>;
|
|
124
|
+
//# sourceMappingURL=admission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"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"}
|