@fides-anima/fpp-protocol-core 1.0.2

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 (101) hide show
  1. package/LICENSE +95 -0
  2. package/README.md +41 -0
  3. package/SKILL.md +348 -0
  4. package/constitution.json +102 -0
  5. package/constitution.yaml +106 -0
  6. package/dist/adoption-disclosure.d.ts +35 -0
  7. package/dist/adoption-disclosure.d.ts.map +1 -0
  8. package/dist/adoption-disclosure.js +67 -0
  9. package/dist/adoption-disclosure.js.map +1 -0
  10. package/dist/adoption.d.ts +56 -0
  11. package/dist/adoption.d.ts.map +1 -0
  12. package/dist/adoption.js +97 -0
  13. package/dist/adoption.js.map +1 -0
  14. package/dist/canonical-json.d.ts +23 -0
  15. package/dist/canonical-json.d.ts.map +1 -0
  16. package/dist/canonical-json.js +60 -0
  17. package/dist/canonical-json.js.map +1 -0
  18. package/dist/capsules.d.ts +63 -0
  19. package/dist/capsules.d.ts.map +1 -0
  20. package/dist/capsules.js +94 -0
  21. package/dist/capsules.js.map +1 -0
  22. package/dist/claims.d.ts +62 -0
  23. package/dist/claims.d.ts.map +1 -0
  24. package/dist/claims.js +99 -0
  25. package/dist/claims.js.map +1 -0
  26. package/dist/digest.d.ts +38 -0
  27. package/dist/digest.d.ts.map +1 -0
  28. package/dist/digest.js +52 -0
  29. package/dist/digest.js.map +1 -0
  30. package/dist/disposition.d.ts +34 -0
  31. package/dist/disposition.d.ts.map +1 -0
  32. package/dist/disposition.js +51 -0
  33. package/dist/disposition.js.map +1 -0
  34. package/dist/emergency-override.d.ts +73 -0
  35. package/dist/emergency-override.d.ts.map +1 -0
  36. package/dist/emergency-override.js +102 -0
  37. package/dist/emergency-override.js.map +1 -0
  38. package/dist/evidence.d.ts +25 -0
  39. package/dist/evidence.d.ts.map +1 -0
  40. package/dist/evidence.js +30 -0
  41. package/dist/evidence.js.map +1 -0
  42. package/dist/freshness.d.ts +41 -0
  43. package/dist/freshness.d.ts.map +1 -0
  44. package/dist/freshness.js +66 -0
  45. package/dist/freshness.js.map +1 -0
  46. package/dist/governance.d.ts +87 -0
  47. package/dist/governance.d.ts.map +1 -0
  48. package/dist/governance.js +94 -0
  49. package/dist/governance.js.map +1 -0
  50. package/dist/identity.d.ts +43 -0
  51. package/dist/identity.d.ts.map +1 -0
  52. package/dist/identity.js +93 -0
  53. package/dist/identity.js.map +1 -0
  54. package/dist/index.d.ts +30 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +30 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/mandates.d.ts +80 -0
  59. package/dist/mandates.d.ts.map +1 -0
  60. package/dist/mandates.js +127 -0
  61. package/dist/mandates.js.map +1 -0
  62. package/dist/merkle.d.ts +31 -0
  63. package/dist/merkle.d.ts.map +1 -0
  64. package/dist/merkle.js +95 -0
  65. package/dist/merkle.js.map +1 -0
  66. package/dist/quorum.d.ts +133 -0
  67. package/dist/quorum.d.ts.map +1 -0
  68. package/dist/quorum.js +128 -0
  69. package/dist/quorum.js.map +1 -0
  70. package/dist/receipts.d.ts +77 -0
  71. package/dist/receipts.d.ts.map +1 -0
  72. package/dist/receipts.js +104 -0
  73. package/dist/receipts.js.map +1 -0
  74. package/dist/steward-authorization.d.ts +200 -0
  75. package/dist/steward-authorization.d.ts.map +1 -0
  76. package/dist/steward-authorization.js +483 -0
  77. package/dist/steward-authorization.js.map +1 -0
  78. package/dist/workspace-profile.d.ts +43 -0
  79. package/dist/workspace-profile.d.ts.map +1 -0
  80. package/dist/workspace-profile.js +91 -0
  81. package/dist/workspace-profile.js.map +1 -0
  82. package/package.json +56 -0
  83. package/src/adoption-disclosure.ts +120 -0
  84. package/src/adoption.ts +152 -0
  85. package/src/canonical-json.ts +70 -0
  86. package/src/capsules.ts +161 -0
  87. package/src/claims.ts +147 -0
  88. package/src/digest.ts +63 -0
  89. package/src/disposition.ts +74 -0
  90. package/src/emergency-override.ts +168 -0
  91. package/src/evidence.ts +48 -0
  92. package/src/freshness.ts +103 -0
  93. package/src/governance.ts +152 -0
  94. package/src/identity.ts +119 -0
  95. package/src/index.ts +270 -0
  96. package/src/mandates.ts +201 -0
  97. package/src/merkle.ts +138 -0
  98. package/src/quorum.ts +193 -0
  99. package/src/receipts.ts +150 -0
  100. package/src/steward-authorization.ts +657 -0
  101. package/src/workspace-profile.ts +134 -0
@@ -0,0 +1,483 @@
1
+ /**
2
+ * Steward / operator authorization wire contracts.
3
+ *
4
+ * Key-independent human steward identity and OpenPGP-signed authorization
5
+ * payloads. Verification backends live in `@fides-anima/fpp-steward-auth-core`;
6
+ * this module defines schemas, mint/parse helpers, and domain digests only.
7
+ */
8
+ import { randomBytes } from "node:crypto";
9
+ import { Type } from "@sinclair/typebox";
10
+ import { Value } from "@sinclair/typebox/value";
11
+ import { digest } from "./digest.js";
12
+ /** RFC 4648 base32 alphabet (lowercase, no padding). */
13
+ const BASE32_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
14
+ const STEWARD_ID_RE = /^fpp:steward:v1:([a-z2-7]{26})$/;
15
+ /** OpenPGP V4 fingerprint is 40 hex chars; V5 is 64. Accept both lowercase. */
16
+ const OPENPGP_KEY_REF_RE = /^openpgp:([0-9a-f]{40}|[0-9a-f]{64})$/;
17
+ /** High-entropy nonce: ≥32 chars of base64url / hex / base32. */
18
+ const NONCE_RE = /^[A-Za-z0-9_-]{32,128}$/;
19
+ const ISO_8601_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/;
20
+ /** Classifications that operator authority must never satisfy. */
21
+ const NON_DELEGABLE_CLASSIFICATIONS = new Set([
22
+ "affected-party-consent",
23
+ "data-subject-consent",
24
+ "constitutional-ratification",
25
+ ]);
26
+ /**
27
+ * Domain separators for steward digests (not credentials).
28
+ * Object key is `authz` (not the secret-scanner trigger name) so static
29
+ * analyzers do not treat the domain string as an exposed API token.
30
+ */
31
+ export const STEWARD_DIGEST_DOMAINS = {
32
+ evidence: "fpp:v2:steward-evidence",
33
+ replay: "fpp:v2:steward-replay",
34
+ attestation: "fpp:v2:steward-attestation",
35
+ authz: "fpp:v2:steward-authorization",
36
+ revocation: "fpp:v2:steward-authorization-revocation",
37
+ };
38
+ function encodeBase32(bytes) {
39
+ let bits = 0;
40
+ let value = 0;
41
+ let output = "";
42
+ for (const byte of bytes) {
43
+ value = (value << 8) | byte;
44
+ bits += 8;
45
+ while (bits >= 5) {
46
+ output += BASE32_ALPHABET[(value >>> (bits - 5)) & 31];
47
+ bits -= 5;
48
+ }
49
+ }
50
+ if (bits > 0) {
51
+ output += BASE32_ALPHABET[(value << (5 - bits)) & 31];
52
+ }
53
+ return output;
54
+ }
55
+ /** Mint a key-independent steward ID from 128 random bits. */
56
+ export function mintStewardIdV1() {
57
+ const body = encodeBase32(randomBytes(16));
58
+ return `fpp:steward:v1:${body}`;
59
+ }
60
+ export function isStewardIdV1(value) {
61
+ return typeof value === "string" && STEWARD_ID_RE.test(value);
62
+ }
63
+ export function parseStewardIdV1(value) {
64
+ if (typeof value !== "string") {
65
+ return { ok: false, error: "steward id must be a string" };
66
+ }
67
+ const match = STEWARD_ID_RE.exec(value);
68
+ if (!match) {
69
+ return {
70
+ ok: false,
71
+ error: "steward id must be fpp:steward:v1:<26 lowercase base32 chars>",
72
+ };
73
+ }
74
+ return {
75
+ ok: true,
76
+ stewardId: {
77
+ kind: "v1",
78
+ raw: value,
79
+ idBody: match[1],
80
+ },
81
+ };
82
+ }
83
+ export const KeyRefSchema = Type.String({
84
+ minLength: 1,
85
+ pattern: "^[a-z0-9]+:[a-z0-9]+$",
86
+ });
87
+ export function parseKeyRef(value) {
88
+ if (typeof value !== "string") {
89
+ return { ok: false, error: "key ref must be a string" };
90
+ }
91
+ const openpgp = OPENPGP_KEY_REF_RE.exec(value);
92
+ if (openpgp) {
93
+ return {
94
+ ok: true,
95
+ keyRef: {
96
+ algorithm: "openpgp",
97
+ identifier: openpgp[1],
98
+ raw: value,
99
+ },
100
+ };
101
+ }
102
+ // Future algorithms: algorithm:identifier with lowercase identifier body.
103
+ const generic = /^([a-z][a-z0-9]*):([a-z0-9]{8,128})$/.exec(value);
104
+ if (generic && generic[1] !== "openpgp") {
105
+ return {
106
+ ok: true,
107
+ keyRef: {
108
+ algorithm: generic[1],
109
+ identifier: generic[2],
110
+ raw: value,
111
+ },
112
+ };
113
+ }
114
+ return {
115
+ ok: false,
116
+ error: "key ref must be algorithm-qualified (e.g. openpgp:<lowercase fingerprint>)",
117
+ };
118
+ }
119
+ const StewardSubjectKeySchema = Type.Object({
120
+ algorithm: Type.String({ minLength: 1 }),
121
+ keyRef: Type.String({ minLength: 1 }),
122
+ publicKeyArmored: Type.Optional(Type.String({ minLength: 1 })),
123
+ }, { additionalProperties: false });
124
+ export const StewardKeyAttestationV1Schema = Type.Object({
125
+ schemaVersion: Type.Literal(1),
126
+ kind: Type.Literal("steward-key-attestation"),
127
+ attestationId: Type.String({ minLength: 1 }),
128
+ operation: Type.Union([
129
+ Type.Literal("initial-bind"),
130
+ Type.Literal("add"),
131
+ Type.Literal("rotate"),
132
+ Type.Literal("revoke"),
133
+ ]),
134
+ stewardId: Type.String({ minLength: 1 }),
135
+ audience: Type.String({ minLength: 1 }),
136
+ subjectKey: StewardSubjectKeySchema,
137
+ replacesKeyRef: Type.Optional(Type.String({ minLength: 1 })),
138
+ issuedAt: Type.String({ minLength: 1 }),
139
+ nonce: Type.String({ minLength: 1 }),
140
+ reason: Type.String({ minLength: 1 }),
141
+ }, { additionalProperties: false });
142
+ /** Immutable local ledger policy caps bound into a signed genesis bootstrap. */
143
+ export const StewardBootstrapPolicyCapsV1Schema = Type.Object({
144
+ instanceAudience: Type.String({ minLength: 1 }),
145
+ maxStandingLifetimeMs: Type.Integer({ minimum: 1 }),
146
+ maxStandingUses: Type.Integer({ minimum: 1 }),
147
+ maxOneShotLifetimeMs: Type.Integer({ minimum: 1 }),
148
+ allowedClockSkewMs: Type.Integer({ minimum: 0 }),
149
+ }, { additionalProperties: false });
150
+ /**
151
+ * Signed steward genesis bundle: policy caps + initial key binding.
152
+ * Signed bytes are canonicalizeV2 of the full object (no private keys).
153
+ */
154
+ export const StewardBootstrapV1Schema = Type.Object({
155
+ schemaVersion: Type.Literal(1),
156
+ kind: Type.Literal("steward-bootstrap"),
157
+ bootstrapId: Type.String({ minLength: 1 }),
158
+ stewardId: Type.String({ minLength: 1 }),
159
+ audience: Type.String({ minLength: 1 }),
160
+ policy: StewardBootstrapPolicyCapsV1Schema,
161
+ initialBinding: StewardKeyAttestationV1Schema,
162
+ issuedAt: Type.String({ minLength: 1 }),
163
+ nonce: Type.String({ minLength: 1 }),
164
+ }, { additionalProperties: false });
165
+ const AuthorizationScopeSchema = Type.Object({
166
+ classifications: Type.Array(Type.String({ minLength: 1 }), {
167
+ minItems: 1,
168
+ }),
169
+ toolNames: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { minItems: 1 })),
170
+ resourcePaths: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { minItems: 1 })),
171
+ }, { additionalProperties: false });
172
+ export const OperatorAuthorizationV1Schema = Type.Object({
173
+ schemaVersion: Type.Literal(1),
174
+ kind: Type.Literal("operator-authorization"),
175
+ authorizationId: Type.String({ minLength: 1 }),
176
+ stewardId: Type.String({ minLength: 1 }),
177
+ signingKeyRef: Type.String({ minLength: 1 }),
178
+ audience: Type.String({ minLength: 1 }),
179
+ mode: Type.Union([Type.Literal("one-shot"), Type.Literal("standing")]),
180
+ scope: AuthorizationScopeSchema,
181
+ issuedAt: Type.String({ minLength: 1 }),
182
+ expiresAt: Type.String({ minLength: 1 }),
183
+ nonce: Type.String({ minLength: 1 }),
184
+ maxUses: Type.Integer({ minimum: 1 }),
185
+ reason: Type.String({ minLength: 1 }),
186
+ }, { additionalProperties: false });
187
+ export const OperatorAuthorizationRevocationV1Schema = Type.Object({
188
+ schemaVersion: Type.Literal(1),
189
+ kind: Type.Literal("operator-authorization-revocation"),
190
+ authorizationId: Type.String({ minLength: 1 }),
191
+ stewardId: Type.String({ minLength: 1 }),
192
+ signingKeyRef: Type.String({ minLength: 1 }),
193
+ audience: Type.String({ minLength: 1 }),
194
+ issuedAt: Type.String({ minLength: 1 }),
195
+ nonce: Type.String({ minLength: 1 }),
196
+ reason: Type.String({ minLength: 1 }),
197
+ }, { additionalProperties: false });
198
+ function firstTypeboxError(schema, input, fallback) {
199
+ const errors = [...Value.Errors(schema, input)];
200
+ return errors[0] !== undefined
201
+ ? `${errors[0].path}: ${errors[0].message}`
202
+ : fallback;
203
+ }
204
+ function hasDuplicateStrings(values) {
205
+ return new Set(values).size !== values.length;
206
+ }
207
+ function isValidIso8601(value) {
208
+ if (!ISO_8601_RE.test(value))
209
+ return false;
210
+ return !Number.isNaN(Date.parse(value));
211
+ }
212
+ function validateSharedIdentityFields(fields) {
213
+ if (!isStewardIdV1(fields.stewardId)) {
214
+ return "invalid stewardId";
215
+ }
216
+ if (fields.audience.trim().length === 0) {
217
+ return "audience must be non-empty";
218
+ }
219
+ if (!NONCE_RE.test(fields.nonce)) {
220
+ return "nonce must be 32–128 URL-safe alphanumeric characters";
221
+ }
222
+ if (!isValidIso8601(fields.issuedAt)) {
223
+ return "issuedAt must be ISO-8601 UTC";
224
+ }
225
+ if (!parseKeyRef(fields.keyRef).ok) {
226
+ return "invalid key ref";
227
+ }
228
+ return undefined;
229
+ }
230
+ function validateScope(scope) {
231
+ if (scope.classifications.length === 0) {
232
+ return "classifications must be non-empty";
233
+ }
234
+ if (hasDuplicateStrings(scope.classifications)) {
235
+ return "duplicate classifications";
236
+ }
237
+ for (const c of scope.classifications) {
238
+ if (c.includes("*") || c === "") {
239
+ return "wildcard/empty classifications are forbidden";
240
+ }
241
+ if (NON_DELEGABLE_CLASSIFICATIONS.has(c)) {
242
+ return `operator authority cannot satisfy classification: ${c}`;
243
+ }
244
+ }
245
+ if (scope.toolNames !== undefined) {
246
+ if (scope.toolNames.length === 0) {
247
+ return "toolNames must be non-empty when present";
248
+ }
249
+ if (hasDuplicateStrings(scope.toolNames)) {
250
+ return "duplicate toolNames";
251
+ }
252
+ for (const t of scope.toolNames) {
253
+ if (t.includes("*") || t === "") {
254
+ return "wildcard/empty toolNames are forbidden";
255
+ }
256
+ }
257
+ }
258
+ if (scope.resourcePaths !== undefined) {
259
+ if (scope.resourcePaths.length === 0) {
260
+ return "resourcePaths must be non-empty when present";
261
+ }
262
+ if (hasDuplicateStrings(scope.resourcePaths)) {
263
+ return "duplicate resourcePaths";
264
+ }
265
+ for (const p of scope.resourcePaths) {
266
+ if (p.includes("*") || p === "" || p.startsWith("/") || p.includes("..")) {
267
+ return "invalid resourcePaths entry";
268
+ }
269
+ }
270
+ }
271
+ return undefined;
272
+ }
273
+ export function containsOpenPgpSecretKeyArmor(value) {
274
+ return /BEGIN PGP (?:PRIVATE|SECRET) KEY BLOCK/i.test(value);
275
+ }
276
+ export function parseStewardKeyAttestation(input) {
277
+ if (!Value.Check(StewardKeyAttestationV1Schema, input)) {
278
+ return {
279
+ ok: false,
280
+ error: firstTypeboxError(StewardKeyAttestationV1Schema, input, "invalid StewardKeyAttestationV1"),
281
+ };
282
+ }
283
+ const attestation = input;
284
+ const shared = validateSharedIdentityFields({
285
+ stewardId: attestation.stewardId,
286
+ audience: attestation.audience,
287
+ nonce: attestation.nonce,
288
+ issuedAt: attestation.issuedAt,
289
+ keyRef: attestation.subjectKey.keyRef,
290
+ });
291
+ if (shared) {
292
+ return { ok: false, error: shared };
293
+ }
294
+ if (attestation.subjectKey.algorithm.trim().length === 0) {
295
+ return { ok: false, error: "subjectKey.algorithm required" };
296
+ }
297
+ const subjectKeyRef = parseKeyRef(attestation.subjectKey.keyRef);
298
+ if (!subjectKeyRef.ok ||
299
+ attestation.subjectKey.algorithm !== subjectKeyRef.keyRef.algorithm) {
300
+ return {
301
+ ok: false,
302
+ error: "subjectKey.algorithm must match the algorithm in subjectKey.keyRef",
303
+ };
304
+ }
305
+ if (attestation.subjectKey.publicKeyArmored !== undefined &&
306
+ containsOpenPgpSecretKeyArmor(attestation.subjectKey.publicKeyArmored)) {
307
+ return { ok: false, error: "OpenPGP secret key material is not accepted" };
308
+ }
309
+ if (attestation.operation === "rotate" &&
310
+ (attestation.replacesKeyRef === undefined ||
311
+ !parseKeyRef(attestation.replacesKeyRef).ok)) {
312
+ return { ok: false, error: "rotate requires valid replacesKeyRef" };
313
+ }
314
+ if (attestation.replacesKeyRef !== undefined &&
315
+ !parseKeyRef(attestation.replacesKeyRef).ok) {
316
+ return { ok: false, error: "invalid replacesKeyRef" };
317
+ }
318
+ return { ok: true, attestation };
319
+ }
320
+ export function parseStewardBootstrap(input) {
321
+ if (!Value.Check(StewardBootstrapV1Schema, input)) {
322
+ return {
323
+ ok: false,
324
+ error: firstTypeboxError(StewardBootstrapV1Schema, input, "invalid StewardBootstrapV1"),
325
+ };
326
+ }
327
+ const bootstrap = input;
328
+ const shared = validateSharedIdentityFields({
329
+ stewardId: bootstrap.stewardId,
330
+ audience: bootstrap.audience,
331
+ nonce: bootstrap.nonce,
332
+ issuedAt: bootstrap.issuedAt,
333
+ keyRef: bootstrap.initialBinding.subjectKey.keyRef,
334
+ });
335
+ if (shared) {
336
+ return { ok: false, error: shared };
337
+ }
338
+ if (bootstrap.bootstrapId.trim().length === 0) {
339
+ return { ok: false, error: "bootstrapId must be non-empty" };
340
+ }
341
+ if (bootstrap.policy.instanceAudience !== bootstrap.audience) {
342
+ return {
343
+ ok: false,
344
+ error: "policy.instanceAudience must match bootstrap audience",
345
+ };
346
+ }
347
+ const binding = parseStewardKeyAttestation(bootstrap.initialBinding);
348
+ if (!binding.ok) {
349
+ return { ok: false, error: binding.error };
350
+ }
351
+ if (binding.attestation.operation !== "initial-bind") {
352
+ return {
353
+ ok: false,
354
+ error: "bootstrap initialBinding.operation must be initial-bind",
355
+ };
356
+ }
357
+ if (binding.attestation.stewardId !== bootstrap.stewardId) {
358
+ return {
359
+ ok: false,
360
+ error: "initialBinding.stewardId must match bootstrap stewardId",
361
+ };
362
+ }
363
+ if (binding.attestation.audience !== bootstrap.audience) {
364
+ return {
365
+ ok: false,
366
+ error: "initialBinding.audience must match bootstrap audience",
367
+ };
368
+ }
369
+ const armored = binding.attestation.subjectKey.publicKeyArmored;
370
+ if (armored === undefined || armored.trim().length === 0) {
371
+ return {
372
+ ok: false,
373
+ error: "initialBinding.subjectKey.publicKeyArmored is required",
374
+ };
375
+ }
376
+ if (containsOpenPgpSecretKeyArmor(armored)) {
377
+ return { ok: false, error: "OpenPGP secret key material is not accepted" };
378
+ }
379
+ return { ok: true, bootstrap };
380
+ }
381
+ export function parseOperatorAuthorization(input) {
382
+ if (!Value.Check(OperatorAuthorizationV1Schema, input)) {
383
+ return {
384
+ ok: false,
385
+ error: firstTypeboxError(OperatorAuthorizationV1Schema, input, "invalid OperatorAuthorizationV1"),
386
+ };
387
+ }
388
+ const authorization = input;
389
+ const shared = validateSharedIdentityFields({
390
+ stewardId: authorization.stewardId,
391
+ audience: authorization.audience,
392
+ nonce: authorization.nonce,
393
+ issuedAt: authorization.issuedAt,
394
+ keyRef: authorization.signingKeyRef,
395
+ });
396
+ if (shared) {
397
+ return { ok: false, error: shared };
398
+ }
399
+ if (!isValidIso8601(authorization.expiresAt)) {
400
+ return { ok: false, error: "expiresAt must be ISO-8601 UTC" };
401
+ }
402
+ const scopeError = validateScope(authorization.scope);
403
+ if (scopeError) {
404
+ return { ok: false, error: scopeError };
405
+ }
406
+ const bounds = validateOperatorAuthorizationBounds(authorization);
407
+ if (!bounds.ok) {
408
+ return { ok: false, error: bounds.error };
409
+ }
410
+ return { ok: true, authorization };
411
+ }
412
+ export function parseOperatorAuthorizationRevocation(input) {
413
+ if (!Value.Check(OperatorAuthorizationRevocationV1Schema, input)) {
414
+ return {
415
+ ok: false,
416
+ error: firstTypeboxError(OperatorAuthorizationRevocationV1Schema, input, "invalid OperatorAuthorizationRevocationV1"),
417
+ };
418
+ }
419
+ const revocation = input;
420
+ const shared = validateSharedIdentityFields({
421
+ stewardId: revocation.stewardId,
422
+ audience: revocation.audience,
423
+ nonce: revocation.nonce,
424
+ issuedAt: revocation.issuedAt,
425
+ keyRef: revocation.signingKeyRef,
426
+ });
427
+ if (shared) {
428
+ return { ok: false, error: shared };
429
+ }
430
+ return { ok: true, revocation };
431
+ }
432
+ /**
433
+ * Temporal / mode bounds for a schema-shaped authorization.
434
+ * Local policy caps (max lifetime / maxUses) are applied by steward-auth-core.
435
+ */
436
+ export function validateOperatorAuthorizationBounds(authorization) {
437
+ const issued = Date.parse(authorization.issuedAt);
438
+ const expires = Date.parse(authorization.expiresAt);
439
+ if (Number.isNaN(issued) || Number.isNaN(expires)) {
440
+ return { ok: false, error: "issuedAt/expiresAt must be ISO-8601" };
441
+ }
442
+ if (expires <= issued) {
443
+ return { ok: false, error: "expiresAt must be after issuedAt" };
444
+ }
445
+ if (authorization.mode === "one-shot" && authorization.maxUses !== 1) {
446
+ return { ok: false, error: "one-shot authorizations require maxUses: 1" };
447
+ }
448
+ if (authorization.mode === "standing" && authorization.maxUses < 1) {
449
+ return {
450
+ ok: false,
451
+ error: "standing authorizations require finite positive maxUses",
452
+ };
453
+ }
454
+ return { ok: true };
455
+ }
456
+ /** Signed bytes are exactly canonicalizeV2 of these fields (no trailing newline). */
457
+ export function attestationSigningFields(attestation) {
458
+ return { ...attestation };
459
+ }
460
+ export function bootstrapSigningFields(bootstrap) {
461
+ return { ...bootstrap };
462
+ }
463
+ export function authorizationSigningFields(authorization) {
464
+ return { ...authorization };
465
+ }
466
+ export function authorizationRevocationSigningFields(revocation) {
467
+ return { ...revocation };
468
+ }
469
+ export function buildStewardEvidenceDigest(payload) {
470
+ return digest({
471
+ version: 2,
472
+ domain: STEWARD_DIGEST_DOMAINS.evidence,
473
+ value: payload,
474
+ });
475
+ }
476
+ export function buildStewardReplayDigest(payload) {
477
+ return digest({
478
+ version: 2,
479
+ domain: STEWARD_DIGEST_DOMAINS.replay,
480
+ value: payload,
481
+ });
482
+ }
483
+ //# sourceMappingURL=steward-authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steward-authorization.js","sourceRoot":"","sources":["../src/steward-authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Harness-neutral workspace path profiles.
3
+ *
4
+ * - `openclaw` → `<homedir>/.openclaw/workspace` (absolute OpenClaw default)
5
+ * - `generic` → `$FPP_WORKSPACE` or `~/.fpp`
6
+ * - `cursor` / `claude-code` / `codex` → `~/.fpp/<profile>`
7
+ *
8
+ * When `FPP_WORKSPACE` is set, it overrides the profile root for any profile.
9
+ *
10
+ * Legacy relative configs (e.g. `.openclaw/workspace/x`) are absolutized via
11
+ * `absolutizeWorkspacePath` so runtime never accidentally resolves against CWD.
12
+ */
13
+ export type WorkspaceProfileId = "openclaw" | "generic" | "cursor" | "claude-code" | "codex";
14
+ export declare const DEFAULT_WORKSPACE_PROFILE: WorkspaceProfileId;
15
+ export type ResolveWorkspaceOptions = {
16
+ profile?: WorkspaceProfileId | string | undefined;
17
+ env?: NodeJS.ProcessEnv | undefined;
18
+ homedir?: (() => string) | undefined;
19
+ };
20
+ export type AbsolutizeWorkspaceOptions = ResolveWorkspaceOptions & {
21
+ /** Optional detected OpenClaw workspace absolute path when FPP_WORKSPACE is unset. */
22
+ openclawWorkspace?: string | undefined;
23
+ };
24
+ /**
25
+ * Resolve the workspace root directory for the active profile.
26
+ */
27
+ export declare function resolveWorkspaceRoot(options?: ResolveWorkspaceOptions): string;
28
+ /**
29
+ * Join a filename under the resolved workspace root using forward slashes
30
+ * (stable across hosts for config defaults and docs).
31
+ */
32
+ export declare function workspaceFile(filename: string, options?: ResolveWorkspaceOptions): string;
33
+ /**
34
+ * Resolve a possibly-relative workspace path to an absolute path.
35
+ *
36
+ * Absolute inputs are returned normalized. Relative inputs resolve against:
37
+ * `FPP_WORKSPACE` → `openclawWorkspace` (if provided) → `homedir()`
38
+ *
39
+ * Legacy `.openclaw/workspace/...` strings map onto the workspace root + remainder
40
+ * when the base is an explicit workspace override (FPP_WORKSPACE / openclawWorkspace).
41
+ */
42
+ export declare function absolutizeWorkspacePath(inputPath: string, options?: AbsolutizeWorkspaceOptions): string;
43
+ //# sourceMappingURL=workspace-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-profile.d.ts","sourceRoot":"","sources":["../src/workspace-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,SAAS,GACT,QAAQ,GACR,aAAa,GACb,OAAO,CAAC;AAEZ,eAAO,MAAM,yBAAyB,EAAE,kBAA+B,CAAC;AAMxE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,uBAAuB,GAAG;IACjE,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;AAWF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAIR;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAgCR"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Harness-neutral workspace path profiles.
3
+ *
4
+ * - `openclaw` → `<homedir>/.openclaw/workspace` (absolute OpenClaw default)
5
+ * - `generic` → `$FPP_WORKSPACE` or `~/.fpp`
6
+ * - `cursor` / `claude-code` / `codex` → `~/.fpp/<profile>`
7
+ *
8
+ * When `FPP_WORKSPACE` is set, it overrides the profile root for any profile.
9
+ *
10
+ * Legacy relative configs (e.g. `.openclaw/workspace/x`) are absolutized via
11
+ * `absolutizeWorkspacePath` so runtime never accidentally resolves against CWD.
12
+ */
13
+ import { homedir as osHomedir } from "node:os";
14
+ import { isAbsolute, join } from "node:path";
15
+ export const DEFAULT_WORKSPACE_PROFILE = "openclaw";
16
+ const HARNESS_PROFILES = new Set(["cursor", "claude-code", "codex"]);
17
+ const OPENCLAW_RELATIVE_PREFIX = ".openclaw/workspace";
18
+ function normalizeRoot(root) {
19
+ return root.replace(/\\/g, "/").replace(/\/+$/, "");
20
+ }
21
+ function isAbsolutePath(p) {
22
+ const n = p.replace(/\\/g, "/");
23
+ return isAbsolute(n) || /^[A-Za-z]:\//.test(n);
24
+ }
25
+ /**
26
+ * Resolve the workspace root directory for the active profile.
27
+ */
28
+ export function resolveWorkspaceRoot(options = {}) {
29
+ const env = options.env ?? process.env;
30
+ const override = env.FPP_WORKSPACE?.trim();
31
+ if (override) {
32
+ return normalizeRoot(override);
33
+ }
34
+ const profile = (options.profile ?? DEFAULT_WORKSPACE_PROFILE);
35
+ const home = () => (options.homedir ?? osHomedir)();
36
+ if (profile === "generic") {
37
+ return normalizeRoot(join(home(), ".fpp"));
38
+ }
39
+ if (HARNESS_PROFILES.has(profile)) {
40
+ return normalizeRoot(join(home(), ".fpp", profile));
41
+ }
42
+ // openclaw (default) and unknown profiles use absolute OpenClaw layout
43
+ return normalizeRoot(join(home(), ".openclaw", "workspace"));
44
+ }
45
+ /**
46
+ * Join a filename under the resolved workspace root using forward slashes
47
+ * (stable across hosts for config defaults and docs).
48
+ */
49
+ export function workspaceFile(filename, options = {}) {
50
+ const root = resolveWorkspaceRoot(options);
51
+ const name = filename.replace(/^\/+/, "");
52
+ return `${root}/${name}`;
53
+ }
54
+ /**
55
+ * Resolve a possibly-relative workspace path to an absolute path.
56
+ *
57
+ * Absolute inputs are returned normalized. Relative inputs resolve against:
58
+ * `FPP_WORKSPACE` → `openclawWorkspace` (if provided) → `homedir()`
59
+ *
60
+ * Legacy `.openclaw/workspace/...` strings map onto the workspace root + remainder
61
+ * when the base is an explicit workspace override (FPP_WORKSPACE / openclawWorkspace).
62
+ */
63
+ export function absolutizeWorkspacePath(inputPath, options = {}) {
64
+ const normalized = inputPath.replace(/\\/g, "/");
65
+ if (isAbsolutePath(normalized)) {
66
+ return normalizeRoot(normalized);
67
+ }
68
+ const env = options.env ?? process.env;
69
+ const fppWs = env.FPP_WORKSPACE?.trim();
70
+ const detected = options.openclawWorkspace?.trim();
71
+ const home = (options.homedir ?? osHomedir)();
72
+ const stripOpenclawPrefix = (base) => {
73
+ const root = normalizeRoot(base);
74
+ if (normalized === OPENCLAW_RELATIVE_PREFIX ||
75
+ normalized.startsWith(`${OPENCLAW_RELATIVE_PREFIX}/`)) {
76
+ const rest = normalized
77
+ .slice(OPENCLAW_RELATIVE_PREFIX.length)
78
+ .replace(/^\//, "");
79
+ return rest ? `${root}/${rest}` : root;
80
+ }
81
+ return normalizeRoot(join(root, normalized));
82
+ };
83
+ if (fppWs) {
84
+ return stripOpenclawPrefix(fppWs);
85
+ }
86
+ if (detected) {
87
+ return stripOpenclawPrefix(detected);
88
+ }
89
+ return normalizeRoot(join(home, normalized));
90
+ }
91
+ //# sourceMappingURL=workspace-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-profile.js","sourceRoot":"","sources":["../src/workspace-profile.ts"],"names":[],"mappings":"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"}