@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.
Files changed (39) hide show
  1. package/dist/{chunk-RPSEABY3.js → chunk-BMPYIUZE.js} +23 -33
  2. package/dist/chunk-BMPYIUZE.js.map +1 -0
  3. package/dist/{chunk-3LLRNCPX.js → chunk-MZ2FS7U4.js} +1 -1
  4. package/dist/chunk-MZ2FS7U4.js.map +1 -0
  5. package/dist/codes/index.d.ts +1 -1
  6. package/dist/codes/index.js +1 -1
  7. package/dist/compiled-types/index.d.ts +1 -1
  8. package/dist/generate/index.d.ts +1 -1
  9. package/dist/{governance-BAsy1k2H.d.ts → governance-hOPXGbbs.d.ts} +3 -3
  10. package/dist/index.d.ts +133 -6026
  11. package/dist/index.js +179 -806
  12. package/dist/index.js.map +1 -1
  13. package/dist/preview-runtime.d.ts +1 -1
  14. package/dist/react-types.d.ts +1 -1
  15. package/dist/schemas/index.js +1 -1
  16. package/dist/storyAdapter.d.ts +1 -1
  17. package/dist/test-utils.d.ts +1 -1
  18. package/dist/topology/index.d.ts +1 -1
  19. package/dist/topology/index.js +1 -1
  20. package/package.json +1 -1
  21. package/src/approved-contract-tokens.test.ts +39 -0
  22. package/src/approved-contract-tokens.ts +18 -0
  23. package/src/codes/__tests__/codes.test.ts +4 -0
  24. package/src/codes/codes.ts +10 -0
  25. package/src/domain-ids.test.ts +9 -26
  26. package/src/domain-ids.ts +0 -45
  27. package/src/evaluation/evaluate.ts +17 -7
  28. package/src/evaluation/evaluation-v2-receipt-v1.test.ts +20 -8
  29. package/src/evaluation/index.ts +1 -1
  30. package/src/governance.ts +18 -0
  31. package/src/index.ts +10 -79
  32. package/src/topology/resolve-area.ts +1 -1
  33. package/src/types.ts +0 -3
  34. package/dist/chunk-3LLRNCPX.js.map +0 -1
  35. package/dist/chunk-RPSEABY3.js.map +0 -1
  36. package/src/feature-plan/digest.ts +0 -217
  37. package/src/feature-plan/feature-plan-v1.test.ts +0 -529
  38. package/src/feature-plan/index.ts +0 -65
  39. 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
- }