@sublang/slc 0.1.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 (137) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +192 -0
  3. package/dist/app.d.ts +85 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +233 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/artifacts.d.ts +61 -0
  8. package/dist/artifacts.d.ts.map +1 -0
  9. package/dist/artifacts.js +97 -0
  10. package/dist/artifacts.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +26 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/cligent-agent.d.ts +11 -0
  16. package/dist/cligent-agent.d.ts.map +1 -0
  17. package/dist/cligent-agent.js +66 -0
  18. package/dist/cligent-agent.js.map +1 -0
  19. package/dist/compiled-executor.d.ts +42 -0
  20. package/dist/compiled-executor.d.ts.map +1 -0
  21. package/dist/compiled-executor.js +433 -0
  22. package/dist/compiled-executor.js.map +1 -0
  23. package/dist/config-file.d.ts +52 -0
  24. package/dist/config-file.d.ts.map +1 -0
  25. package/dist/config-file.js +159 -0
  26. package/dist/config-file.js.map +1 -0
  27. package/dist/config.d.ts +82 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +161 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/entry-module.d.ts +22 -0
  32. package/dist/entry-module.d.ts.map +1 -0
  33. package/dist/entry-module.js +216 -0
  34. package/dist/entry-module.js.map +1 -0
  35. package/dist/execution.d.ts +71 -0
  36. package/dist/execution.d.ts.map +1 -0
  37. package/dist/execution.js +207 -0
  38. package/dist/execution.js.map +1 -0
  39. package/dist/file-capability.d.ts +46 -0
  40. package/dist/file-capability.d.ts.map +1 -0
  41. package/dist/file-capability.js +234 -0
  42. package/dist/file-capability.js.map +1 -0
  43. package/dist/file-grants.d.ts +79 -0
  44. package/dist/file-grants.d.ts.map +1 -0
  45. package/dist/file-grants.js +133 -0
  46. package/dist/file-grants.js.map +1 -0
  47. package/dist/hash.d.ts +14 -0
  48. package/dist/hash.d.ts.map +1 -0
  49. package/dist/hash.js +34 -0
  50. package/dist/hash.js.map +1 -0
  51. package/dist/index.d.ts +20 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +22 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/interpreter.d.ts +48 -0
  56. package/dist/interpreter.d.ts.map +1 -0
  57. package/dist/interpreter.js +118 -0
  58. package/dist/interpreter.js.map +1 -0
  59. package/dist/invocation.d.ts +64 -0
  60. package/dist/invocation.d.ts.map +1 -0
  61. package/dist/invocation.js +148 -0
  62. package/dist/invocation.js.map +1 -0
  63. package/dist/link.d.ts +63 -0
  64. package/dist/link.d.ts.map +1 -0
  65. package/dist/link.js +172 -0
  66. package/dist/link.js.map +1 -0
  67. package/dist/markdown.d.ts +12 -0
  68. package/dist/markdown.d.ts.map +1 -0
  69. package/dist/markdown.js +63 -0
  70. package/dist/markdown.js.map +1 -0
  71. package/dist/normalize.md +68 -0
  72. package/dist/phase-runner.d.ts +64 -0
  73. package/dist/phase-runner.d.ts.map +1 -0
  74. package/dist/phase-runner.js +322 -0
  75. package/dist/phase-runner.js.map +1 -0
  76. package/dist/phase.d.ts +62 -0
  77. package/dist/phase.d.ts.map +1 -0
  78. package/dist/phase.js +111 -0
  79. package/dist/phase.js.map +1 -0
  80. package/dist/pin-closure.d.ts +19 -0
  81. package/dist/pin-closure.d.ts.map +1 -0
  82. package/dist/pin-closure.js +110 -0
  83. package/dist/pin-closure.js.map +1 -0
  84. package/dist/pin-currency.d.ts +55 -0
  85. package/dist/pin-currency.d.ts.map +1 -0
  86. package/dist/pin-currency.js +435 -0
  87. package/dist/pin-currency.js.map +1 -0
  88. package/dist/pin-generate.d.ts +46 -0
  89. package/dist/pin-generate.d.ts.map +1 -0
  90. package/dist/pin-generate.js +131 -0
  91. package/dist/pin-generate.js.map +1 -0
  92. package/dist/pin-paths.d.ts +11 -0
  93. package/dist/pin-paths.d.ts.map +1 -0
  94. package/dist/pin-paths.js +108 -0
  95. package/dist/pin-paths.js.map +1 -0
  96. package/dist/pins.d.ts +84 -0
  97. package/dist/pins.d.ts.map +1 -0
  98. package/dist/pins.js +265 -0
  99. package/dist/pins.js.map +1 -0
  100. package/dist/pipeline.d.ts +61 -0
  101. package/dist/pipeline.d.ts.map +1 -0
  102. package/dist/pipeline.js +147 -0
  103. package/dist/pipeline.js.map +1 -0
  104. package/dist/playbook-contract.d.ts +194 -0
  105. package/dist/playbook-contract.d.ts.map +1 -0
  106. package/dist/playbook-contract.js +180 -0
  107. package/dist/playbook-contract.js.map +1 -0
  108. package/dist/playbook-ports.d.ts +53 -0
  109. package/dist/playbook-ports.d.ts.map +1 -0
  110. package/dist/playbook-ports.js +217 -0
  111. package/dist/playbook-ports.js.map +1 -0
  112. package/dist/resolver.d.ts +68 -0
  113. package/dist/resolver.d.ts.map +1 -0
  114. package/dist/resolver.js +133 -0
  115. package/dist/resolver.js.map +1 -0
  116. package/dist/runner.d.ts +45 -0
  117. package/dist/runner.d.ts.map +1 -0
  118. package/dist/runner.js +506 -0
  119. package/dist/runner.js.map +1 -0
  120. package/dist/runtime-package.d.ts +7 -0
  121. package/dist/runtime-package.d.ts.map +1 -0
  122. package/dist/runtime-package.js +132 -0
  123. package/dist/runtime-package.js.map +1 -0
  124. package/dist/slc.config.template.yaml +5 -0
  125. package/dist/verify-coverage.d.ts +99 -0
  126. package/dist/verify-coverage.d.ts.map +1 -0
  127. package/dist/verify-coverage.js +1949 -0
  128. package/dist/verify-coverage.js.map +1 -0
  129. package/dist/verify-support.d.ts +10 -0
  130. package/dist/verify-support.d.ts.map +1 -0
  131. package/dist/verify-support.js +52 -0
  132. package/dist/verify-support.js.map +1 -0
  133. package/dist/verify.d.ts +393 -0
  134. package/dist/verify.d.ts.map +1 -0
  135. package/dist/verify.js +1790 -0
  136. package/dist/verify.js.map +1 -0
  137. package/package.json +76 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-closure.js","sourceRoot":"","sources":["../src/pin-closure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type PinFile, type PinRecord } from './pins.js';
2
+ /** A per-phase pin-currency verdict (DR-007). */
3
+ export type PinVerdict = {
4
+ status: 'current';
5
+ } | {
6
+ status: 'stale';
7
+ reason: string;
8
+ } | {
9
+ status: 'malformed';
10
+ reason: string;
11
+ };
12
+ /** The result of evaluating a pipeline directory's pins (DR-007). */
13
+ export interface PinsResult {
14
+ /** Resolved `slc.pins.json` path; `undefined` when absent (every phase unpinned). */
15
+ path?: string;
16
+ /** Per-phase verdicts keyed by phase name; `undefined` when the file is absent. */
17
+ verdicts?: Record<string, PinVerdict>;
18
+ /** File-level malformed diagnostic (unparseable or invalid file); when set, no phase is current. */
19
+ malformed?: string;
20
+ }
21
+ /**
22
+ * Evaluates every pin in `<pipelineDir>/slc.pins.json` (PIN-1..PIN-6).
23
+ *
24
+ * @returns `{}` when the file is absent (no pins), `{ malformed }` when the file
25
+ * is unparseable or invalid at the file level, or `{ path, verdicts }` with a
26
+ * per-phase verdict otherwise.
27
+ */
28
+ export declare function evaluatePins(pipelineDir: string): Promise<PinsResult>;
29
+ /** Evaluates every record and prevents one malformed record from coexisting with a current one. */
30
+ export declare function evaluatePinFile(pipelineDir: string, file: PinFile): Promise<Record<string, PinVerdict>>;
31
+ /**
32
+ * Evaluates one phase's pin record against the committed files (PIN-2..PIN-6,
33
+ * PIN-13).
34
+ *
35
+ * Structural defects are reported as `malformed` before currency is judged, so a
36
+ * record that is both malformed and stale reports `malformed`.
37
+ */
38
+ export declare function evaluatePin(pipelineDir: string, file: PinFile, phase: string, record: PinRecord): Promise<PinVerdict>;
39
+ /**
40
+ * Checks the canonical reviewed bundle layout beside a linked playbook entry.
41
+ * The tree hash binds every byte; these required siblings ensure that the tree
42
+ * being reviewed is actually the runnable FSM/GEARS/verification bundle.
43
+ */
44
+ export declare function artifactBundleLayoutIssue(bundleRoot: string, artifactPath: string): Promise<string | null>;
45
+ /**
46
+ * Deterministic `sha256:` tree hash of a directory: every file's sorted relative
47
+ * POSIX path and exact-byte content hash, so any added, removed, renamed, or
48
+ * edited file changes the digest (DR-007).
49
+ */
50
+ export interface TreeHashOptions {
51
+ /** Artifact bundles reject links; generic directory/package identities record them. */
52
+ rejectSymlinks?: boolean;
53
+ }
54
+ export declare function hashTree(root: string, opts?: TreeHashOptions): Promise<string>;
55
+ //# sourceMappingURL=pin-currency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-currency.d.ts","sourceRoot":"","sources":["../src/pin-currency.ts"],"names":[],"mappings":"AAsCA,OAAO,EAIL,KAAK,OAAO,EAGZ,KAAK,SAAS,EAEf,MAAM,WAAW,CAAC;AAMnB,iDAAiD;AACjD,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiB3E;AAED,mGAAmG;AACnG,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAqBrC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,UAAU,CAAC,CAoHrB;AAyFD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxB;AAmJD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAkCD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
@@ -0,0 +1,435 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // SPDX-FileCopyrightText: 2026 SubLang International <https://sublang.ai>
3
+ /**
4
+ * Pin-currency engine: the per-phase verdict that drives compiled selection
5
+ * (PIN-1..PIN-6, PIN-13; DR-007).
6
+ *
7
+ * Given a pipeline directory, {@link evaluatePins} loads `slc.pins.json` and, for
8
+ * each pinned phase, combines the validator stages into a verdict: `current` when
9
+ * every recorded input matches, `stale` (naming the changed input) when a hash or
10
+ * the semantic-input closure no longer matches, and `malformed` (naming the
11
+ * field) when a recorded hash, path, external input, or link-target identity is
12
+ * structurally invalid or the pin file itself is unparseable. An absent
13
+ * `slc.pins.json` yields no verdicts — every phase is unpinned. Validation is
14
+ * deterministic and reads only committed bytes; it issues no network request. A
15
+ * file link target is verified by exact-byte hash and a directory or package
16
+ * target by a deterministic `sha256:` tree hash over its files' sorted relative
17
+ * paths and contents. Beyond existing and matching its recorded hash, the
18
+ * compiled artifact must resolve to the linked `playbook` format — a module
19
+ * exposing the runtime factory — or the phase is stale (PIN-13). See
20
+ * specs/dev/pinning.md.
21
+ */
22
+ import { lstat, readFile, readdir, readlink } from 'node:fs/promises';
23
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep, } from 'node:path';
24
+ import { hashBytes, hashFile, isHash } from './hash.js';
25
+ import { resolvesToPlaybook } from './phase-runner.js';
26
+ import { closureMatchesRecord } from './pin-closure.js';
27
+ import { resolvePinPath } from './pin-paths.js';
28
+ import { PinError, loadPinFile, } from './pins.js';
29
+ import { isBarePackageSpecifier, resolveRuntimePackage, } from './runtime-package.js';
30
+ /**
31
+ * Evaluates every pin in `<pipelineDir>/slc.pins.json` (PIN-1..PIN-6).
32
+ *
33
+ * @returns `{}` when the file is absent (no pins), `{ malformed }` when the file
34
+ * is unparseable or invalid at the file level, or `{ path, verdicts }` with a
35
+ * per-phase verdict otherwise.
36
+ */
37
+ export async function evaluatePins(pipelineDir) {
38
+ let loaded;
39
+ try {
40
+ loaded = await loadPinFile(pipelineDir);
41
+ }
42
+ catch (error) {
43
+ if (error instanceof PinError) {
44
+ return { malformed: error.message };
45
+ }
46
+ throw error;
47
+ }
48
+ if (loaded.file === undefined) {
49
+ return {};
50
+ }
51
+ const verdicts = await evaluatePinFile(pipelineDir, loaded.file);
52
+ return { path: loaded.path, verdicts };
53
+ }
54
+ /** Evaluates every record and prevents one malformed record from coexisting with a current one. */
55
+ export async function evaluatePinFile(pipelineDir, file) {
56
+ const verdicts = {};
57
+ for (const [phase, record] of Object.entries(file.pins)) {
58
+ verdicts[phase] = await evaluatePin(pipelineDir, file, phase, record);
59
+ }
60
+ const malformedPhase = Object.entries(verdicts).find(([, verdict]) => verdict.status === 'malformed');
61
+ if (malformedPhase !== undefined) {
62
+ const [phase, verdict] = malformedPhase;
63
+ const reason = `pin index contains malformed phase "${phase}": ${verdict.reason}`;
64
+ for (const [name, candidate] of Object.entries(verdicts)) {
65
+ if (candidate.status === 'current') {
66
+ verdicts[name] = malformed(reason);
67
+ }
68
+ }
69
+ }
70
+ return verdicts;
71
+ }
72
+ /**
73
+ * Evaluates one phase's pin record against the committed files (PIN-2..PIN-6,
74
+ * PIN-13).
75
+ *
76
+ * Structural defects are reported as `malformed` before currency is judged, so a
77
+ * record that is both malformed and stale reports `malformed`.
78
+ */
79
+ export async function evaluatePin(pipelineDir, file, phase, record) {
80
+ const boundary = file.pathBoundary.path;
81
+ try {
82
+ // Structural (malformed) checks first.
83
+ for (const [field, ref] of recordedFileRefs(record)) {
84
+ if (!isHash(ref.hash)) {
85
+ return malformed(`${field} hash is not a sha256 hash`);
86
+ }
87
+ }
88
+ if (!isHash(record.artifactBundle.hash)) {
89
+ return malformed('artifactBundle hash is not a sha256 hash');
90
+ }
91
+ const phaseMalformed = phaseRecordMalformed(phase, record);
92
+ if (phaseMalformed !== null) {
93
+ return malformed(phaseMalformed);
94
+ }
95
+ const linkMalformed = linkTargetMalformed(record.linkTarget);
96
+ if (linkMalformed !== null) {
97
+ return malformed(linkMalformed);
98
+ }
99
+ const externalMalformed = externalInputsMalformed(record.externalInputs);
100
+ if (externalMalformed !== null) {
101
+ return malformed(externalMalformed);
102
+ }
103
+ for (let index = 0; index < record.runtimeDependencies.length; index++) {
104
+ const dependencyMalformed = runtimeDependencyMalformed(record.runtimeDependencies[index], `runtimeDependencies[${index}]`);
105
+ if (dependencyMalformed !== null)
106
+ return malformed(dependencyMalformed);
107
+ }
108
+ const bundleMalformed = artifactBundleMalformed(pipelineDir, boundary, record);
109
+ if (bundleMalformed !== null) {
110
+ return malformed(bundleMalformed);
111
+ }
112
+ // Currency (stale) checks. resolvePinPath throws PinError for a bad path,
113
+ // which the catch below maps to malformed (PIN-5).
114
+ for (const [field, ref] of recordedFileRefs(record)) {
115
+ const reason = await fileStale(pipelineDir, boundary, ref, field);
116
+ if (reason !== null) {
117
+ return stale(reason);
118
+ }
119
+ }
120
+ const bundleReason = await treeStale(pipelineDir, boundary, record.artifactBundle, 'artifactBundle');
121
+ if (bundleReason !== null) {
122
+ return stale(bundleReason);
123
+ }
124
+ const bundleLayout = await artifactBundleLayoutIssue(resolvePinPath(pipelineDir, boundary, record.artifactBundle.path, 'artifactBundle'), resolvePinPath(pipelineDir, boundary, record.artifact.path, 'artifact'));
125
+ if (bundleLayout !== null) {
126
+ return stale(bundleLayout);
127
+ }
128
+ // The hash-verified artifact must resolve to the linked `phase` format (PIN-13).
129
+ const artifactFormat = await artifactFormatStale(pipelineDir, boundary, record.artifact);
130
+ if (artifactFormat !== null) {
131
+ return stale(artifactFormat);
132
+ }
133
+ if (!(await closureMatchesRecord(pipelineDir, boundary, record))) {
134
+ return stale("the semantic-input closure differs from the definition's ## Pin Inputs");
135
+ }
136
+ const linkStale = await linkTargetStale(pipelineDir, boundary, record.linkTarget);
137
+ if (linkStale !== null) {
138
+ return stale(linkStale);
139
+ }
140
+ for (let index = 0; index < record.runtimeDependencies.length; index++) {
141
+ const resolutionStale = runtimeDependencyResolutionStale(pipelineDir, boundary, record.artifact, record.runtimeDependencies[index], `runtimeDependencies[${index}]`);
142
+ if (resolutionStale !== null)
143
+ return stale(resolutionStale);
144
+ const dependencyStale = await linkTargetStale(pipelineDir, boundary, record.runtimeDependencies[index], `runtimeDependencies[${index}]`);
145
+ if (dependencyStale !== null)
146
+ return stale(dependencyStale);
147
+ }
148
+ return { status: 'current' };
149
+ }
150
+ catch (error) {
151
+ if (error instanceof PinError) {
152
+ return malformed(error.message);
153
+ }
154
+ throw error;
155
+ }
156
+ }
157
+ function phaseRecordMalformed(phase, record) {
158
+ const expectedDefinition = `${phase}.md`;
159
+ const expectedBundle = `${phase}.slc`;
160
+ const expectedArtifact = `${expectedBundle}/${phase}.playbook.ts`;
161
+ if (record.definition.path !== expectedDefinition) {
162
+ return `pin key "${phase}" requires definition path "${expectedDefinition}"`;
163
+ }
164
+ if (record.artifactBundle.path !== expectedBundle) {
165
+ return `pin key "${phase}" requires artifactBundle path "${expectedBundle}"`;
166
+ }
167
+ if (record.artifact.path !== expectedArtifact) {
168
+ return `pin key "${phase}" requires artifact path "${expectedArtifact}"`;
169
+ }
170
+ return null;
171
+ }
172
+ function* recordedFileRefs(record) {
173
+ yield ['definition', record.definition];
174
+ yield ['artifact', record.artifact];
175
+ for (const input of record.semanticInputs) {
176
+ yield [`semanticInput ${input.path}`, input];
177
+ }
178
+ }
179
+ async function fileStale(pipelineDir, boundary, ref, field) {
180
+ const resolved = resolvePinPath(pipelineDir, boundary, ref.path, field);
181
+ const current = await hashFileOrNull(resolved);
182
+ if (current === null) {
183
+ return `${field} is missing or unreadable (${ref.path})`;
184
+ }
185
+ if (current !== ref.hash) {
186
+ return `${field} changed (${ref.path})`;
187
+ }
188
+ return null;
189
+ }
190
+ async function treeStale(pipelineDir, boundary, ref, field) {
191
+ const resolved = resolvePinPath(pipelineDir, boundary, ref.path, field);
192
+ let current;
193
+ try {
194
+ current = await hashTree(resolved, { rejectSymlinks: true });
195
+ }
196
+ catch {
197
+ return `${field} is missing, unreadable, or contains an unsupported entry (${ref.path})`;
198
+ }
199
+ if (current !== ref.hash) {
200
+ return `${field} changed (${ref.path})`;
201
+ }
202
+ return null;
203
+ }
204
+ function artifactBundleMalformed(pipelineDir, boundary, record) {
205
+ const artifact = resolvePinPath(pipelineDir, boundary, record.artifact.path, 'artifact');
206
+ const bundle = resolvePinPath(pipelineDir, boundary, record.artifactBundle.path, 'artifactBundle');
207
+ const rel = relative(bundle, artifact);
208
+ return rel !== '' &&
209
+ rel !== '..' &&
210
+ !rel.startsWith(`..${sep}`) &&
211
+ !isAbsolute(rel) &&
212
+ dirname(rel) === '.'
213
+ ? null
214
+ : 'artifact must be a direct child of artifactBundle';
215
+ }
216
+ /**
217
+ * Checks the canonical reviewed bundle layout beside a linked playbook entry.
218
+ * The tree hash binds every byte; these required siblings ensure that the tree
219
+ * being reviewed is actually the runnable FSM/GEARS/verification bundle.
220
+ */
221
+ export async function artifactBundleLayoutIssue(bundleRoot, artifactPath) {
222
+ const entry = basename(artifactPath);
223
+ if (!entry.endsWith('.playbook.ts')) {
224
+ return `artifact is not a canonical .playbook.ts entry module (${entry})`;
225
+ }
226
+ const base = entry.slice(0, -'.playbook.ts'.length);
227
+ const required = [
228
+ `${base}.fsm.ts`,
229
+ `${base}.gears.md`,
230
+ `${base}.gears-fsm.test.ts`,
231
+ `${base}.fsm.introspect.test.ts`,
232
+ `${base}.prompt-contract.test.ts`,
233
+ `${base}.fsm.coverage.test.ts`,
234
+ ];
235
+ for (const sibling of required) {
236
+ try {
237
+ const info = await lstat(join(bundleRoot, sibling));
238
+ if (!info.isFile() || info.isSymbolicLink()) {
239
+ return `artifactBundle required sibling is not a regular file (${sibling})`;
240
+ }
241
+ }
242
+ catch {
243
+ return `artifactBundle is missing required sibling (${sibling})`;
244
+ }
245
+ }
246
+ return null;
247
+ }
248
+ /**
249
+ * Returns a stale reason when the compiled artifact's bytes do not resolve to the
250
+ * linked `playbook` format, or `null` when they do (PIN-13). The caller has already
251
+ * verified the artifact exists and matches its recorded hash.
252
+ */
253
+ async function artifactFormatStale(pipelineDir, boundary, artifact) {
254
+ const resolved = resolvePinPath(pipelineDir, boundary, artifact.path, 'artifact');
255
+ let source;
256
+ try {
257
+ source = await readFile(resolved, 'utf8');
258
+ }
259
+ catch {
260
+ return `artifact is unreadable (${artifact.path})`;
261
+ }
262
+ if (!resolved.endsWith('.playbook.ts')) {
263
+ return `artifact is not a linked playbook .playbook.ts entry module (${artifact.path})`;
264
+ }
265
+ if (!resolvesToPlaybook(source)) {
266
+ return `artifact does not resolve to the linked playbook format (${artifact.path})`;
267
+ }
268
+ return null;
269
+ }
270
+ function linkTargetMalformed(linkTarget, field = 'linkTarget') {
271
+ // The validator's link-target identity is a sha256 content hash (file) or
272
+ // sha256 tree hash (directory/package), so it must be `sha256:<hex>`.
273
+ if (!isHash(linkTarget.identity)) {
274
+ return `${field}.identity is not a sha256 hash`;
275
+ }
276
+ return null;
277
+ }
278
+ function runtimeDependencyMalformed(dependency, field) {
279
+ const targetMalformed = linkTargetMalformed(dependency, field);
280
+ if (targetMalformed !== null)
281
+ return targetMalformed;
282
+ if (dependency.kind === 'package' &&
283
+ (typeof dependency.specifier !== 'string' ||
284
+ !isBarePackageSpecifier(dependency.specifier))) {
285
+ return `${field}.specifier must be a bare package specifier`;
286
+ }
287
+ if (dependency.kind !== 'package' && dependency.specifier !== undefined) {
288
+ return `${field}.specifier is only valid for a package dependency`;
289
+ }
290
+ return null;
291
+ }
292
+ function runtimeDependencyResolutionStale(pipelineDir, boundary, artifact, dependency, field) {
293
+ if (dependency.kind !== 'package' || dependency.specifier === undefined) {
294
+ return null;
295
+ }
296
+ const artifactPath = resolvePinPath(pipelineDir, boundary, artifact.path, 'artifact');
297
+ const recordedRoot = resolvePinPath(pipelineDir, boundary, dependency.locator, `${field}.locator`);
298
+ let selectedRoot;
299
+ try {
300
+ selectedRoot = resolveRuntimePackage(artifactPath, dependency.specifier).root;
301
+ }
302
+ catch {
303
+ return `${field} import no longer resolves (${dependency.specifier})`;
304
+ }
305
+ return resolve(selectedRoot) === resolve(recordedRoot)
306
+ ? null
307
+ : `${field} resolution changed (${dependency.specifier})`;
308
+ }
309
+ async function linkTargetStale(pipelineDir, boundary, linkTarget, field = 'linkTarget') {
310
+ const resolved = resolvePinPath(pipelineDir, boundary, linkTarget.locator, `${field}.locator`);
311
+ const current = linkTarget.kind === 'file'
312
+ ? await hashFileOrNull(resolved)
313
+ : await hashTreeOrNull(resolved);
314
+ if (current === null) {
315
+ return `${field} is missing or unreadable (${linkTarget.locator})`;
316
+ }
317
+ if (current !== linkTarget.identity) {
318
+ return `${field} changed (${linkTarget.locator})`;
319
+ }
320
+ return null;
321
+ }
322
+ function externalInputsMalformed(externalInputs) {
323
+ for (let index = 0; index < externalInputs.length; index++) {
324
+ const identity = externalInputs[index].identity;
325
+ // A well-formed immutable content-addressed identity is the validator's own
326
+ // sha256:<hex> form; broader digest schemes await a future DR (DR-007).
327
+ if (typeof identity !== 'string' || !isHash(identity)) {
328
+ return `externalInputs[${index}] must carry a well-formed immutable content-addressed identity (sha256:<hex>), not a mutable reference`;
329
+ }
330
+ }
331
+ return null;
332
+ }
333
+ async function hashFileOrNull(resolved) {
334
+ try {
335
+ return await hashFile(resolved);
336
+ }
337
+ catch {
338
+ return null;
339
+ }
340
+ }
341
+ function canonicalJsonString(value) {
342
+ let serialized = '"';
343
+ for (const character of value) {
344
+ const codePoint = character.codePointAt(0);
345
+ if (codePoint === undefined)
346
+ continue;
347
+ if (codePoint >= 0xd800 && codePoint <= 0xdfff) {
348
+ throw new Error('tree entry contains an unpaired Unicode surrogate');
349
+ }
350
+ if (character === '"' || character === '\\') {
351
+ serialized += `\\${character}`;
352
+ }
353
+ else if (codePoint <= 0x1f) {
354
+ serialized += `\\u${codePoint.toString(16).padStart(4, '0')}`;
355
+ }
356
+ else {
357
+ serialized += character;
358
+ }
359
+ }
360
+ return `${serialized}"`;
361
+ }
362
+ function serializeTreeRecord(kind, path, identity) {
363
+ return `[${canonicalJsonString(kind)},${canonicalJsonString(path)},${canonicalJsonString(identity)}]`;
364
+ }
365
+ export async function hashTree(root, opts = {}) {
366
+ const rootInfo = await lstat(root);
367
+ const records = [];
368
+ if (rootInfo.isSymbolicLink()) {
369
+ if (opts.rejectSymlinks === true) {
370
+ throw new Error('tree root is a symbolic link');
371
+ }
372
+ records.push(await symlinkRecord(root, '.'));
373
+ }
374
+ else if (!rootInfo.isDirectory()) {
375
+ throw new Error('tree root is not a real directory');
376
+ }
377
+ await collectTreeRecords(root, '', records, opts);
378
+ records.sort((left, right) => Buffer.compare(Buffer.from(left.path, 'utf8'), Buffer.from(right.path, 'utf8')));
379
+ return hashBytes(new TextEncoder().encode(records.map((record) => record.serialized).join('\n')));
380
+ }
381
+ async function hashTreeOrNull(root) {
382
+ try {
383
+ return await hashTree(root);
384
+ }
385
+ catch {
386
+ return null;
387
+ }
388
+ }
389
+ async function collectTreeRecords(root, prefix, records, opts) {
390
+ const here = prefix ? join(root, ...prefix.split('/')) : root;
391
+ const entries = await readdir(here, {
392
+ withFileTypes: true,
393
+ encoding: 'buffer',
394
+ });
395
+ for (const entry of entries) {
396
+ const rawName = entry.name;
397
+ const name = rawName.toString('utf8');
398
+ if (!Buffer.from(name, 'utf8').equals(rawName)) {
399
+ throw new Error('tree contains a filename that is not valid UTF-8');
400
+ }
401
+ const rel = prefix ? `${prefix}/${name}` : name;
402
+ if (entry.isDirectory()) {
403
+ await collectTreeRecords(root, rel, records, opts);
404
+ }
405
+ else if (entry.isFile()) {
406
+ records.push({
407
+ path: rel,
408
+ serialized: serializeTreeRecord('file', rel, await hashFile(join(root, ...rel.split('/')))),
409
+ });
410
+ }
411
+ else if (entry.isSymbolicLink()) {
412
+ if (opts.rejectSymlinks === true) {
413
+ throw new Error(`tree contains a symbolic link: ${rel}`);
414
+ }
415
+ records.push(await symlinkRecord(join(root, ...rel.split('/')), rel));
416
+ }
417
+ else {
418
+ throw new Error(`tree contains an unsupported entry: ${rel}`);
419
+ }
420
+ }
421
+ }
422
+ async function symlinkRecord(path, relativePath) {
423
+ const target = await readlink(path, { encoding: 'buffer' });
424
+ return {
425
+ path: relativePath,
426
+ serialized: serializeTreeRecord('symlink', relativePath, target.toString('hex')),
427
+ };
428
+ }
429
+ function stale(reason) {
430
+ return { status: 'stale', reason };
431
+ }
432
+ function malformed(reason) {
433
+ return { status: 'malformed', reason };
434
+ }
435
+ //# sourceMappingURL=pin-currency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-currency.js","sourceRoot":"","sources":["../src/pin-currency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type PinExternalInput, type PinLinkTarget, type PinProducer, type PinRecord, type PinRuntimeDependency } from './pins.js';
2
+ /** The committed inputs that produced one compiled phase, to pin (DR-007). */
3
+ export interface PinSpec {
4
+ /** Pipeline-dir-relative path to the phase definition. */
5
+ definition: string;
6
+ /** Pipeline-dir-relative path to the compiled `.playbook.ts` entry module. */
7
+ artifact: string;
8
+ /** Pipeline-dir-relative directory containing the reviewed artifact and its local modules/tests. */
9
+ artifactBundle: string;
10
+ /** The link target the artifact was linked against. */
11
+ linkTarget: {
12
+ kind: PinLinkTarget['kind'];
13
+ locator: string;
14
+ provenance?: string;
15
+ };
16
+ /** Descriptive roles for semantic-input files, keyed by their pipeline-relative path. */
17
+ roles?: Readonly<Record<string, string>>;
18
+ /** Immutable content-addressed external inputs, if any. */
19
+ externalInputs?: readonly PinExternalInput[];
20
+ /** Local executable dependencies loaded by the compiled artifact. */
21
+ runtimeDependencies?: readonly Omit<PinRuntimeDependency, 'identity'>[];
22
+ /** Provenance of the producing run; never a currency input. */
23
+ producer?: PinProducer;
24
+ }
25
+ /** Options for pin generation (PIN-15). */
26
+ export interface PinGenerateOptions {
27
+ /**
28
+ * The recorded path boundary, a relative POSIX path from the pipeline
29
+ * directory; defaults to `.`. A wider boundary (e.g. `../..`) lets a pin
30
+ * record a link target outside the pipeline directory, such as the installed
31
+ * package module the artifacts were linked against.
32
+ */
33
+ boundary?: string;
34
+ }
35
+ /**
36
+ * Generates a current {@link PinRecord} for one phase from its committed inputs
37
+ * (PIN-15). The definition is recorded separately; the rest of its `## Pin Inputs`
38
+ * closure becomes the enumerated `semanticInputs`.
39
+ */
40
+ export declare function generatePinRecord(pipelineDir: string, spec: PinSpec, opts?: PinGenerateOptions): Promise<PinRecord>;
41
+ /**
42
+ * Writes the pin index `<pipelineDir>/slc.pins.json` for the given phase records
43
+ * and returns its path (PIN-15).
44
+ */
45
+ export declare function writePinFile(pipelineDir: string, pins: Readonly<Record<string, PinRecord>>, opts?: PinGenerateOptions): Promise<string>;
46
+ //# sourceMappingURL=pin-generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-generate.d.ts","sourceRoot":"","sources":["../src/pin-generate.ts"],"names":[],"mappings":"AAyBA,OAAO,EAKL,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,oBAAoB,EAC1B,MAAM,WAAW,CAAC;AAGnB,8EAA8E;AAC9E,MAAM,WAAW,OAAO;IACtB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB,oGAAoG;IACpG,cAAc,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,UAAU,EAAE;QACV,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,yFAAyF;IACzF,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,SAAS,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,EAAE,CAAC;IACxE,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAKD,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,SAAS,CAAC,CAoIpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EACzC,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAUjB"}