dataspace-client-sdk-node 0.1.1 → 0.1.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [Unreleased] - 2026-05-04
6
+
7
+ ### Added
8
+ - Data model alignment guide updated for cross-service namespace consistency:
9
+ - Gateway: `/host/...` (with `auth` security model)
10
+ - ICA: `/ica/...`
11
+ - DataConv: `/publisher/...`
12
+ - Explicit integration guidance that SDK consumers should use SDK path helpers instead of manually composing host prefixes/routes.
13
+
14
+ ### Changed
15
+ - Contact identity contract for onboarding/controller flows is now documented as dual-channel:
16
+ - Email (`org.schema.Person.email`)
17
+ - Telephone (`org.schema.Person.telephone`
18
+ - Offer/Order process clarified as part of the onboarding contract even when commercial amount is zero:
19
+ - Offer extraction for UI review/acceptance
20
+ - Explicit Order acceptance using offer identifier
21
+
22
+ ### Documentation
23
+ - Updated:
24
+ - `docs/DATA_MODEL_ALIGNMENT.md`
25
+ - Clarified:
26
+ - `/host` + `auth` alignment with current gateway model
27
+ - namespace symmetry with ICA (`/ica`) and DataConv (`/publisher`)
28
+
package/README.md CHANGED
@@ -6,6 +6,46 @@ Node.js SDK to consume GW/UNID async DIDComm plain endpoints.
6
6
  **[→ Data Model Alignment (GW + Chat + SDK)](docs/DATA_MODEL_ALIGNMENT.md)**
7
7
  **[→ Frontend/Backend SDK Ownership Matrix](../docs/SDK_AUTH_OWNERSHIP.md)**
8
8
  **[→ Developer Use-Case Cookbook (UC5 + additional patterns)](docs/DEVELOPER_USE_CASES.md)**
9
+ **[→ React Web Integration Guide](docs/REACT_WEB_INTEGRATION.md)**
10
+ **[→ Backend Node Integration Guide](docs/BACKEND_NODE_INTEGRATION.md)**
11
+ **[→ Portal Backend Integration Handover](docs/PORTAL_BACKEND_INTEGRATION_HANDOVER.md)**
12
+
13
+ ## Onboarding flows (split by business case)
14
+
15
+ Do not mix these two flows in the same narrative:
16
+
17
+ 1. Legal Organization Onboarding (B2B/tenant/controller)
18
+ 2. Personal Organization Onboarding (individual/family/subject)
19
+
20
+ ### 1) Legal Organization Onboarding (B2B/tenant/controller)
21
+
22
+ Canonical order when ICA proof is involved:
23
+
24
+ 1. ICA proof/verification (`_verify`, external to this SDK).
25
+ 2. GW activation in host registry: `Organization/_activate`.
26
+ 3. Offer/Order phase for legal organization onboarding (always; if amount is 0, no payment step).
27
+ 4. Device onboarding (DCR): `identity/openid/Device/_dcr`.
28
+ 5. Post-DCR token exchange / SMART authorization for protected API calls.
29
+
30
+ Node SDK helpers:
31
+ - `activateOrganizationInGatewayFromIcaProof(...)` (UC5.2)
32
+ - `activateEmployeeDeviceWithActivationCode(...)` (UC5.4)
33
+ - `authenticateBackendPkceAndExchange(...)` or `authenticateBackendSmartStandard(...)`
34
+
35
+ ### 2) Personal Organization Onboarding (individual/family/subject)
36
+
37
+ Canonical order:
38
+
39
+ 1. Personal/family registration: `individual/org.schema/Organization/_batch`.
40
+ 2. Offer acceptance/order confirmation: `individual/org.schema/Order/_batch`.
41
+ 3. Continue with consent + subject data workflows.
42
+
43
+ Node SDK helper:
44
+ - `bootstrapSubjectOrganizationIndex(...)` (UC5.1: registration + optional order confirmation)
45
+
46
+ See:
47
+ - `docs/DEVELOPER_USE_CASES.md` (UC5.1..UC5.7)
48
+ - `docs/E2E_BOOTSTRAP.md` (host activation bootstrap)
9
49
 
10
50
  ## Scope
11
51
  - Generic async batch client (`_batch` + `_batch-response`) and JSON POST helper.
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { AsyncPollRequest, BackendPkceAuthOptions, BackendPkceAuthResult, BackendSmartAuthOptions, BackendSmartAuthResult, ClientOptions, CreatePhoneReminderTasksInput, GrantProfessionalAccessSimpleInput, GrantProfessionalAccessSimpleResult, DigitalTwinGenerationInput, EmployeeDeviceActivationInput, EmployeeDeviceActivationResult, FamilyOrganizationSummary, GatewayOrganizationActivationInput, HostRouteContext, IpsOrFhirImportInput, MedicationOverlapCheckInput, MedicationRegistrationInput, OrganizationEmployeeCreationInput, PollOptions, PollResult, RouteContext, SmartTokenExchangeInput, SmartTokenExchangeResult, SubjectOrganizationBootstrapInput, SubjectOrganizationBootstrapResult, SubmitAndPollResult, SubmitResponse, V1Action, V1Section } from './types.js';
1
+ import type { AsyncPollRequest, BackendPkceAuthOptions, BackendPkceAuthResult, BackendSmartAuthOptions, BackendSmartAuthResult, ClientOptions, CreatePhoneReminderTasksInput, GrantProfessionalAccessSimpleInput, GrantProfessionalAccessSimpleResult, DigitalTwinGenerationInput, EmployeeDeviceActivationInput, EmployeeDeviceActivationSimpleInput, EmployeeDeviceActivationResult, FamilyOrganizationSummary, GatewayOrganizationActivationInput, GatewayOrganizationActivationSimpleInput, HostRouteContext, IpsOrFhirImportInput, MedicationOverlapCheckInput, MedicationRegistrationInput, OrganizationEmployeeCreationInput, PollOptions, PollResult, OfferPreview, RouteContext, SmartTokenExchangeInput, SmartTokenExchangeResult, SmartTokenRequestSimpleInput, LegalOrganizationOrderSimpleInput, SubjectOrganizationBootstrapInput, SubjectOrganizationBootstrapResult, IndividualOrganizationBootstrapSimpleInput, IndividualOrganizationBootstrapSimpleResult, IndividualOrganizationStartSimpleResult, IndividualOrganizationConfirmOrderSimpleInput, SubmitAndPollResult, SubmitResponse, V1Action, V1Section } from './types.js';
2
2
  import type { WalletProvider } from './sdk/dataspace-wallet-sdk-node/provider.js';
3
3
  import type { PublicJwk, WalletContext } from './sdk/dataspace-wallet-sdk-node/types.js';
4
4
  export declare class DataspaceNodeClient {
@@ -6,9 +6,28 @@ export declare class DataspaceNodeClient {
6
6
  private readonly bearerToken?;
7
7
  private readonly defaultHeaders;
8
8
  private readonly wallet?;
9
+ private defaultCtx?;
10
+ private defaultTimeoutMs?;
11
+ private defaultIntervalMs?;
9
12
  private readonly _tokenCache;
10
13
  constructor(options: ClientOptions);
11
14
  getWallet(): WalletProvider | undefined;
15
+ /**
16
+ * Set default route context for subsequent calls.
17
+ */
18
+ setContext(ctx: RouteContext): this;
19
+ /**
20
+ * Preferred alias for organization/tenant integration context.
21
+ */
22
+ setContextOrg(ctx: RouteContext): this;
23
+ setTenantId(tenantId: string): this;
24
+ setJurisdiction(jurisdiction: string): this;
25
+ setSector(sector: string): this;
26
+ setDefaultTimeoutSeconds(seconds: number): this;
27
+ setDefaultIntervalSeconds(seconds: number): this;
28
+ private resolveSimplePollOptions;
29
+ private requireRouteContext;
30
+ private requireHostRouteContext;
12
31
  /**
13
32
  * Generic GW v1 tenant route builder.
14
33
  * Use this for any section/format/resourceType/action combination not covered
@@ -20,7 +39,7 @@ export declare class DataspaceNodeClient {
20
39
  * client.v1Path(ctx, 'individual', 'org.schema', 'Organization', '_batch')
21
40
  * // → /acme/cds-ES/v1/health-care/individual/org.schema/Organization/_batch
22
41
  */
23
- v1Path(ctx: RouteContext, section: V1Section, format: string, resourceType: string, action: V1Action): string;
42
+ v1Path(ctx: RouteContext | undefined, section: V1Section, format: string, resourceType: string, action: V1Action): string;
24
43
  /**
25
44
  * Generic tenant-scoped identity route builder.
26
45
  * Pattern: `/{prefix}/cds-{jurisdiction}/v1/{sector}/{tenantId}/identity/auth/{action}`
@@ -28,41 +47,41 @@ export declare class DataspaceNodeClient {
28
47
  * The `prefix` is service-specific: `host` for GW, `publisher` for DataConv, `ica` for ICA.
29
48
  * Dedicated path methods in this SDK use `host` (GW convention).
30
49
  */
31
- tenantIdentityPath(ctx: RouteContext, prefix: string, action: string): string;
50
+ tenantIdentityPath(ctx: RouteContext | undefined, prefix: string, action: string): string;
32
51
  /**
33
52
  * Generic host registry route builder (tenant-agnostic, `host/` prefix).
34
53
  * Use for controller-level registry operations (Organization activate, Order, etc.).
35
54
  *
36
55
  * Pattern: `/host/cds-{jurisdiction}/v1/{sector}/registry/org.schema/{resourceType}/{action}`
37
56
  */
38
- hostRegistryPath(ctx: HostRouteContext, resourceType: string, action: V1Action): string;
57
+ hostRegistryPath(ctx: HostRouteContext | undefined, resourceType: string, action: V1Action): string;
39
58
  /** Submit path: host registry Organization batch (controller-level org registration). */
40
- hostRegistryOrganizationBatchPath(ctx: HostRouteContext): string;
59
+ hostRegistryOrganizationBatchPath(ctx?: HostRouteContext): string;
41
60
  /** Poll path: host registry Organization batch. Pair with `hostRegistryOrganizationBatchPath`. */
42
- hostRegistryOrganizationPollPath(ctx: HostRouteContext): string;
61
+ hostRegistryOrganizationPollPath(ctx?: HostRouteContext): string;
43
62
  /** Submit path: activate a tenant Organization in the GW registry using a VC from ICA. */
44
- hostRegistryOrganizationActivatePath(ctx: HostRouteContext): string;
63
+ hostRegistryOrganizationActivatePath(ctx?: HostRouteContext): string;
45
64
  /** Poll path: `_activate` response. Pair with `hostRegistryOrganizationActivatePath`. */
46
- hostRegistryOrganizationActivatePollPath(ctx: HostRouteContext): string;
65
+ hostRegistryOrganizationActivatePollPath(ctx?: HostRouteContext): string;
47
66
  /** Submit path: host registry Order batch (controller-level order submission). */
48
- hostRegistryOrderBatchPath(ctx: HostRouteContext): string;
67
+ hostRegistryOrderBatchPath(ctx?: HostRouteContext): string;
49
68
  /** Poll path: host registry Order batch. Pair with `hostRegistryOrderBatchPath`. */
50
- hostRegistryOrderPollPath(ctx: HostRouteContext): string;
69
+ hostRegistryOrderPollPath(ctx?: HostRouteContext): string;
51
70
  /**
52
71
  * Submit path: individual/family Organization onboarding (`org.schema/Organization/_batch`).
53
72
  * Use for `family-registration/_create-or-resume` DIDComm payloads.
54
73
  */
55
- individualFamilyOrganizationBatchPath(ctx: RouteContext): string;
74
+ individualFamilyOrganizationBatchPath(ctx?: RouteContext): string;
56
75
  /** Poll path: individual/family Organization. Pair with `individualFamilyOrganizationBatchPath`. */
57
- individualFamilyOrganizationPollPath(ctx: RouteContext): string;
76
+ individualFamilyOrganizationPollPath(ctx?: RouteContext): string;
58
77
  /** Submit path: individual/family Organization search (`org.schema/Organization/_search`). */
59
- individualFamilyOrganizationSearchPath(ctx: RouteContext): string;
78
+ individualFamilyOrganizationSearchPath(ctx?: RouteContext): string;
60
79
  /** Poll path: individual/family Organization search. Pair with `individualFamilyOrganizationSearchPath`. */
61
- individualFamilyOrganizationSearchPollPath(ctx: RouteContext): string;
80
+ individualFamilyOrganizationSearchPollPath(ctx?: RouteContext): string;
62
81
  /** Submit path: individual/family Order batch (`org.schema/Order/_batch`). */
63
- individualFamilyOrderBatchPath(ctx: RouteContext): string;
82
+ individualFamilyOrderBatchPath(ctx?: RouteContext): string;
64
83
  /** Poll path: individual/family Order. Pair with `individualFamilyOrderBatchPath`. */
65
- individualFamilyOrderPollPath(ctx: RouteContext): string;
84
+ individualFamilyOrderPollPath(ctx?: RouteContext): string;
66
85
  /** Submit path: individual RelatedPerson (FHIR R4 API, `org.hl7.fhir.api/RelatedPerson/_batch`). */
67
86
  individualRelatedPersonBatchPath(ctx: RouteContext): string;
68
87
  /** Poll path: individual RelatedPerson. Pair with `individualRelatedPersonBatchPath`. */
@@ -80,9 +99,9 @@ export declare class DataspaceNodeClient {
80
99
  /** Poll path: individual Task. Pair with `individualTaskBatchPath`. */
81
100
  individualTaskPollPath(ctx: RouteContext): string;
82
101
  /** Submit path: entity Employee (`entity/org.schema/Employee/_batch`). */
83
- employeeBatchPath(ctx: RouteContext): string;
102
+ employeeBatchPath(ctx?: RouteContext): string;
84
103
  /** Poll path: entity Employee. Pair with `employeeBatchPath`. */
85
- employeePollPath(ctx: RouteContext): string;
104
+ employeePollPath(ctx?: RouteContext): string;
86
105
  /** Submit path: individual Person legacy format (`individual/org.schema/Person/_batch`). Use for older flows; prefer Organization for family onboarding. */
87
106
  individualLegacyPersonBatchPath(ctx: RouteContext): string;
88
107
  /** Submit path: individual Consent (FHIR R4, `org.hl7.fhir.r4/Consent/_batch`). */
@@ -105,18 +124,18 @@ export declare class DataspaceNodeClient {
105
124
  * Submit path: identity DCR step — binds API key to service public JWK.
106
125
  * Used internally by `authenticateBackendPkceAndExchange` (step 1 of identity-exchange.v1).
107
126
  */
108
- identityDeviceDcrPath(ctx: RouteContext): string;
127
+ identityDeviceDcrPath(ctx?: RouteContext): string;
109
128
  /** Poll path: identity DCR. Pair with `identityDeviceDcrPath`. */
110
- identityDeviceDcrPollPath(ctx: RouteContext): string;
129
+ identityDeviceDcrPollPath(ctx?: RouteContext): string;
111
130
  /**
112
131
  * Submit path: identity token exchange — id_token → SMART bearer.
113
132
  * Used internally by `authenticateBackendPkceAndExchange` (step 4 of identity-exchange.v1).
114
133
  */
115
- identityTokenExchangePath(ctx: RouteContext): string;
134
+ identityTokenExchangePath(ctx?: RouteContext): string;
116
135
  /** Poll path: identity token exchange. Pair with `identityTokenExchangePath`. */
117
- identityTokenExchangePollPath(ctx: RouteContext): string;
136
+ identityTokenExchangePollPath(ctx?: RouteContext): string;
118
137
  /** Submit path: identity license issue (`identity/auth/_issue`). */
119
- identityLicenseIssuePath(ctx: RouteContext): string;
138
+ identityLicenseIssuePath(ctx?: RouteContext): string;
120
139
  /**
121
140
  * Submit path: SMART token step — code + code_verifier → id_token.
122
141
  * Used internally by `authenticateBackendPkceAndExchange` (step 3 of identity-exchange.v1).
@@ -168,6 +187,11 @@ export declare class DataspaceNodeClient {
168
187
  * Exchange token payload against gateway token endpoint and cache the result.
169
188
  */
170
189
  requestSmartToken(input: SmartTokenExchangeInput): Promise<SmartTokenExchangeResult>;
190
+ /**
191
+ * Friendly wrapper for SMART token request via GW identity/auth token-exchange route.
192
+ * Uses one object, seconds-based polling, and constructor ctx fallback.
193
+ */
194
+ requestSmartTokenSimple(input: SmartTokenRequestSimpleInput): Promise<SmartTokenExchangeResult>;
171
195
  private _pkceS256Challenge;
172
196
  private _buildAuthDIDCommRequest;
173
197
  private resolveControllerPublicJwk;
@@ -231,6 +255,7 @@ export declare class DataspaceNodeClient {
231
255
  pollBatchResponse(path: string, request: AsyncPollRequest): Promise<{
232
256
  status: number;
233
257
  body: unknown;
258
+ retryAfterMs?: number;
234
259
  }>;
235
260
  /**
236
261
  * Submit a DIDComm batch payload and poll until the async job completes.
@@ -260,7 +285,7 @@ export declare class DataspaceNodeClient {
260
285
  * `reminderSummary` is the contextual summary of what the reminder refers to
261
286
  * (appointment, medication schedule, or another event), mapped to `based-on-display`.
262
287
  */
263
- createPhoneReminderTasks(ctx: RouteContext, input: CreatePhoneReminderTasksInput, options?: PollOptions): Promise<SubmitAndPollResult>;
288
+ createPhoneReminderTasks(ctx: RouteContext | undefined, input: CreatePhoneReminderTasksInput, options?: PollOptions): Promise<SubmitAndPollResult>;
264
289
  /** Endpoint path for medication overlap pre-check (planned GW contract). */
265
290
  individualMedicationOverlapCheckPath(ctx: RouteContext): string;
266
291
  /**
@@ -281,7 +306,7 @@ export declare class DataspaceNodeClient {
281
306
  *
282
307
  * Returns `null` when no matching registration exists.
283
308
  */
284
- searchFamilyOrganization(ctx: RouteContext, filters: {
309
+ searchFamilyOrganization(ctx: RouteContext | undefined, filters: {
285
310
  controllerPhone: string;
286
311
  usualname: string;
287
312
  birthDate?: string;
@@ -289,35 +314,92 @@ export declare class DataspaceNodeClient {
289
314
  /**
290
315
  * Activate tenant organization in GW from ICA-derived proof.
291
316
  */
292
- activateOrganizationInGatewayFromIcaProof(ctx: HostRouteContext, input: GatewayOrganizationActivationInput, options?: PollOptions): Promise<SubmitAndPollResult>;
317
+ activateOrganizationInGatewayFromIcaProof(ctx: HostRouteContext | undefined, input: GatewayOrganizationActivationInput, options?: PollOptions): Promise<SubmitAndPollResult>;
318
+ /**
319
+ * Friendly wrapper for legal organization activation.
320
+ * Accepts one object and seconds-based polling options for integrator ergonomics.
321
+ */
322
+ activateOrganizationInGatewaySimple(input: GatewayOrganizationActivationSimpleInput): Promise<SubmitAndPollResult>;
323
+ /**
324
+ * Friendly wrapper for legal organization Order confirmation.
325
+ * Accepts one object and builds payload/paths internally.
326
+ */
327
+ confirmLegalOrganizationOrderSimple(input: LegalOrganizationOrderSimpleInput): Promise<SubmitAndPollResult>;
328
+ /**
329
+ * Normalize GW async response into DIDComm message body.
330
+ *
331
+ * Transport note:
332
+ * - GW poll responses are HTTP JSON envelopes
333
+ * - business payload lives inside DIDComm `body`
334
+ *
335
+ * This helper abstracts envelope differences so consumers do not depend on
336
+ * raw `poll.body.body` paths.
337
+ */
338
+ getDidcommMessageBodyFromResponse(result: SubmitAndPollResult | PollResult | unknown): Record<string, unknown> | undefined;
339
+ /**
340
+ * Return first DIDComm business entry from a submit/poll result.
341
+ */
342
+ getFirstDidcommDataEntryFromResponse(result: SubmitAndPollResult | PollResult | unknown): Record<string, unknown> | undefined;
343
+ /**
344
+ * Extract `org.schema.Offer.identifier` from a submit/poll result.
345
+ *
346
+ * This helper normalizes canonical and legacy claim locations.
347
+ */
348
+ getOfferIdFromResponse(result: SubmitAndPollResult | PollResult | unknown): string | undefined;
349
+ /**
350
+ * Extract a UI-ready Offer preview from activation/registration responses.
351
+ */
352
+ getOfferPreviewFromResponse(result: SubmitAndPollResult | PollResult | unknown): OfferPreview;
353
+ /**
354
+ * Throws when first DIDComm entry contains a business-level error status.
355
+ */
356
+ assertFirstDidcommEntrySuccess(result: SubmitAndPollResult | PollResult | unknown, contextLabel: string): void;
293
357
  /**
294
358
  * Activate employee/member device by activation code exchange + DCR registration.
295
359
  *
296
360
  * Step 1. Exchange activation code using user id_token to obtain an initial access token.
297
361
  * Step 2. Register device keys through Device/_dcr authorized by that initial token.
298
362
  */
299
- activateEmployeeDeviceWithActivationCode(ctx: RouteContext, input: EmployeeDeviceActivationInput): Promise<EmployeeDeviceActivationResult>;
363
+ activateEmployeeDeviceWithActivationCode(ctx: RouteContext | undefined, input: EmployeeDeviceActivationInput): Promise<EmployeeDeviceActivationResult>;
364
+ /**
365
+ * Friendly wrapper for employee/member device activation.
366
+ * Uses one object, seconds-based polling, and constructor ctx fallback.
367
+ */
368
+ activateEmployeeDeviceWithActivationCodeSimple(input: EmployeeDeviceActivationSimpleInput): Promise<EmployeeDeviceActivationResult>;
300
369
  /**
301
370
  * UC 5.3 wrapper: create organization employee in entity Employee batch route.
302
371
  */
303
- createOrganizationEmployee(ctx: RouteContext, input: OrganizationEmployeeCreationInput, options?: PollOptions): Promise<SubmitAndPollResult>;
372
+ createOrganizationEmployee(ctx: RouteContext | undefined, input: OrganizationEmployeeCreationInput, options?: PollOptions): Promise<SubmitAndPollResult>;
304
373
  /**
305
374
  * UC 5.1 wrapper: bootstrap subject organization context via registration + optional order confirmation.
306
375
  */
307
- bootstrapSubjectOrganizationIndex(ctx: RouteContext, input: SubjectOrganizationBootstrapInput): Promise<SubjectOrganizationBootstrapResult>;
376
+ bootstrapSubjectOrganizationIndex(ctx: RouteContext | undefined, input: SubjectOrganizationBootstrapInput): Promise<SubjectOrganizationBootstrapResult>;
377
+ /**
378
+ * Friendly wrapper (recommended step 1): register individual organization and return Offer.
379
+ */
380
+ startIndividualOrganizationSimple(input: IndividualOrganizationBootstrapSimpleInput): Promise<IndividualOrganizationStartSimpleResult>;
381
+ /**
382
+ * Friendly wrapper (recommended step 2): confirm individual/family order from accepted offerId.
383
+ */
384
+ confirmIndividualOrganizationOrderSimple(input: IndividualOrganizationConfirmOrderSimpleInput): Promise<SubmitAndPollResult>;
385
+ /**
386
+ * Friendly wrapper (provisional): register + auto-confirm individual order.
387
+ * Prefer `startIndividualOrganizationSimple` + `confirmIndividualOrganizationOrderSimple`.
388
+ */
389
+ bootstrapIndividualOrganizationSimple(input: IndividualOrganizationBootstrapSimpleInput): Promise<IndividualOrganizationBootstrapSimpleResult>;
308
390
  /**
309
391
  * UC 5.5 wrapper: import IPS/FHIR composition and update subject index context.
310
392
  */
311
- importIpsOrFhirAndUpdateIndex(ctx: RouteContext, input: IpsOrFhirImportInput): Promise<SubmitAndPollResult>;
393
+ importIpsOrFhirAndUpdateIndex(ctx: RouteContext | undefined, input: IpsOrFhirImportInput): Promise<SubmitAndPollResult>;
312
394
  /**
313
395
  * UC 5.6 consent helper from minimal frontend fields.
314
396
  * Builds canonical Consent claims and submits/polls the Consent batch.
315
397
  */
316
- grantProfessionalAccessSimple(ctx: RouteContext, input: GrantProfessionalAccessSimpleInput): Promise<GrantProfessionalAccessSimpleResult>;
398
+ grantProfessionalAccessSimple(ctx: RouteContext | undefined, input: GrantProfessionalAccessSimpleInput): Promise<GrantProfessionalAccessSimpleResult>;
317
399
  /**
318
400
  * UC 5.7 wrapper: generate digital twin composition from subject data.
319
401
  */
320
- generateDigitalTwinFromSubjectData(ctx: RouteContext, input: DigitalTwinGenerationInput): Promise<SubmitAndPollResult>;
402
+ generateDigitalTwinFromSubjectData(ctx: RouteContext | undefined, input: DigitalTwinGenerationInput): Promise<SubmitAndPollResult>;
321
403
  /**
322
404
  * Poll a `_*-response` path repeatedly until the status is no longer 202.
323
405
  * Default: 60s timeout, 2s interval.