@peac/schema 0.9.18 → 0.9.31

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 (50) hide show
  1. package/LICENSE +190 -0
  2. package/dist/agent-identity.d.ts +684 -0
  3. package/dist/agent-identity.d.ts.map +1 -0
  4. package/dist/agent-identity.js +357 -0
  5. package/dist/agent-identity.js.map +1 -0
  6. package/dist/attribution.d.ts +792 -0
  7. package/dist/attribution.d.ts.map +1 -0
  8. package/dist/attribution.js +444 -0
  9. package/dist/attribution.js.map +1 -0
  10. package/dist/constants.d.ts +15 -0
  11. package/dist/constants.d.ts.map +1 -1
  12. package/dist/constants.js +16 -1
  13. package/dist/constants.js.map +1 -1
  14. package/dist/control.d.ts +2 -1
  15. package/dist/control.d.ts.map +1 -1
  16. package/dist/dispute.d.ts +1279 -0
  17. package/dist/dispute.d.ts.map +1 -0
  18. package/dist/dispute.js +832 -0
  19. package/dist/dispute.js.map +1 -0
  20. package/dist/envelope.d.ts +14 -7
  21. package/dist/envelope.d.ts.map +1 -1
  22. package/dist/errors.d.ts +19 -8
  23. package/dist/errors.d.ts.map +1 -1
  24. package/dist/errors.js +35 -7
  25. package/dist/errors.js.map +1 -1
  26. package/dist/evidence.d.ts +127 -3
  27. package/dist/evidence.d.ts.map +1 -1
  28. package/dist/index.d.ts +17 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +133 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/json.d.ts +114 -0
  33. package/dist/json.d.ts.map +1 -0
  34. package/dist/json.js +267 -0
  35. package/dist/json.js.map +1 -0
  36. package/dist/obligations.d.ts +364 -0
  37. package/dist/obligations.d.ts.map +1 -0
  38. package/dist/obligations.js +337 -0
  39. package/dist/obligations.js.map +1 -0
  40. package/dist/purpose.d.ts +272 -0
  41. package/dist/purpose.d.ts.map +1 -0
  42. package/dist/purpose.js +296 -0
  43. package/dist/purpose.js.map +1 -0
  44. package/dist/types.d.ts +22 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/validators.d.ts +316 -50
  47. package/dist/validators.d.ts.map +1 -1
  48. package/dist/validators.js +138 -7
  49. package/dist/validators.js.map +1 -1
  50. package/package.json +10 -10
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ /**
3
+ * PEAC Purpose Types (v0.9.24+)
4
+ *
5
+ * Purpose type hierarchy for forward-compatible purpose handling:
6
+ * - PurposeToken: Wire format (string) - preserves unknown tokens
7
+ * - CanonicalPurpose: PEAC's normative vocabulary - enforcement semantics
8
+ * - PurposeReason: Audit spine for enforcement decisions
9
+ *
10
+ * @see specs/kernel/constants.json for canonical values
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.INTERNAL_PURPOSE_UNDECLARED = exports.PURPOSE_REASONS = exports.CANONICAL_PURPOSES = exports.MAX_PURPOSE_TOKENS_PER_REQUEST = exports.MAX_PURPOSE_TOKEN_LENGTH = exports.PURPOSE_TOKEN_REGEX = void 0;
14
+ exports.isValidPurposeToken = isValidPurposeToken;
15
+ exports.isCanonicalPurpose = isCanonicalPurpose;
16
+ exports.isLegacyPurpose = isLegacyPurpose;
17
+ exports.isValidPurposeReason = isValidPurposeReason;
18
+ exports.isUndeclaredPurpose = isUndeclaredPurpose;
19
+ exports.normalizePurposeToken = normalizePurposeToken;
20
+ exports.parsePurposeHeader = parsePurposeHeader;
21
+ exports.validatePurposeTokens = validatePurposeTokens;
22
+ exports.deriveKnownPurposes = deriveKnownPurposes;
23
+ exports.mapLegacyToCanonical = mapLegacyToCanonical;
24
+ exports.normalizeToCanonicalOrPreserve = normalizeToCanonicalOrPreserve;
25
+ exports.determinePurposeReason = determinePurposeReason;
26
+ exports.hasUnknownPurposeTokens = hasUnknownPurposeTokens;
27
+ // ============================================================================
28
+ // Validation Constants
29
+ // ============================================================================
30
+ /**
31
+ * Grammar validation for PurposeToken
32
+ *
33
+ * Pattern: lowercase letter, optionally followed by alphanumeric/underscore/hyphen
34
+ * characters that MUST end with a letter or digit (no trailing separators).
35
+ * Optional vendor prefix separated by colon follows the same rules.
36
+ *
37
+ * Hyphens are allowed for interoperability with external systems (Cloudflare,
38
+ * IETF AIPREF, etc.) that use hyphenated tokens like "user-action" or "train-ai".
39
+ *
40
+ * Valid: "train", "user_action", "user-action", "cf:ai_crawler", "cf:ai-crawler", "a", "a1"
41
+ * Invalid: "Train", "123abc", "", "-train", "train-", "train_", "cf:ai-", "cf:-ai"
42
+ */
43
+ exports.PURPOSE_TOKEN_REGEX = /^[a-z](?:[a-z0-9_-]*[a-z0-9])?(?::[a-z](?:[a-z0-9_-]*[a-z0-9])?)?$/;
44
+ /** Maximum length for a purpose token */
45
+ exports.MAX_PURPOSE_TOKEN_LENGTH = 64;
46
+ /** Maximum number of purpose tokens per request (RECOMMENDED, not MUST) */
47
+ exports.MAX_PURPOSE_TOKENS_PER_REQUEST = 10;
48
+ /** Canonical purpose tokens (from constants.json) */
49
+ exports.CANONICAL_PURPOSES = [
50
+ 'train',
51
+ 'search',
52
+ 'user_action',
53
+ 'inference',
54
+ 'index',
55
+ ];
56
+ /** Purpose reason values (from constants.json) */
57
+ exports.PURPOSE_REASONS = [
58
+ 'allowed',
59
+ 'constrained',
60
+ 'denied',
61
+ 'downgraded',
62
+ 'undeclared_default',
63
+ 'unknown_preserved',
64
+ ];
65
+ /** Internal-only purpose value */
66
+ exports.INTERNAL_PURPOSE_UNDECLARED = 'undeclared';
67
+ // ============================================================================
68
+ // Validation Functions
69
+ // ============================================================================
70
+ /**
71
+ * Check if a string is a valid PurposeToken
72
+ *
73
+ * Validates against the purpose token grammar:
74
+ * - Lowercase letters, digits, underscores, hyphens
75
+ * - Optional vendor prefix with colon
76
+ * - Max 64 characters
77
+ * - Must start with lowercase letter
78
+ *
79
+ * @param token - String to validate
80
+ * @returns true if valid PurposeToken
81
+ */
82
+ function isValidPurposeToken(token) {
83
+ if (typeof token !== 'string')
84
+ return false;
85
+ if (token.length === 0 || token.length > exports.MAX_PURPOSE_TOKEN_LENGTH)
86
+ return false;
87
+ return exports.PURPOSE_TOKEN_REGEX.test(token);
88
+ }
89
+ /**
90
+ * Check if a PurposeToken is a CanonicalPurpose
91
+ *
92
+ * @param token - Token to check
93
+ * @returns true if token is in canonical vocabulary
94
+ */
95
+ function isCanonicalPurpose(token) {
96
+ return exports.CANONICAL_PURPOSES.includes(token);
97
+ }
98
+ /**
99
+ * Check if a PurposeToken is a LegacyPurpose
100
+ *
101
+ * @param token - Token to check
102
+ * @returns true if token is a legacy purpose
103
+ */
104
+ function isLegacyPurpose(token) {
105
+ return token === 'crawl' || token === 'ai_input' || token === 'ai_index';
106
+ }
107
+ /**
108
+ * Check if a string is a valid PurposeReason
109
+ *
110
+ * @param reason - String to check
111
+ * @returns true if valid PurposeReason
112
+ */
113
+ function isValidPurposeReason(reason) {
114
+ return exports.PURPOSE_REASONS.includes(reason);
115
+ }
116
+ /**
117
+ * Check if a purpose token is the internal-only "undeclared" value
118
+ *
119
+ * Used to reject explicit "undeclared" on wire (400 Bad Request).
120
+ *
121
+ * @param token - Token to check
122
+ * @returns true if token is "undeclared"
123
+ */
124
+ function isUndeclaredPurpose(token) {
125
+ return token === exports.INTERNAL_PURPOSE_UNDECLARED;
126
+ }
127
+ // ============================================================================
128
+ // Normalization Functions
129
+ // ============================================================================
130
+ /**
131
+ * Normalize a purpose token
132
+ *
133
+ * Applies normalization rules:
134
+ * - Trim whitespace
135
+ * - Lowercase
136
+ *
137
+ * @param token - Raw token from header
138
+ * @returns Normalized token
139
+ */
140
+ function normalizePurposeToken(token) {
141
+ return token.trim().toLowerCase();
142
+ }
143
+ /**
144
+ * Parse PEAC-Purpose header value into array of tokens
145
+ *
146
+ * Applies parsing rules:
147
+ * - Split on commas
148
+ * - Trim optional whitespace (OWS) around tokens
149
+ * - Lowercase all tokens
150
+ * - Drop empty tokens
151
+ * - Deduplicate
152
+ * - Preserve input order
153
+ *
154
+ * @param headerValue - Raw PEAC-Purpose header value
155
+ * @returns Array of normalized PurposeToken values
156
+ */
157
+ function parsePurposeHeader(headerValue) {
158
+ if (!headerValue || typeof headerValue !== 'string') {
159
+ return [];
160
+ }
161
+ const seen = new Set();
162
+ const tokens = [];
163
+ for (const part of headerValue.split(',')) {
164
+ const normalized = normalizePurposeToken(part);
165
+ if (normalized.length > 0 && !seen.has(normalized)) {
166
+ seen.add(normalized);
167
+ tokens.push(normalized);
168
+ }
169
+ }
170
+ return tokens;
171
+ }
172
+ function validatePurposeTokens(tokens) {
173
+ const invalidTokens = [];
174
+ let undeclaredPresent = false;
175
+ for (const token of tokens) {
176
+ if (isUndeclaredPurpose(token)) {
177
+ undeclaredPresent = true;
178
+ }
179
+ if (!isValidPurposeToken(token)) {
180
+ invalidTokens.push(token);
181
+ }
182
+ }
183
+ return {
184
+ valid: invalidTokens.length === 0 && !undeclaredPresent,
185
+ tokens,
186
+ invalidTokens,
187
+ undeclaredPresent,
188
+ };
189
+ }
190
+ /**
191
+ * Derive known canonical purposes from declared tokens
192
+ *
193
+ * Filters purpose_declared to get only canonical purposes.
194
+ * This is a helper derivation, NOT stored on wire.
195
+ *
196
+ * @param declared - Array of declared PurposeTokens
197
+ * @returns Array of CanonicalPurpose tokens
198
+ */
199
+ function deriveKnownPurposes(declared) {
200
+ return declared.filter(isCanonicalPurpose);
201
+ }
202
+ // ============================================================================
203
+ // Legacy Mapping
204
+ // ============================================================================
205
+ /**
206
+ * Legacy purpose to canonical mapping
207
+ */
208
+ const LEGACY_TO_CANONICAL = {
209
+ crawl: 'index', // Crawl implies indexing
210
+ ai_input: 'inference', // RAG/grounding -> inference context
211
+ ai_index: 'index', // AI-powered indexing -> index
212
+ };
213
+ function mapLegacyToCanonical(legacy) {
214
+ const canonical = LEGACY_TO_CANONICAL[legacy];
215
+ return {
216
+ canonical,
217
+ mapping_note: `Mapped legacy '${legacy}' to canonical '${canonical}'`,
218
+ };
219
+ }
220
+ /**
221
+ * Normalize any purpose token (canonical, legacy, or unknown)
222
+ *
223
+ * Returns the canonical form if known, otherwise preserves the token.
224
+ *
225
+ * @param token - Any valid PurposeToken
226
+ * @returns Canonical purpose if mapped, otherwise original token
227
+ */
228
+ function normalizeToCanonicalOrPreserve(token) {
229
+ if (isCanonicalPurpose(token)) {
230
+ return { purpose: token, mapped: false };
231
+ }
232
+ if (isLegacyPurpose(token)) {
233
+ return { purpose: LEGACY_TO_CANONICAL[token], mapped: true, from: token };
234
+ }
235
+ return { purpose: token, mapped: false, unknown: true };
236
+ }
237
+ /**
238
+ * Determine the appropriate PurposeReason based on context
239
+ *
240
+ * This helper implements the decision logic for the audit spine:
241
+ * 1. If no purposes declared -> 'undeclared_default'
242
+ * 2. If unknown tokens present -> 'unknown_preserved'
243
+ * 3. Otherwise -> maps to policy decision
244
+ *
245
+ * @param context - Context for determination
246
+ * @returns The appropriate PurposeReason for the audit spine
247
+ *
248
+ * @example
249
+ * ```typescript
250
+ * // Missing PEAC-Purpose header
251
+ * determinePurposeReason({ declared: false, hasUnknownTokens: false });
252
+ * // => 'undeclared_default'
253
+ *
254
+ * // Has vendor-prefixed tokens
255
+ * determinePurposeReason({ declared: true, hasUnknownTokens: true, decision: 'allowed' });
256
+ * // => 'unknown_preserved'
257
+ *
258
+ * // All canonical tokens, allowed by policy
259
+ * determinePurposeReason({ declared: true, hasUnknownTokens: false, decision: 'allowed' });
260
+ * // => 'allowed'
261
+ * ```
262
+ */
263
+ function determinePurposeReason(context) {
264
+ // Priority 1: No purposes declared
265
+ if (!context.declared) {
266
+ return 'undeclared_default';
267
+ }
268
+ // Priority 2: Unknown tokens present (preserved for forward-compat)
269
+ if (context.hasUnknownTokens) {
270
+ return 'unknown_preserved';
271
+ }
272
+ // Priority 3: Map policy decision to reason
273
+ const decision = context.decision ?? 'allowed';
274
+ switch (decision) {
275
+ case 'allowed':
276
+ return 'allowed';
277
+ case 'constrained':
278
+ return 'constrained';
279
+ case 'denied':
280
+ return 'denied';
281
+ case 'downgraded':
282
+ return 'downgraded';
283
+ default:
284
+ return 'allowed';
285
+ }
286
+ }
287
+ /**
288
+ * Check if any tokens in an array are unknown (non-canonical)
289
+ *
290
+ * @param tokens - Array of purpose tokens
291
+ * @returns true if any token is not a canonical purpose
292
+ */
293
+ function hasUnknownPurposeTokens(tokens) {
294
+ return tokens.some((token) => !isCanonicalPurpose(token));
295
+ }
296
+ //# sourceMappingURL=purpose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purpose.js","sourceRoot":"","sources":["../src/purpose.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  import { PEAC_WIRE_TYP, PEAC_ALG } from './constants';
5
5
  import type { ControlBlock } from './control';
6
6
  import type { PaymentEvidence } from './evidence';
7
+ import type { PurposeToken, CanonicalPurpose, PurposeReason } from './purpose';
7
8
  /**
8
9
  * Subject of the receipt (what was paid for)
9
10
  */
@@ -66,6 +67,27 @@ export interface PEACReceiptClaims {
66
67
  subject?: Subject;
67
68
  /** Extensions (additive-only) */
68
69
  ext?: ReceiptExtensions;
70
+ /**
71
+ * Purposes declared by requester (v0.9.24+)
72
+ *
73
+ * ALWAYS array, even for single purpose: ["train"]
74
+ * Empty array if header missing/empty (internal 'undeclared' state)
75
+ * Uses PurposeToken (string) to preserve unknown tokens (forward-compat)
76
+ */
77
+ purpose_declared?: PurposeToken[];
78
+ /**
79
+ * Single purpose enforced by policy (v0.9.24+)
80
+ *
81
+ * MUST be one of declared purposes OR a downgrade
82
+ * Uses CanonicalPurpose (enforcement requires semantics)
83
+ */
84
+ purpose_enforced?: CanonicalPurpose;
85
+ /**
86
+ * Reason for enforcement decision (v0.9.24+)
87
+ *
88
+ * The audit spine - explains WHY purpose was enforced as it was
89
+ */
90
+ purpose_reason?: PurposeReason;
69
91
  }
70
92
  /**
71
93
  * Complete PEAC Receipt (header + claims)
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}