@usefragments/core 1.11.0 → 2.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/dist/{chunk-RPSEABY3.js → chunk-BMPYIUZE.js} +23 -33
- package/dist/chunk-BMPYIUZE.js.map +1 -0
- package/dist/{chunk-3LLRNCPX.js → chunk-MZ2FS7U4.js} +1 -1
- package/dist/chunk-MZ2FS7U4.js.map +1 -0
- package/dist/codes/index.d.ts +1 -1
- package/dist/codes/index.js +1 -1
- package/dist/compiled-types/index.d.ts +1 -1
- package/dist/generate/index.d.ts +1 -1
- package/dist/{governance-BAsy1k2H.d.ts → governance-hOPXGbbs.d.ts} +3 -3
- package/dist/index.d.ts +133 -6026
- package/dist/index.js +179 -806
- package/dist/index.js.map +1 -1
- package/dist/preview-runtime.d.ts +1 -1
- package/dist/react-types.d.ts +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/storyAdapter.d.ts +1 -1
- package/dist/test-utils.d.ts +1 -1
- package/dist/topology/index.d.ts +1 -1
- package/dist/topology/index.js +1 -1
- package/package.json +1 -1
- package/src/approved-contract-tokens.test.ts +39 -0
- package/src/approved-contract-tokens.ts +18 -0
- package/src/codes/__tests__/codes.test.ts +4 -0
- package/src/codes/codes.ts +10 -0
- package/src/domain-ids.test.ts +9 -26
- package/src/domain-ids.ts +0 -45
- package/src/evaluation/evaluate.ts +17 -7
- package/src/evaluation/evaluation-v2-receipt-v1.test.ts +20 -8
- package/src/evaluation/index.ts +1 -1
- package/src/governance.ts +18 -0
- package/src/index.ts +10 -79
- package/src/topology/resolve-area.ts +1 -1
- package/src/types.ts +0 -3
- package/dist/chunk-3LLRNCPX.js.map +0 -1
- package/dist/chunk-RPSEABY3.js.map +0 -1
- package/src/feature-plan/digest.ts +0 -217
- package/src/feature-plan/feature-plan-v1.test.ts +0 -529
- package/src/feature-plan/index.ts +0 -65
- package/src/feature-plan/types.ts +0 -628
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import { canonicalPreimage, compareCanonicalStrings, sha256Hex } from "../contract/hash.js";
|
|
2
|
-
import { featureRevisionIdFromDigest, type DigestHex } from "../domain-ids.js";
|
|
3
|
-
import {
|
|
4
|
-
AGENT_FEATURE_CONTEXT_MAX_BYTES_V1,
|
|
5
|
-
agentFeatureContextV1Schema as structuralAgentFeatureContextV1Schema,
|
|
6
|
-
approvedFeatureManifestInputV1Schema,
|
|
7
|
-
approvedFeatureManifestV1Schema,
|
|
8
|
-
featureProposalInputV1Schema,
|
|
9
|
-
featureProposalV1Schema,
|
|
10
|
-
type AgentFeatureContextV1,
|
|
11
|
-
type ApprovedFeatureManifestInputV1,
|
|
12
|
-
type ApprovedFeatureManifestV1,
|
|
13
|
-
type FeatureProposalInputV1,
|
|
14
|
-
type FeatureProposalV1,
|
|
15
|
-
} from "./types.js";
|
|
16
|
-
|
|
17
|
-
const sortedUnique = (values: readonly string[]): string[] => [...new Set(values)].sort();
|
|
18
|
-
|
|
19
|
-
function normalizeEvidenceRefs<T extends { evidenceRefIds: string[] }>(row: T): T {
|
|
20
|
-
return { ...row, evidenceRefIds: sortedUnique(row.evidenceRefIds) };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function normalizeCommon<
|
|
24
|
-
T extends {
|
|
25
|
-
placement: FeatureProposalInputV1["placement"];
|
|
26
|
-
componentUses: FeatureProposalInputV1["componentUses"];
|
|
27
|
-
tokenUses: FeatureProposalInputV1["tokenUses"];
|
|
28
|
-
patternUses: FeatureProposalInputV1["patternUses"];
|
|
29
|
-
layout: FeatureProposalInputV1["layout"];
|
|
30
|
-
responsive: FeatureProposalInputV1["responsive"];
|
|
31
|
-
scenarios: FeatureProposalInputV1["scenarios"];
|
|
32
|
-
gaps: FeatureProposalInputV1["gaps"];
|
|
33
|
-
acceptance: FeatureProposalInputV1["acceptance"];
|
|
34
|
-
evidenceRefs: FeatureProposalInputV1["evidenceRefs"];
|
|
35
|
-
},
|
|
36
|
-
>(value: T): T {
|
|
37
|
-
return {
|
|
38
|
-
...value,
|
|
39
|
-
placement: normalizeEvidenceRefs(value.placement),
|
|
40
|
-
componentUses: value.componentUses
|
|
41
|
-
.map(normalizeEvidenceRefs)
|
|
42
|
-
.sort((left, right) => compareCanonicalStrings(left.useId, right.useId)),
|
|
43
|
-
tokenUses: value.tokenUses
|
|
44
|
-
.map(normalizeEvidenceRefs)
|
|
45
|
-
.sort((left, right) => compareCanonicalStrings(left.useId, right.useId)),
|
|
46
|
-
patternUses: value.patternUses
|
|
47
|
-
.map(normalizeEvidenceRefs)
|
|
48
|
-
.sort((left, right) => compareCanonicalStrings(left.useId, right.useId)),
|
|
49
|
-
layout: {
|
|
50
|
-
concerns: value.layout.concerns
|
|
51
|
-
.map(normalizeEvidenceRefs)
|
|
52
|
-
.sort((left, right) => compareCanonicalStrings(left.concern, right.concern)),
|
|
53
|
-
},
|
|
54
|
-
responsive: value.responsive
|
|
55
|
-
.map(normalizeEvidenceRefs)
|
|
56
|
-
.sort((left, right) => compareCanonicalStrings(left.decisionId, right.decisionId)),
|
|
57
|
-
scenarios: value.scenarios
|
|
58
|
-
.map((scenario) => ({ ...scenario, acceptanceIds: sortedUnique(scenario.acceptanceIds) }))
|
|
59
|
-
.sort((left, right) => compareCanonicalStrings(left.scenarioId, right.scenarioId)),
|
|
60
|
-
gaps: value.gaps
|
|
61
|
-
.map(normalizeEvidenceRefs)
|
|
62
|
-
.sort((left, right) => compareCanonicalStrings(left.gapId, right.gapId)),
|
|
63
|
-
acceptance: value.acceptance
|
|
64
|
-
.map(normalizeEvidenceRefs)
|
|
65
|
-
.sort((left, right) => compareCanonicalStrings(left.acceptanceId, right.acceptanceId)),
|
|
66
|
-
evidenceRefs: [...value.evidenceRefs].sort((left, right) =>
|
|
67
|
-
compareCanonicalStrings(left.evidenceId, right.evidenceId)
|
|
68
|
-
),
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function normalizeFeatureProposalInputV1(
|
|
73
|
-
value: FeatureProposalInputV1
|
|
74
|
-
): FeatureProposalInputV1 {
|
|
75
|
-
const parsed = featureProposalInputV1Schema.parse(value);
|
|
76
|
-
return normalizeCommon({
|
|
77
|
-
...parsed,
|
|
78
|
-
questions: parsed.questions
|
|
79
|
-
.map((question) => ({ ...normalizeEvidenceRefs(question), options: [...question.options] }))
|
|
80
|
-
.sort((left, right) => compareCanonicalStrings(left.decisionId, right.decisionId)),
|
|
81
|
-
}) as FeatureProposalInputV1;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function proposalProjection(proposal: FeatureProposalInputV1): Record<string, unknown> {
|
|
85
|
-
return {
|
|
86
|
-
schema: "feature-revision.v1",
|
|
87
|
-
kind: proposal.kind,
|
|
88
|
-
planId: proposal.planId,
|
|
89
|
-
parentRevisionDigest: proposal.parentRevisionDigest,
|
|
90
|
-
pins: proposal.pins,
|
|
91
|
-
placement: proposal.placement,
|
|
92
|
-
componentUses: proposal.componentUses,
|
|
93
|
-
tokenUses: proposal.tokenUses,
|
|
94
|
-
patternUses: proposal.patternUses,
|
|
95
|
-
layout: proposal.layout,
|
|
96
|
-
responsive: proposal.responsive,
|
|
97
|
-
scenarios: proposal.scenarios,
|
|
98
|
-
gaps: proposal.gaps,
|
|
99
|
-
acceptance: proposal.acceptance,
|
|
100
|
-
questions: proposal.questions,
|
|
101
|
-
evidenceRefs: proposal.evidenceRefs,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export function featureProposalRevisionDigestV1(value: FeatureProposalInputV1): DigestHex {
|
|
106
|
-
const proposal = normalizeFeatureProposalInputV1(value);
|
|
107
|
-
return sha256Hex(canonicalPreimage(proposalProjection(proposal)));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export function buildFeatureProposalV1(value: FeatureProposalInputV1): FeatureProposalV1 {
|
|
111
|
-
const proposal = normalizeFeatureProposalInputV1(value);
|
|
112
|
-
const revisionDigest = sha256Hex(canonicalPreimage(proposalProjection(proposal)));
|
|
113
|
-
return featureProposalV1Schema.parse({
|
|
114
|
-
...proposal,
|
|
115
|
-
revisionId: featureRevisionIdFromDigest(revisionDigest),
|
|
116
|
-
revisionDigest,
|
|
117
|
-
}) as FeatureProposalV1;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export function parseFeatureProposalV1(value: unknown): FeatureProposalV1 {
|
|
121
|
-
const parsed = featureProposalV1Schema.parse(value);
|
|
122
|
-
const { revisionId, revisionDigest, ...input } = parsed;
|
|
123
|
-
const rebuilt = buildFeatureProposalV1(input as FeatureProposalInputV1);
|
|
124
|
-
if (revisionId !== rebuilt.revisionId || revisionDigest !== rebuilt.revisionDigest) {
|
|
125
|
-
throw new TypeError("Feature proposal derived identity does not match its semantic projection");
|
|
126
|
-
}
|
|
127
|
-
return rebuilt;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function normalizeApprovedFeatureManifestInputV1(
|
|
131
|
-
value: ApprovedFeatureManifestInputV1
|
|
132
|
-
): ApprovedFeatureManifestInputV1 {
|
|
133
|
-
const parsed = approvedFeatureManifestInputV1Schema.parse(value);
|
|
134
|
-
return normalizeCommon({
|
|
135
|
-
...parsed,
|
|
136
|
-
decisions: [...parsed.decisions].sort((left, right) =>
|
|
137
|
-
compareCanonicalStrings(left.decisionId, right.decisionId)
|
|
138
|
-
),
|
|
139
|
-
approval: { ...parsed.approval },
|
|
140
|
-
validatedGrounding: { ...parsed.validatedGrounding },
|
|
141
|
-
}) as ApprovedFeatureManifestInputV1;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function manifestProjection(manifest: ApprovedFeatureManifestInputV1): Record<string, unknown> {
|
|
145
|
-
return {
|
|
146
|
-
schema: "feature-revision.v1",
|
|
147
|
-
kind: manifest.kind,
|
|
148
|
-
planId: manifest.planId,
|
|
149
|
-
parentRevisionDigest: manifest.parentRevisionDigest,
|
|
150
|
-
proposalRevisionDigest: manifest.proposalRevisionDigest,
|
|
151
|
-
pins: manifest.pins,
|
|
152
|
-
validatedGrounding: manifest.validatedGrounding,
|
|
153
|
-
placement: manifest.placement,
|
|
154
|
-
componentUses: manifest.componentUses,
|
|
155
|
-
tokenUses: manifest.tokenUses,
|
|
156
|
-
patternUses: manifest.patternUses,
|
|
157
|
-
layout: manifest.layout,
|
|
158
|
-
responsive: manifest.responsive,
|
|
159
|
-
scenarios: manifest.scenarios,
|
|
160
|
-
gaps: manifest.gaps,
|
|
161
|
-
acceptance: manifest.acceptance,
|
|
162
|
-
evidenceRefs: manifest.evidenceRefs,
|
|
163
|
-
decisions: manifest.decisions,
|
|
164
|
-
approval: {
|
|
165
|
-
approverUserId: manifest.approval.approverUserId,
|
|
166
|
-
decisionDigest: manifest.approval.decisionDigest,
|
|
167
|
-
expiresAt: manifest.approval.expiresAt,
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export function approvedFeatureManifestRevisionDigestV1(
|
|
173
|
-
value: ApprovedFeatureManifestInputV1
|
|
174
|
-
): DigestHex {
|
|
175
|
-
const manifest = normalizeApprovedFeatureManifestInputV1(value);
|
|
176
|
-
return sha256Hex(canonicalPreimage(manifestProjection(manifest)));
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export function buildApprovedFeatureManifestV1(
|
|
180
|
-
value: ApprovedFeatureManifestInputV1
|
|
181
|
-
): ApprovedFeatureManifestV1 {
|
|
182
|
-
const manifest = normalizeApprovedFeatureManifestInputV1(value);
|
|
183
|
-
const revisionDigest = sha256Hex(canonicalPreimage(manifestProjection(manifest)));
|
|
184
|
-
return approvedFeatureManifestV1Schema.parse({
|
|
185
|
-
...manifest,
|
|
186
|
-
revisionId: featureRevisionIdFromDigest(revisionDigest),
|
|
187
|
-
revisionDigest,
|
|
188
|
-
}) as ApprovedFeatureManifestV1;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export function parseApprovedFeatureManifestV1(value: unknown): ApprovedFeatureManifestV1 {
|
|
192
|
-
const parsed = approvedFeatureManifestV1Schema.parse(value);
|
|
193
|
-
const { revisionId, revisionDigest, ...input } = parsed;
|
|
194
|
-
const rebuilt = buildApprovedFeatureManifestV1(input as ApprovedFeatureManifestInputV1);
|
|
195
|
-
if (revisionId !== rebuilt.revisionId || revisionDigest !== rebuilt.revisionDigest) {
|
|
196
|
-
throw new TypeError(
|
|
197
|
-
"Approved manifest derived identity does not match its semantic projection"
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
return rebuilt;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
export const agentFeatureContextV1Schema = structuralAgentFeatureContextV1Schema.superRefine(
|
|
204
|
-
(value, context) => {
|
|
205
|
-
const bytes = new TextEncoder().encode(canonicalPreimage(value)).byteLength;
|
|
206
|
-
if (bytes > AGENT_FEATURE_CONTEXT_MAX_BYTES_V1) {
|
|
207
|
-
context.addIssue({
|
|
208
|
-
code: "custom",
|
|
209
|
-
message: `Agent feature context exceeds ${AGENT_FEATURE_CONTEXT_MAX_BYTES_V1} UTF-8 bytes`,
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
);
|
|
214
|
-
|
|
215
|
-
export function parseAgentFeatureContextV1(value: unknown): AgentFeatureContextV1 {
|
|
216
|
-
return agentFeatureContextV1Schema.parse(value) as AgentFeatureContextV1;
|
|
217
|
-
}
|