@registrystack/client 0.45.0 → 0.46.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/README.md CHANGED
@@ -189,7 +189,7 @@ Coordinator joins the seven-product roster at v0.44.0. The source facade also
189
189
  contains held `render` and `@registrystack/client/render` namespaces. Default
190
190
  assembly omits Render; `--include-render` adds it to an explicit local candidate
191
191
  and does not authorize publication. Render takes a token or a resource-bound provider with
192
- `bearerToken()` and performs one bounded render exchange. A correlation key is
192
+ `bearerToken()` and performs one bounded render or seal exchange. A correlation key is
193
193
  not a durable idempotency promise. `outcomeUnknown` and `transportKind` preserve
194
194
  whether an exchange may have completed; provider errors keep their own class.
195
195
  Coordinator is optional.
@@ -2,12 +2,12 @@
2
2
  "schemaVersion": "registry-stack.sdk-compatibility.v1",
3
3
  "sdkPackage": {
4
4
  "name": "registry-stack-client",
5
- "version": "0.45.0"
5
+ "version": "0.46.0"
6
6
  },
7
7
  "namespaces": {
8
8
  "discovery": {
9
- "testedServerBaseline": "0.45.0",
10
- "compatibleServerPatchLine": "0.45.x",
9
+ "testedServerBaseline": "0.46.0",
10
+ "compatibleServerPatchLine": "0.46.x",
11
11
  "responseCompatibility": {
12
12
  "additiveObjectMembers": "ignored-after-duplicate-key-rejection",
13
13
  "unknownProblemCodes": "http-status-only",
@@ -227,12 +227,15 @@ export class CoordinatorClient {
227
227
  reconcile(token: string, runId: RunId, reason: string): Promise<CoordinatorOutcome<RunInspection>>
228
228
  /**
229
229
  * Read one stable page of caller-visible runs. Pass `nextCursor` unchanged
230
- * with the same caller, `state`, `attention`, `proposal`, and `turn`
231
- * values. `attention: true` selects the effective states `attention` and
232
- * `failed`. `proposal` selects runs waiting on that BReg Proposal; `turn`
233
- * selects runs whose Proposal wait last showed that turn.
230
+ * with the same caller, `state`, `attention`, `proposal`, `turn`, and
231
+ * `outcome` values. `attention: true` selects the effective states
232
+ * `attention` and `failed`. `proposal` selects runs waiting on that BReg
233
+ * Proposal; `turn` selects runs whose Proposal wait last showed that turn.
234
+ * `outcome` selects runs that finished with that workflow outcome, matched
235
+ * exactly; it is 1 to 64 letters, digits, hyphens or underscores, checked
236
+ * before sending.
234
237
  */
235
- list(token: string, limit: SafeInteger, cursor?: string | null, state?: RunListState | null, attention?: boolean | null, proposal?: string | null, turn?: ProposalTurn | null): Promise<CoordinatorOutcome<RunList>>
238
+ list(token: string, limit: SafeInteger, cursor?: string | null, state?: RunListState | null, attention?: boolean | null, proposal?: string | null, turn?: ProposalTurn | null, outcome?: string | null): Promise<CoordinatorOutcome<RunList>>
236
239
  /**
237
240
  * Schedule the run's saved command again, unchanged, when its inspection
238
241
  * allows a retry. Takes no idempotency key, so it is sent exactly once. `reason` is
@@ -8,7 +8,7 @@ export declare class CoordinatorClient {
8
8
  status(token: string, runId: import('./client').RunId): Promise<import('./client').CoordinatorOutcome<import('./client').RunStatus>>
9
9
  inspect(token: string, runId: import('./client').RunId): Promise<import('./client').CoordinatorOutcome<import('./client').RunInspection>>
10
10
  reconcile(token: string, runId: import('./client').RunId, reason: string): Promise<import('./client').CoordinatorOutcome<import('./client').RunInspection>>
11
- list(token: string, limit: number, cursor?: string | null, state?: import('./client').RunListState | null, attention?: boolean | null, proposal?: string | null, turn?: import('./client').ProposalTurn | null): Promise<import('./client').CoordinatorOutcome<import('./client').RunList>>
11
+ list(token: string, limit: number, cursor?: string | null, state?: import('./client').RunListState | null, attention?: boolean | null, proposal?: string | null, turn?: import('./client').ProposalTurn | null, outcome?: string | null): Promise<import('./client').CoordinatorOutcome<import('./client').RunList>>
12
12
  retrySame(token: string, runId: import('./client').RunId, reason: string): Promise<import('./client').CoordinatorOutcome<import('./client').RetryScheduled>>
13
13
  cancel(token: string, runId: import('./client').RunId, reason: string): Promise<import('./client').CoordinatorOutcome<import('./client').RunStatus>>
14
14
  }
@@ -30,6 +30,39 @@ import {
30
30
  /** The signed response encoding closed before one request is sent. */
31
31
  export type EvidenceResponseFormat = 'signed-jws' | 'sd-jwt-vc'
32
32
 
33
+ /**
34
+ * How an assertion's facts were obtained. `source` means Evidence acquired
35
+ * them itself from an authoritative source; `holder-presented` means a holder
36
+ * presented another issuer's credential and Evidence verified it. A request
37
+ * accepts `source` only unless it names more in `acceptedChannels`.
38
+ */
39
+ export type EvidenceChannel = 'source' | 'holder-presented'
40
+
41
+ /**
42
+ * The channel policy a request or request batch may state. Both members are
43
+ * optional: absent `acceptedChannels` means `['source']` only, so a request
44
+ * that never names a channel refuses an assertion a holder presented, and
45
+ * absent `maximumCredentialAgeSeconds` means no credential age bound, which
46
+ * applies to `holder-presented` assertions only.
47
+ */
48
+ export interface EvidenceChannelPolicy {
49
+ acceptedChannels?: ReadonlyArray<EvidenceChannel>
50
+ maximumCredentialAgeSeconds?: number
51
+ }
52
+
53
+ /**
54
+ * What a `holder-presented` assertion states about the credential the holder
55
+ * presented: the `presentedCredential` member of a verified `evidence`, present
56
+ * if and only if its `channel` is `holder-presented`.
57
+ */
58
+ export interface PresentedCredential {
59
+ readonly trustEntry: string
60
+ readonly issuer: string
61
+ readonly type: string
62
+ readonly issuedAt: string
63
+ readonly subjectLink: 'possession' | 'attribute-match'
64
+ }
65
+
33
66
  /** An opaque, versioned subject-continuity receipt owned by the application. */
34
67
  export interface SubjectBindingReceipt {
35
68
  readonly schema: 'registry.evidence-subject-binding-receipt/v1'
@@ -81,6 +114,10 @@ export type AudienceScopedRequest = {
81
114
  subjects?: Readonly<Record<string, Readonly<Record<string, string | number | boolean>>>>
82
115
  /** A prior receipt the application chose to retain. Nothing is persisted by this package. */
83
116
  bindingReceipt?: SubjectBindingReceipt
117
+ /** See `EvidenceChannelPolicy`. Absent means `source` only. */
118
+ acceptedChannels?: ReadonlyArray<EvidenceChannel>
119
+ /** See `EvidenceChannelPolicy`. Absent means no credential age bound. */
120
+ maximumCredentialAgeSeconds?: number
84
121
  }
85
122
 
86
123
  /**
@@ -296,6 +333,10 @@ export interface EvidenceRequestSpec {
296
333
  expectedOutputs: ReadonlyArray<Readonly<Record<string, unknown>>>
297
334
  maximumAssertionLifetimeSeconds: number
298
335
  clockSkewSeconds: number
336
+ /** See `EvidenceChannelPolicy`. Absent means `source` only. */
337
+ acceptedChannels?: ReadonlyArray<EvidenceChannel>
338
+ /** See `EvidenceChannelPolicy`. Absent means no credential age bound. */
339
+ maximumCredentialAgeSeconds?: number
299
340
  subjectExpectations:
300
341
  | 'acceptFirstUse'
301
342
  | { pinned: ReadonlyArray<{ role: string; binding: string }> }
@@ -329,6 +370,10 @@ export interface EvidenceRequestBatchSpec {
329
370
  expectedOutputs: ReadonlyArray<Readonly<Record<string, unknown>>>
330
371
  maximumAssertionLifetimeSeconds: number
331
372
  clockSkewSeconds: number
373
+ /** See `EvidenceChannelPolicy`. Absent means `source` only. */
374
+ acceptedChannels?: ReadonlyArray<EvidenceChannel>
375
+ /** See `EvidenceChannelPolicy`. Absent means no credential age bound. */
376
+ maximumCredentialAgeSeconds?: number
332
377
  items: ReadonlyArray<EvidenceRequestBatchItemSpec>
333
378
  }
334
379
 
@@ -56,7 +56,7 @@ export declare class EvidenceClient {
56
56
  * a multi-subject request batch. No I/O happens here, and the returned
57
57
  * opaque batch is good for exactly one exchange.
58
58
  */
59
- prepareBatch(spec: { requirement: string; purpose: string; audience: string; evidenceType: string; issuedBy: string; providedBy: string; configurationRevision: string; expectedAssuranceProfile: any; expectedOutputs: ReadonlyArray<Readonly<Record<string, any>>>; maximumAssertionLifetimeSeconds: number; clockSkewSeconds: number; items: ReadonlyArray<{ subjects: ReadonlyArray<{ role: string; selectorProfile: string; selectorValues?: Readonly<Record<string, string | number | boolean>> | null }>; subjectExpectations: 'acceptFirstUse' | { pinned: ReadonlyArray<{ role: string; binding: string }> } }> }): PreparedEvidenceRequestBatch
59
+ prepareBatch(spec: { requirement: string; purpose: string; audience: string; evidenceType: string; issuedBy: string; providedBy: string; configurationRevision: string; expectedAssuranceProfile: any; expectedOutputs: ReadonlyArray<Readonly<Record<string, any>>>; maximumAssertionLifetimeSeconds: number; clockSkewSeconds: number; acceptedChannels?: ReadonlyArray<'source' | 'holder-presented'>; maximumCredentialAgeSeconds?: number; items: ReadonlyArray<{ subjects: ReadonlyArray<{ role: string; selectorProfile: string; selectorValues?: Readonly<Record<string, string | number | boolean>> | null }>; subjectExpectations: 'acceptFirstUse' | { pinned: ReadonlyArray<{ role: string; binding: string }> } }> }): PreparedEvidenceRequestBatch
60
60
  /**
61
61
  * Read the request shapes this requester is entitled to send. Discovery
62
62
  * is authoring input, not a trust anchor: it never supplies verification
@@ -275,7 +275,11 @@ export type SubjectContinuity =
275
275
  * opaque.
276
276
  */
277
277
  export interface VerifiedEvidence {
278
- /** The verified payload, serialized field for field with no hand mapping. */
278
+ /**
279
+ * The verified payload, serialized field for field with no hand mapping.
280
+ * Its `channel` is `source` or `holder-presented`, and a
281
+ * `holder-presented` payload also carries `presentedCredential`.
282
+ */
279
283
  evidence: any
280
284
  /**
281
285
  * The validated W3C trace identifier for the exchange that produced this
package/native.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const PACKAGE_VERSION = '0.45.0';
3
+ const PACKAGE_VERSION = '0.46.0';
4
4
  const PRODUCTS = new Set(["breg", "casework", "coordinator", "discovery", "evidence", "messaging", "scheduling"]);
5
5
 
6
6
  function target() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@registrystack/client",
3
- "version": "0.45.0",
3
+ "version": "0.46.0",
4
4
  "description": "Unified Node.js client for Registry Stack products.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://docs.registrystack.org/reference/client-api/",
@@ -68,8 +68,8 @@
68
68
  "typescript": "6.0.3"
69
69
  },
70
70
  "optionalDependencies": {
71
- "@registrystack/client-darwin-arm64": "0.45.0",
72
- "@registrystack/client-linux-arm64-gnu": "0.45.0",
73
- "@registrystack/client-linux-x64-gnu": "0.45.0"
71
+ "@registrystack/client-darwin-arm64": "0.46.0",
72
+ "@registrystack/client-linux-arm64-gnu": "0.46.0",
73
+ "@registrystack/client-linux-x64-gnu": "0.46.0"
74
74
  }
75
75
  }