gdc-sdk-node-ts 2.0.2 → 2.0.4

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 (31) hide show
  1. package/README.md +72 -30
  2. package/dist/backend-profile-runtime.d.ts +48 -0
  3. package/dist/backend-profile-runtime.js +62 -0
  4. package/dist/family-organization-registration.d.ts +40 -0
  5. package/dist/family-organization-registration.js +54 -0
  6. package/dist/family-organization-search.d.ts +30 -0
  7. package/dist/family-organization-search.js +59 -0
  8. package/dist/index.d.ts +5 -0
  9. package/dist/index.js +5 -0
  10. package/dist/individual-controller-backend-runtime.d.ts +13 -0
  11. package/dist/individual-controller-backend-runtime.js +14 -0
  12. package/dist/legal-organization-onboarding-facade.d.ts +70 -0
  13. package/dist/legal-organization-onboarding-facade.js +169 -0
  14. package/dist/node-runtime-client.d.ts +47 -4
  15. package/dist/node-runtime-client.js +75 -7
  16. package/dist/orchestration/client-port.d.ts +7 -1
  17. package/dist/orchestration/individual-controller-sdk.d.ts +18 -1
  18. package/dist/orchestration/individual-controller-sdk.js +21 -0
  19. package/dist/orchestration/organization-controller-sdk.d.ts +3 -2
  20. package/dist/orchestration/organization-controller-sdk.js +3 -2
  21. package/dist/orchestration/professional-sdk.d.ts +11 -1
  22. package/dist/orchestration/professional-sdk.js +14 -0
  23. package/dist/organization-controller-backend-runtime.d.ts +65 -0
  24. package/dist/organization-controller-backend-runtime.js +83 -0
  25. package/dist/professional-backend-runtime.d.ts +36 -0
  26. package/dist/professional-backend-runtime.js +41 -0
  27. package/dist/profile-workspace.d.ts +82 -0
  28. package/dist/profile-workspace.js +127 -0
  29. package/dist/resource-operations.d.ts +24 -0
  30. package/dist/resource-operations.js +24 -1
  31. package/package.json +4 -3
@@ -0,0 +1,70 @@
1
+ import type { LegalOrganizationVerificationRouting, LegalOrganizationVerificationTransactionController, LegalOrganizationVerificationTransactionInput, LegalOrganizationVerificationTransactionOrganization, LegalOrganizationVerificationRepresentativePayload } from 'gdc-common-utils-ts/utils/legal-organization-verification-transaction';
2
+ import type { NodeOrganizationActivationInput } from './orchestration/client-port.js';
3
+ export type LegalOrganizationFormFields = Readonly<{
4
+ legalName?: string;
5
+ legalIdentifierType?: string;
6
+ legalIdentifierValue?: string;
7
+ taxId?: string;
8
+ addressCountry?: string;
9
+ controllerEmail?: string;
10
+ controllerRole?: string;
11
+ serviceCategory?: string;
12
+ serviceIdentifier?: string;
13
+ serviceUrl?: string;
14
+ }>;
15
+ export type LegalOrganizationOnboardingValidationIssue = Readonly<{
16
+ severity: 'error' | 'warning';
17
+ code: string;
18
+ message: string;
19
+ field?: keyof LegalOrganizationFormFields | 'claims' | string;
20
+ }>;
21
+ export type LegalOrganizationOnboardingValidationResult = Readonly<{
22
+ ok: boolean;
23
+ errors: LegalOrganizationOnboardingValidationIssue[];
24
+ warnings: LegalOrganizationOnboardingValidationIssue[];
25
+ normalizedClaims: Record<string, unknown>;
26
+ }>;
27
+ export interface LegalOrganizationOnboardingEditor {
28
+ setLegalName(value: string): LegalOrganizationOnboardingEditor;
29
+ setLegalIdentifierType(value: string): LegalOrganizationOnboardingEditor;
30
+ setLegalIdentifierValue(value: string): LegalOrganizationOnboardingEditor;
31
+ setTaxId(value: string): LegalOrganizationOnboardingEditor;
32
+ setAddressCountry(value: string): LegalOrganizationOnboardingEditor;
33
+ setControllerEmail(value: string): LegalOrganizationOnboardingEditor;
34
+ setControllerRole(value: string): LegalOrganizationOnboardingEditor;
35
+ setServiceCategory(value: string): LegalOrganizationOnboardingEditor;
36
+ setServiceIdentifier(value: string): LegalOrganizationOnboardingEditor;
37
+ setServiceUrl(value: string): LegalOrganizationOnboardingEditor;
38
+ getFormFields(): LegalOrganizationFormFields;
39
+ buildClaims(): Record<string, unknown>;
40
+ validate(): LegalOrganizationOnboardingValidationResult;
41
+ buildVerificationTransactionInput(input: Readonly<{
42
+ controller: LegalOrganizationVerificationTransactionController;
43
+ organization?: LegalOrganizationVerificationTransactionOrganization;
44
+ legalRepresentativePayload?: LegalOrganizationVerificationRepresentativePayload;
45
+ verification?: LegalOrganizationVerificationRouting;
46
+ attachments?: unknown[];
47
+ }>): LegalOrganizationVerificationTransactionInput;
48
+ buildActivationInput(input: Readonly<{
49
+ vpToken: string;
50
+ controller: LegalOrganizationVerificationTransactionController;
51
+ capabilities?: readonly string[];
52
+ }>): NodeOrganizationActivationInput;
53
+ }
54
+ export interface LegalOrganizationOnboardingFacade {
55
+ createDraft(initial?: LegalOrganizationFormFields): LegalOrganizationFormFields;
56
+ createEditor(initial?: LegalOrganizationFormFields): LegalOrganizationOnboardingEditor;
57
+ setLegalName(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
58
+ setLegalIdentifierType(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
59
+ setLegalIdentifierValue(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
60
+ setTaxId(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
61
+ setAddressCountry(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
62
+ setControllerEmail(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
63
+ setControllerRole(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
64
+ setServiceCategory(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
65
+ setServiceIdentifier(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
66
+ setServiceUrl(fields: LegalOrganizationFormFields, value: string): LegalOrganizationFormFields;
67
+ buildClaims(fields: LegalOrganizationFormFields): Record<string, unknown>;
68
+ validate(fields: LegalOrganizationFormFields): LegalOrganizationOnboardingValidationResult;
69
+ }
70
+ export declare function createLegalOrganizationOnboardingFacade(): LegalOrganizationOnboardingFacade;
@@ -0,0 +1,169 @@
1
+ // Copyright 2026 Antifraud Services Inc. under the Apache License, Version 2.0.
2
+ import { ClaimsOrganizationSchemaorg, ClaimsPersonSchemaorg, ClaimsServiceSchemaorg, } from 'gdc-common-utils-ts/constants/schemaorg';
3
+ import { ServiceCapability } from 'gdc-common-utils-ts/constants/service-capabilities';
4
+ import { validateLegalOrganizationOnboardingClaims, } from 'gdc-common-utils-ts/utils/legal-organization-onboarding';
5
+ function normalizeText(value) {
6
+ return typeof value === 'string' ? value.trim() : '';
7
+ }
8
+ function normalizeOptionalText(value) {
9
+ const normalized = normalizeText(value);
10
+ return normalized || undefined;
11
+ }
12
+ function cloneFields(fields) {
13
+ return { ...(fields || {}) };
14
+ }
15
+ function patchFields(fields, patch) {
16
+ return {
17
+ ...cloneFields(fields),
18
+ ...patch,
19
+ };
20
+ }
21
+ function createIssues(fields) {
22
+ const issues = [];
23
+ if (!normalizeOptionalText(fields.legalName)) {
24
+ issues.push({ severity: 'error', code: 'missing-legal-name', message: 'Legal organization name is required.', field: 'legalName' });
25
+ }
26
+ if (!normalizeOptionalText(fields.legalIdentifierType)) {
27
+ issues.push({ severity: 'error', code: 'missing-legal-identifier-type', message: 'Legal identifier type is required.', field: 'legalIdentifierType' });
28
+ }
29
+ if (!normalizeOptionalText(fields.addressCountry)) {
30
+ issues.push({ severity: 'error', code: 'missing-address-country', message: 'Address country is required.', field: 'addressCountry' });
31
+ }
32
+ if (!normalizeOptionalText(fields.controllerEmail)) {
33
+ issues.push({ severity: 'error', code: 'missing-controller-email', message: 'Controller email is required.', field: 'controllerEmail' });
34
+ }
35
+ if (!normalizeOptionalText(fields.serviceCategory)) {
36
+ issues.push({ severity: 'error', code: 'missing-service-category', message: 'Service category is required.', field: 'serviceCategory' });
37
+ }
38
+ return issues;
39
+ }
40
+ function createEditorFromFacade(facade, initial) {
41
+ let formFields = facade.createDraft(initial);
42
+ const editor = {
43
+ setLegalName(value) { formFields = facade.setLegalName(formFields, value); return editor; },
44
+ setLegalIdentifierType(value) { formFields = facade.setLegalIdentifierType(formFields, value); return editor; },
45
+ setLegalIdentifierValue(value) { formFields = facade.setLegalIdentifierValue(formFields, value); return editor; },
46
+ setTaxId(value) { formFields = facade.setTaxId(formFields, value); return editor; },
47
+ setAddressCountry(value) { formFields = facade.setAddressCountry(formFields, value); return editor; },
48
+ setControllerEmail(value) { formFields = facade.setControllerEmail(formFields, value); return editor; },
49
+ setControllerRole(value) { formFields = facade.setControllerRole(formFields, value); return editor; },
50
+ setServiceCategory(value) { formFields = facade.setServiceCategory(formFields, value); return editor; },
51
+ setServiceIdentifier(value) { formFields = facade.setServiceIdentifier(formFields, value); return editor; },
52
+ setServiceUrl(value) { formFields = facade.setServiceUrl(formFields, value); return editor; },
53
+ getFormFields() { return cloneFields(formFields); },
54
+ buildClaims() { return facade.buildClaims(formFields); },
55
+ validate() { return facade.validate(formFields); },
56
+ buildVerificationTransactionInput(input) {
57
+ return {
58
+ claims: facade.buildClaims(formFields),
59
+ controller: input.controller,
60
+ ...(input.organization ? { organization: input.organization } : {}),
61
+ ...(input.legalRepresentativePayload ? { legalRepresentativePayload: input.legalRepresentativePayload } : {}),
62
+ ...(input.verification ? { verification: input.verification } : {}),
63
+ ...(input.attachments ? { attachments: input.attachments } : {}),
64
+ };
65
+ },
66
+ buildActivationInput(input) {
67
+ const claims = facade.buildClaims(formFields);
68
+ const service = {
69
+ url: String(claims[ClaimsServiceSchemaorg.url] || '').trim() || undefined,
70
+ capabilities: [...new Set((input.capabilities || [ServiceCapability.IndexProvider, ServiceCapability.DigitalTwinReader])
71
+ .map((item) => String(item || '').trim())
72
+ .filter(Boolean))],
73
+ };
74
+ return {
75
+ vpToken: input.vpToken,
76
+ controller: input.controller,
77
+ service,
78
+ additionalClaims: claims,
79
+ };
80
+ },
81
+ };
82
+ return editor;
83
+ }
84
+ export function createLegalOrganizationOnboardingFacade() {
85
+ return {
86
+ createDraft(initial = {}) {
87
+ return cloneFields(initial);
88
+ },
89
+ createEditor(initial = {}) {
90
+ return createEditorFromFacade(this, initial);
91
+ },
92
+ setLegalName(fields, value) {
93
+ return patchFields(fields, { legalName: normalizeOptionalText(value) });
94
+ },
95
+ setLegalIdentifierType(fields, value) {
96
+ return patchFields(fields, { legalIdentifierType: normalizeOptionalText(value) });
97
+ },
98
+ setLegalIdentifierValue(fields, value) {
99
+ return patchFields(fields, { legalIdentifierValue: normalizeOptionalText(value) });
100
+ },
101
+ setTaxId(fields, value) {
102
+ return patchFields(fields, { taxId: normalizeOptionalText(value) });
103
+ },
104
+ setAddressCountry(fields, value) {
105
+ return patchFields(fields, { addressCountry: normalizeOptionalText(value) });
106
+ },
107
+ setControllerEmail(fields, value) {
108
+ const normalized = normalizeOptionalText(value);
109
+ return patchFields(fields, { controllerEmail: normalized?.toLowerCase() });
110
+ },
111
+ setControllerRole(fields, value) {
112
+ return patchFields(fields, { controllerRole: normalizeOptionalText(value) });
113
+ },
114
+ setServiceCategory(fields, value) {
115
+ return patchFields(fields, { serviceCategory: normalizeOptionalText(value) });
116
+ },
117
+ setServiceIdentifier(fields, value) {
118
+ return patchFields(fields, { serviceIdentifier: normalizeOptionalText(value) });
119
+ },
120
+ setServiceUrl(fields, value) {
121
+ return patchFields(fields, { serviceUrl: normalizeOptionalText(value) });
122
+ },
123
+ buildClaims(fields) {
124
+ const claims = {
125
+ '@context': 'org.schema',
126
+ };
127
+ if (normalizeOptionalText(fields.legalName))
128
+ claims[ClaimsOrganizationSchemaorg.legalName] = normalizeText(fields.legalName);
129
+ if (normalizeOptionalText(fields.legalIdentifierType))
130
+ claims[ClaimsOrganizationSchemaorg.identifierType] = normalizeText(fields.legalIdentifierType);
131
+ if (normalizeOptionalText(fields.legalIdentifierValue))
132
+ claims[ClaimsOrganizationSchemaorg.identifierValue] = normalizeText(fields.legalIdentifierValue);
133
+ if (normalizeOptionalText(fields.taxId))
134
+ claims[ClaimsOrganizationSchemaorg.taxId] = normalizeText(fields.taxId);
135
+ if (normalizeOptionalText(fields.addressCountry))
136
+ claims[ClaimsOrganizationSchemaorg.addressCountry] = normalizeText(fields.addressCountry);
137
+ if (normalizeOptionalText(fields.controllerEmail))
138
+ claims[ClaimsPersonSchemaorg.email] = normalizeText(fields.controllerEmail).toLowerCase();
139
+ if (normalizeOptionalText(fields.controllerRole))
140
+ claims[ClaimsPersonSchemaorg.hasOccupationalRoleValue] = normalizeText(fields.controllerRole);
141
+ if (normalizeOptionalText(fields.serviceCategory))
142
+ claims[ClaimsServiceSchemaorg.category] = normalizeText(fields.serviceCategory);
143
+ if (normalizeOptionalText(fields.serviceIdentifier))
144
+ claims[ClaimsServiceSchemaorg.identifier] = normalizeText(fields.serviceIdentifier);
145
+ if (normalizeOptionalText(fields.serviceUrl))
146
+ claims[ClaimsServiceSchemaorg.url] = normalizeText(fields.serviceUrl);
147
+ return validateLegalOrganizationOnboardingClaims(claims).normalizedClaims;
148
+ },
149
+ validate(fields) {
150
+ const normalizedClaims = this.buildClaims(fields);
151
+ const issues = createIssues(fields);
152
+ const sharedValidation = validateLegalOrganizationOnboardingClaims(normalizedClaims);
153
+ for (const error of sharedValidation.errors) {
154
+ issues.push({
155
+ severity: 'error',
156
+ code: error.code.toLowerCase(),
157
+ message: error.message,
158
+ field: error.claimPaths[0] || 'claims',
159
+ });
160
+ }
161
+ return {
162
+ ok: !issues.some((issue) => issue.severity === 'error'),
163
+ errors: issues.filter((issue) => issue.severity === 'error'),
164
+ warnings: issues.filter((issue) => issue.severity === 'warning'),
165
+ normalizedClaims,
166
+ };
167
+ },
168
+ };
169
+ }
@@ -4,10 +4,12 @@ import { type ResolvedAppInfo } from 'gdc-sdk-core-ts';
4
4
  import { type HostRouteContext, type HostedTenantLifecycleInput } from './host-onboarding.js';
5
5
  import type { NodeLegalOrganizationVerificationTransactionInput, NodeOrganizationDidBindingInput, NodeOrganizationActivationInput } from './orchestration/client-port.js';
6
6
  import { type IndividualOrganizationConfirmOrderInput, type RouteContext } from './individual-onboarding.js';
7
+ import { type EnsureFamilyOrganizationRegistrationInput } from './family-organization-registration.js';
8
+ import { type FamilyOrganizationSearchInput } from './family-organization-search.js';
7
9
  import { type SmartTokenRequestInput } from './smart-token.js';
8
10
  import { type OrganizationLicenseOrderConfirmInput } from './organization-license-order.js';
9
11
  import { type IndividualOrganizationBootstrapInput, type IndividualOrganizationStartResult } from './individual-start.js';
10
- import { type CommunicationIngestionInput, type CommunicationParticipantRuntimeSearchInput, type ClinicalBundleSearchInput, type GrantProfessionalAccessInput, type GrantProfessionalAccessResult, type IndividualMemberLifecycleInput, type IndividualOrganizationLifecycleInput, type LicenseListRuntimeSearchInput, type LicenseOfferRuntimeSearchInput, type LicenseOrderRuntimeSearchInput, type OrganizationEmployeeCreationInput, type OrganizationEmployeeLifecycleInput, type OrganizationEmployeeSearchInput, type RelatedPersonUpsertInput } from './resource-operations.js';
12
+ import { type CommunicationIngestionInput, type CommunicationParticipantRuntimeSearchInput, type ClinicalBundleSearchInput, type GrantProfessionalAccessInput, type GrantProfessionalAccessResult, type IndividualMemberLifecycleInput, type IndividualOrganizationLifecycleInput, type LicenseListRuntimeSearchInput, type LicenseOfferRuntimeSearchInput, type LicenseOrderRuntimeSearchInput, type OrganizationEmployeeCreationInput, type OrganizationEmployeeLifecycleInput, type OrganizationEmployeeSearchInput, type RevokeProfessionalAccessInput, type RevokeProfessionalAccessResult, type RelatedPersonUpsertInput } from './resource-operations.js';
11
13
  import type { LegalOrganizationOrderInput } from './host-onboarding.js';
12
14
  import type { SmartTokenExchangeResult } from './smart-token.js';
13
15
  import type { NodeRuntimeClient, PollOptions, PollResult, SubmitAndPollResult, SubmitPayload, SubmitResponse } from './orchestration/client-port.js';
@@ -120,8 +122,9 @@ export declare class HttpRuntimeClient implements NodeRuntimeClient {
120
122
  * - keeps the controller business key inside the submitted bundle payload
121
123
  *
122
124
  * Flow separation:
123
- * - `_transaction` is the first host onboarding step
124
- * - `_activate` remains a later step that consumes the ICA proof
125
+ * - `_transaction` is the new host onboarding step
126
+ * - this runtime does not chain `_activate` after `_transaction`
127
+ * - `_activate` remains available only for the older ICA `_verify` based flow
125
128
  */
126
129
  submitLegalOrganizationVerificationTransaction(hostCtx: HostRouteContext, input: NodeLegalOrganizationVerificationTransactionInput, pollOptions?: PollOptions): Promise<SubmitAndPollResult>;
127
130
  /**
@@ -140,7 +143,7 @@ export declare class HttpRuntimeClient implements NodeRuntimeClient {
140
143
  *
141
144
  * Plaintext transport note:
142
145
  * - this Node runtime currently submits `_activate` as
143
- * `application/didcomm-plaintext+json`
146
+ * `application/didcomm-plain+json`
144
147
  * - because there is no real outer JWS/JWE envelope in that mode, the
145
148
  * runtime mirrors the technical communication metadata derived from
146
149
  * `controller.publicKeyJwk` / `controller.jwks` into `meta.jws.protected`
@@ -233,6 +236,27 @@ export declare class HttpRuntimeClient implements NodeRuntimeClient {
233
236
  * Starts the onboarding flow for an individual-oriented tenant or index.
234
237
  */
235
238
  startIndividualOrganization(input: IndividualOrganizationBootstrapInput): Promise<IndividualOrganizationStartResult>;
239
+ /**
240
+ * Searches one existing family/individual registration by controller phone +
241
+ * usualname, with optional birth-date disambiguation.
242
+ */
243
+ searchFamilyOrganization(ctx: RouteContext, input: FamilyOrganizationSearchInput): Promise<Readonly<{
244
+ status: import("gdc-common-utils-ts").FamilyRegistrationStatus;
245
+ offerId?: string;
246
+ organizationId?: string;
247
+ subjectInfo?: import("gdc-common-utils-ts").FamilyOrganizationSubjectInfo;
248
+ missingFields?: string[];
249
+ updatedAt?: string;
250
+ }> | null>;
251
+ /**
252
+ * Searches one existing family/individual registration and starts the
253
+ * bootstrap flow only when the registration does not already exist.
254
+ */
255
+ ensureFamilyOrganizationRegistration(ctx: RouteContext, input: EnsureFamilyOrganizationRegistrationInput): Promise<Readonly<{
256
+ status: "already_exists" | "resume_required" | "new_created";
257
+ summary?: import("gdc-common-utils-ts").FamilyOrganizationSummary;
258
+ started?: IndividualOrganizationStartResult;
259
+ }>>;
236
260
  /**
237
261
  * Confirms the order returned by `startIndividualOrganization(...)`.
238
262
  */
@@ -289,6 +313,11 @@ export declare class HttpRuntimeClient implements NodeRuntimeClient {
289
313
  * Creates and submits a consent-oriented access grant for a professional actor.
290
314
  */
291
315
  grantProfessionalAccess(ctx: RouteContext, input: GrantProfessionalAccessInput): Promise<GrantProfessionalAccessResult>;
316
+ /**
317
+ * Closes an existing professional consent by setting its period end and
318
+ * resubmitting the updated consent resource.
319
+ */
320
+ revokeProfessionalAccess(ctx: RouteContext, input: RevokeProfessionalAccessInput): Promise<RevokeProfessionalAccessResult>;
292
321
  /**
293
322
  * Requests SMART/OpenID token material through the gateway.
294
323
  *
@@ -367,6 +396,18 @@ export declare class HttpRuntimeClient implements NodeRuntimeClient {
367
396
  */
368
397
  private wrapBundleAsGatewayTransactionMessage;
369
398
  private hostRegistryPath;
399
+ /**
400
+ * Resolves the host route segment without forcing callers to remember whether
401
+ * the same raw string is named `hostNetwork` or `sector` in a given layer.
402
+ *
403
+ * Step by step:
404
+ * - host routes use `/host/cds-{jurisdiction}/v1/{host-network}`
405
+ * - tenant routes use `/{tenantId}/cds-{jurisdiction}/v1/{tenant-sector}`
406
+ * - older live tests and adapters sometimes passed the host segment under
407
+ * `sector`, which is semantically wrong for host routes
408
+ * - new code should prefer `hostNetwork`
409
+ * - compatibility code may pass `hostNetworkOrTenantSector`
410
+ */
370
411
  private requireHostRouteContext;
371
412
  hostRegistryOrganizationTransactionPath(ctx?: HostRouteContext): string;
372
413
  hostRegistryOrganizationTransactionPollPath(ctx?: HostRouteContext): string;
@@ -394,6 +435,8 @@ export declare class HttpRuntimeClient implements NodeRuntimeClient {
394
435
  employeePurgePollPath(ctx?: RouteContext): string;
395
436
  individualFamilyOrganizationBatchPath(ctx?: RouteContext): string;
396
437
  individualFamilyOrganizationPollPath(ctx?: RouteContext): string;
438
+ individualFamilyOrganizationSearchPath(ctx?: RouteContext): string;
439
+ individualFamilyOrganizationSearchPollPath(ctx?: RouteContext): string;
397
440
  individualFamilyOrganizationTransactionPath(ctx?: RouteContext): string;
398
441
  individualFamilyOrganizationTransactionPollPath(ctx?: RouteContext): string;
399
442
  individualFamilyOrganizationDisablePath(ctx?: RouteContext): string;
@@ -2,17 +2,20 @@
2
2
  // Always create JSDoc, do not use strings inline in keys nor values, use types instead, and reuse the data test examples.
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
+ import { DIDCOMM_DEFAULT_ACCEPT_HEADER, DIDCOMM_PLAINTEXT_JSON_MEDIA_TYPE, } from 'gdc-common-utils-ts/utils/didcomm-submit';
5
6
  import { buildLegalOrganizationVerificationGatewayRequestBundle, buildOrganizationDidBindingBundle, buildAppHeaders, createBootstrapFacade, resolveAppInfo, } from 'gdc-sdk-core-ts';
6
7
  import { buildConsentClaimsSimpleWithCid } from 'gdc-common-utils-ts/utils/consent';
7
8
  import { buildDidcommPlaintextTransportMetadata } from 'gdc-common-utils-ts/utils/activation-request';
8
9
  import { pollUntilCompleteWithMethod } from './async-polling.js';
9
10
  import { confirmLegalOrganizationOrderWithDeps, HostLifecycleRequestType, HostedTenantLifecycleRequestType, submitHostedTenantLifecycleWithDeps, } from './host-onboarding.js';
10
11
  import { confirmIndividualOrganizationOrderWithDeps, } from './individual-onboarding.js';
12
+ import { ensureFamilyOrganizationRegistrationWithDeps, } from './family-organization-registration.js';
13
+ import { searchFamilyOrganizationWithDeps } from './family-organization-search.js';
11
14
  import { requestSmartTokenWithDeps } from './smart-token.js';
12
15
  import { extractOfferIdFromResponseBody, extractOfferPreviewFromResponseBody, } from './order-offer-summary.js';
13
16
  import { confirmOrganizationLicenseOrderWithDeps } from './organization-license-order.js';
14
17
  import { startIndividualOrganizationWithDeps } from './individual-start.js';
15
- import { createOrganizationEmployeeWithDeps, disableIndividualMemberWithDeps, disableIndividualOrganizationWithDeps, disableOrganizationEmployeeWithDeps, listIndividualLicenseOffersWithDeps, listIndividualLicenseOrdersWithDeps, listIndividualLicensesWithDeps, listOrganizationLicenseOffersWithDeps, listOrganizationLicenseOrdersWithDeps, listOrganizationLicensesWithDeps, grantProfessionalAccessWithDeps, ingestCommunicationAndUpdateIndexWithDeps, searchCommunicationParticipantsWithDeps, purgeIndividualMemberWithDeps, purgeIndividualOrganizationWithDeps, purgeOrganizationEmployeeWithDeps, searchIndividualLicensesWithDeps, searchIndividualLicenseOffersWithDeps, searchIndividualLicenseOrdersWithDeps, searchOrganizationLicensesWithDeps, searchOrganizationLicenseOffersWithDeps, searchOrganizationLicenseOrdersWithDeps, searchOrganizationEmployeesWithDeps, searchClinicalBundleWithDeps, searchLatestIpsWithDeps, upsertRelatedPersonAndPollWithDeps, } from './resource-operations.js';
18
+ import { createOrganizationEmployeeWithDeps, disableIndividualMemberWithDeps, disableIndividualOrganizationWithDeps, disableOrganizationEmployeeWithDeps, listIndividualLicenseOffersWithDeps, listIndividualLicenseOrdersWithDeps, listIndividualLicensesWithDeps, listOrganizationLicenseOffersWithDeps, listOrganizationLicenseOrdersWithDeps, listOrganizationLicensesWithDeps, grantProfessionalAccessWithDeps, ingestCommunicationAndUpdateIndexWithDeps, revokeProfessionalAccessWithDeps, searchCommunicationParticipantsWithDeps, purgeIndividualMemberWithDeps, purgeIndividualOrganizationWithDeps, purgeOrganizationEmployeeWithDeps, searchIndividualLicensesWithDeps, searchIndividualLicenseOffersWithDeps, searchIndividualLicenseOrdersWithDeps, searchOrganizationLicensesWithDeps, searchOrganizationLicenseOffersWithDeps, searchOrganizationLicenseOrdersWithDeps, searchOrganizationEmployeesWithDeps, searchClinicalBundleWithDeps, searchLatestIpsWithDeps, upsertRelatedPersonAndPollWithDeps, } from './resource-operations.js';
16
19
  import { submitAndPollWithMethods } from './orchestration/client-port.js';
17
20
  import { GwCoreLifecycleAction } from './constants/lifecycle.js';
18
21
  const bootstrapFacade = createBootstrapFacade();
@@ -83,7 +86,7 @@ export class HttpRuntimeClient {
83
86
  * Submits a batch payload to a gateway batch endpoint.
84
87
  */
85
88
  async submitBatch(path, payload) {
86
- return this.postJson(path, payload, 'application/didcomm-plaintext+json');
89
+ return this.postJson(path, payload, DIDCOMM_PLAINTEXT_JSON_MEDIA_TYPE);
87
90
  }
88
91
  /**
89
92
  * Polls a batch-response endpoint until the GW reports a terminal state.
@@ -107,8 +110,9 @@ export class HttpRuntimeClient {
107
110
  * - keeps the controller business key inside the submitted bundle payload
108
111
  *
109
112
  * Flow separation:
110
- * - `_transaction` is the first host onboarding step
111
- * - `_activate` remains a later step that consumes the ICA proof
113
+ * - `_transaction` is the new host onboarding step
114
+ * - this runtime does not chain `_activate` after `_transaction`
115
+ * - `_activate` remains available only for the older ICA `_verify` based flow
112
116
  */
113
117
  async submitLegalOrganizationVerificationTransaction(hostCtx, input, pollOptions) {
114
118
  const thid = `organization-verification-transaction-${runtimeUuid()}`;
@@ -428,6 +432,38 @@ export class HttpRuntimeClient {
428
432
  getOfferPreviewFromResponse: (result) => extractOfferPreviewFromResponseBody(result.poll.body),
429
433
  });
430
434
  }
435
+ /**
436
+ * Searches one existing family/individual registration by controller phone +
437
+ * usualname, with optional birth-date disambiguation.
438
+ */
439
+ async searchFamilyOrganization(ctx, input) {
440
+ return searchFamilyOrganizationWithDeps({
441
+ routeCtx: ctx,
442
+ input,
443
+ defaultTimeoutMs: 20000,
444
+ defaultIntervalMs: 1000,
445
+ individualFamilyOrganizationSearchPath: this.individualFamilyOrganizationSearchPath.bind(this),
446
+ individualFamilyOrganizationSearchPollPath: this.individualFamilyOrganizationSearchPollPath.bind(this),
447
+ submitAndPoll: this.submitAndPoll.bind(this),
448
+ });
449
+ }
450
+ /**
451
+ * Searches one existing family/individual registration and starts the
452
+ * bootstrap flow only when the registration does not already exist.
453
+ */
454
+ async ensureFamilyOrganizationRegistration(ctx, input) {
455
+ return ensureFamilyOrganizationRegistrationWithDeps({
456
+ routeCtx: ctx,
457
+ input,
458
+ defaultTimeoutMs: 20000,
459
+ defaultIntervalMs: 1000,
460
+ individualFamilyOrganizationSearchPath: this.individualFamilyOrganizationSearchPath.bind(this),
461
+ individualFamilyOrganizationSearchPollPath: this.individualFamilyOrganizationSearchPollPath.bind(this),
462
+ individualFamilyOrganizationBatchPath: this.individualFamilyOrganizationTransactionPath.bind(this),
463
+ individualFamilyOrganizationPollPath: this.individualFamilyOrganizationTransactionPollPath.bind(this),
464
+ submitAndPoll: this.submitAndPoll.bind(this),
465
+ });
466
+ }
431
467
  /**
432
468
  * Confirms the order returned by `startIndividualOrganization(...)`.
433
469
  */
@@ -564,6 +600,17 @@ export class HttpRuntimeClient {
564
600
  submitAndPoll: this.submitAndPoll.bind(this),
565
601
  });
566
602
  }
603
+ /**
604
+ * Closes an existing professional consent by setting its period end and
605
+ * resubmitting the updated consent resource.
606
+ */
607
+ async revokeProfessionalAccess(ctx, input) {
608
+ return revokeProfessionalAccessWithDeps(ctx, input, {
609
+ individualConsentR4BatchPath: this.individualConsentR4BatchPath.bind(this),
610
+ individualConsentR4PollPath: this.individualConsentR4PollPath.bind(this),
611
+ submitAndPoll: this.submitAndPoll.bind(this),
612
+ });
613
+ }
567
614
  /**
568
615
  * Requests SMART/OpenID token material through the gateway.
569
616
  *
@@ -722,7 +769,7 @@ export class HttpRuntimeClient {
722
769
  const headers = {
723
770
  ...this.defaultHeaders,
724
771
  'Content-Type': contentType,
725
- Accept: 'application/json, application/didcomm-plaintext+json, */*',
772
+ Accept: DIDCOMM_DEFAULT_ACCEPT_HEADER,
726
773
  };
727
774
  if (this.bearerToken)
728
775
  headers.Authorization = `Bearer ${this.bearerToken}`;
@@ -819,10 +866,29 @@ export class HttpRuntimeClient {
819
866
  const hostCtx = this.requireHostRouteContext(ctx);
820
867
  return `/host/cds-${encodeURIComponent(hostCtx.jurisdiction)}/v1/${encodeURIComponent(hostCtx.hostNetwork || '')}/registry/org.schema/${encodeURIComponent(resourceType)}/${encodeURIComponent(action)}`;
821
868
  }
869
+ /**
870
+ * Resolves the host route segment without forcing callers to remember whether
871
+ * the same raw string is named `hostNetwork` or `sector` in a given layer.
872
+ *
873
+ * Step by step:
874
+ * - host routes use `/host/cds-{jurisdiction}/v1/{host-network}`
875
+ * - tenant routes use `/{tenantId}/cds-{jurisdiction}/v1/{tenant-sector}`
876
+ * - older live tests and adapters sometimes passed the host segment under
877
+ * `sector`, which is semantically wrong for host routes
878
+ * - new code should prefer `hostNetwork`
879
+ * - compatibility code may pass `hostNetworkOrTenantSector`
880
+ */
822
881
  requireHostRouteContext(ctx) {
882
+ const hostCtx = (ctx || {});
823
883
  const runtimeCtx = (this.ctx || {});
824
- const jurisdiction = String(ctx?.jurisdiction || this.ctx?.jurisdiction || '').trim();
825
- const hostNetwork = String(ctx?.hostNetwork || ctx?.sector || runtimeCtx.hostNetwork || runtimeCtx.sector || '').trim();
884
+ const jurisdiction = String(hostCtx.jurisdiction || this.ctx?.jurisdiction || '').trim();
885
+ const hostNetwork = String(hostCtx.hostNetwork
886
+ || hostCtx.hostNetworkOrTenantSector
887
+ || hostCtx.sector
888
+ || runtimeCtx.hostNetwork
889
+ || runtimeCtx.hostNetworkOrTenantSector
890
+ || runtimeCtx.sector
891
+ || '').trim();
826
892
  if (!jurisdiction || !hostNetwork)
827
893
  throw new Error('Host route context is required.');
828
894
  return { jurisdiction, hostNetwork };
@@ -859,6 +925,8 @@ export class HttpRuntimeClient {
859
925
  employeePurgePollPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Employee', `${GwCoreLifecycleAction.Purge}-response`); }
860
926
  individualFamilyOrganizationBatchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', GwCoreLifecycleAction.Batch); }
861
927
  individualFamilyOrganizationPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', GwCoreLifecycleAction.BatchResponse); }
928
+ individualFamilyOrganizationSearchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', '_search'); }
929
+ individualFamilyOrganizationSearchPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', '_search-response'); }
862
930
  individualFamilyOrganizationTransactionPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', GwCoreLifecycleAction.Transaction); }
863
931
  individualFamilyOrganizationTransactionPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', GwCoreLifecycleAction.TransactionResponse); }
864
932
  individualFamilyOrganizationDisablePath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', GwCoreLifecycleAction.Disable); }
@@ -1,4 +1,5 @@
1
1
  import type { ControllerBindingInput } from 'gdc-common-utils-ts/models';
2
+ import type { FamilyOrganizationSummary } from 'gdc-common-utils-ts/utils/family-organization-summary';
2
3
  import type { LegalOrganizationVerificationTransactionInput } from 'gdc-common-utils-ts/utils/legal-organization-verification-transaction';
3
4
  import type { OrganizationDidBindingInput } from 'gdc-sdk-core-ts';
4
5
  import type { LicenseListRuntimeSearchInput, LicenseOfferRuntimeSearchInput, LicenseOrderRuntimeSearchInput } from '../resource-operations.js';
@@ -8,9 +9,11 @@ import type { EmployeeDeviceActivationResult, EmployeeDeviceActivationRequestInp
8
9
  import type { HostRouteContext, HostedTenantLifecycleInput, LegalOrganizationOrderInput } from '../host-onboarding.js';
9
10
  import type { IndividualOrganizationConfirmOrderInput, RouteContext } from '../individual-onboarding.js';
10
11
  import type { IndividualOrganizationBootstrapInput, IndividualOrganizationStartResult } from '../individual-start.js';
12
+ import type { FamilyOrganizationSearchInput } from '../family-organization-search.js';
13
+ import type { EnsureFamilyOrganizationRegistrationInput, EnsureFamilyOrganizationRegistrationResult } from '../family-organization-registration.js';
11
14
  import type { OrganizationLicenseOrderConfirmInput } from '../organization-license-order.js';
12
15
  import type { SmartTokenExchangeResult, SmartTokenRequestInput } from '../smart-token.js';
13
- import type { CommunicationIngestionInput, CommunicationParticipantRuntimeSearchInput, ClinicalBundleSearchInput, DigitalTwinGenerationInput, GrantProfessionalAccessInput, GrantProfessionalAccessResult, IndividualMemberLifecycleInput, IndividualOrganizationLifecycleInput, IpsOrFhirImportInput, OrganizationEmployeeCreationInput, OrganizationEmployeeLifecycleInput, OrganizationEmployeeSearchInput, RelatedPersonUpsertInput } from '../resource-operations.js';
16
+ import type { CommunicationIngestionInput, CommunicationParticipantRuntimeSearchInput, ClinicalBundleSearchInput, DigitalTwinGenerationInput, GrantProfessionalAccessInput, GrantProfessionalAccessResult, IndividualMemberLifecycleInput, IndividualOrganizationLifecycleInput, IpsOrFhirImportInput, OrganizationEmployeeCreationInput, OrganizationEmployeeLifecycleInput, OrganizationEmployeeSearchInput, RevokeProfessionalAccessInput, RevokeProfessionalAccessResult, RelatedPersonUpsertInput } from '../resource-operations.js';
14
17
  /**
15
18
  * Shared node-runtime activation input.
16
19
  *
@@ -74,6 +77,8 @@ export type RuntimeClient = {
74
77
  activateEmployeeDeviceWithActivationRequest?: (input: EmployeeDeviceActivationRequestInput) => Promise<EmployeeDeviceActivationResult>;
75
78
  requestSmartToken?: (input: SmartTokenRequestInput) => Promise<SmartTokenExchangeResult>;
76
79
  startIndividualOrganization?: (input: IndividualOrganizationBootstrapInput) => Promise<IndividualOrganizationStartResult>;
80
+ searchFamilyOrganization?: (ctx: RouteContext, input: FamilyOrganizationSearchInput) => Promise<FamilyOrganizationSummary | null>;
81
+ ensureFamilyOrganizationRegistration?: (ctx: RouteContext, input: EnsureFamilyOrganizationRegistrationInput) => Promise<EnsureFamilyOrganizationRegistrationResult>;
77
82
  confirmIndividualOrganizationOrder?: (input: IndividualOrganizationConfirmOrderInput) => Promise<SubmitAndPollResult>;
78
83
  disableIndividual?: (ctx: RouteContext, input: IndividualOrganizationLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
79
84
  purgeIndividual?: (ctx: RouteContext, input: IndividualOrganizationLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
@@ -84,6 +89,7 @@ export type RuntimeClient = {
84
89
  ingestCommunicationAndUpdateIndex?: (ctx: RouteContext, input: CommunicationIngestionInput) => Promise<SubmitAndPollResult>;
85
90
  searchCommunicationParticipants?: (ctx: RouteContext, input: CommunicationParticipantRuntimeSearchInput) => Promise<SubmitAndPollResult>;
86
91
  grantProfessionalAccess?: (ctx: RouteContext, input: GrantProfessionalAccessInput) => Promise<GrantProfessionalAccessResult>;
92
+ revokeProfessionalAccess?: (ctx: RouteContext, input: RevokeProfessionalAccessInput) => Promise<RevokeProfessionalAccessResult>;
87
93
  searchIndividualLicenses?: (ctx: RouteContext, input: LicenseListRuntimeSearchInput) => Promise<SubmitAndPollResult>;
88
94
  listIndividualLicenses?: (ctx: RouteContext, input?: LicenseListRuntimeSearchInput) => Promise<SubmitAndPollResult>;
89
95
  searchIndividualLicenseOffers?: (ctx: RouteContext, input: LicenseOfferRuntimeSearchInput) => Promise<SubmitAndPollResult>;
@@ -1,8 +1,11 @@
1
1
  import { type NodeRuntimeClient, type PollOptions, type SubmitAndPollResult, type SubmitPayload } from './client-port.js';
2
+ import type { FamilyOrganizationSummary } from 'gdc-common-utils-ts/utils/family-organization-summary';
3
+ import type { EnsureFamilyOrganizationRegistrationInput, EnsureFamilyOrganizationRegistrationResult } from '../family-organization-registration.js';
4
+ import type { FamilyOrganizationSearchInput } from '../family-organization-search.js';
2
5
  import type { IndividualOrganizationConfirmOrderInput, RouteContext } from '../individual-onboarding.js';
3
6
  import type { IndividualOrganizationBootstrapInput, IndividualOrganizationStartResult } from '../individual-start.js';
4
7
  import type { NodeCapability } from '../session.js';
5
- import type { ClinicalBundleSearchInput, CommunicationIngestionInput, CommunicationParticipantRuntimeSearchInput, DigitalTwinGenerationInput, GrantProfessionalAccessInput, GrantProfessionalAccessResult, IndividualMemberLifecycleInput, IndividualOrganizationLifecycleInput, IpsOrFhirImportInput, LicenseListRuntimeSearchInput, LicenseOfferRuntimeSearchInput, LicenseOrderRuntimeSearchInput, RelatedPersonUpsertInput } from '../resource-operations.js';
8
+ import type { ClinicalBundleSearchInput, CommunicationIngestionInput, CommunicationParticipantRuntimeSearchInput, DigitalTwinGenerationInput, GrantProfessionalAccessInput, GrantProfessionalAccessResult, IndividualMemberLifecycleInput, IndividualOrganizationLifecycleInput, IpsOrFhirImportInput, LicenseListRuntimeSearchInput, LicenseOfferRuntimeSearchInput, LicenseOrderRuntimeSearchInput, RevokeProfessionalAccessInput, RevokeProfessionalAccessResult, RelatedPersonUpsertInput } from '../resource-operations.js';
6
9
  import type { SmartTokenExchangeResult, SmartTokenRequestInput } from '../smart-token.js';
7
10
  /**
8
11
  * Individual-controller oriented facade over a `NodeRuntimeClient`.
@@ -21,6 +24,16 @@ export declare class IndividualControllerSdk {
21
24
  * Starts the individual onboarding/bootstrap flow.
22
25
  */
23
26
  startIndividualOrganization(input: IndividualOrganizationBootstrapInput): Promise<IndividualOrganizationStartResult>;
27
+ /**
28
+ * Searches one existing family/individual registration by the phone-first
29
+ * business key used by channel apps.
30
+ */
31
+ searchFamilyOrganization(ctx: RouteContext, input: FamilyOrganizationSearchInput): Promise<FamilyOrganizationSummary | null>;
32
+ /**
33
+ * Searches one existing family/individual registration and starts the
34
+ * bootstrap flow only when the registration is still missing.
35
+ */
36
+ ensureFamilyOrganizationRegistration(ctx: RouteContext, input: EnsureFamilyOrganizationRegistrationInput): Promise<EnsureFamilyOrganizationRegistrationResult>;
24
37
  /**
25
38
  * Confirms the order returned by `startIndividualOrganization(...)`.
26
39
  */
@@ -59,6 +72,10 @@ export declare class IndividualControllerSdk {
59
72
  * Grants access to a professional through a consent flow.
60
73
  */
61
74
  grantProfessionalAccess(ctx: RouteContext, input: GrantProfessionalAccessInput): Promise<GrantProfessionalAccessResult>;
75
+ /**
76
+ * Closes an existing professional consent by setting its period end.
77
+ */
78
+ revokeProfessionalAccess(ctx: RouteContext, input: RevokeProfessionalAccessInput): Promise<RevokeProfessionalAccessResult>;
62
79
  /**
63
80
  * Imports a FHIR/IPS payload and waits until it is indexed.
64
81
  */
@@ -23,6 +23,20 @@ export class IndividualControllerSdk {
23
23
  assertFacadeCapability(this.capabilities, ActorCapabilities.IndividualBootstrap, ActorKinds.IndividualController, 'startIndividualOrganization');
24
24
  return requireClientMethod(this.client, 'startIndividualOrganization')(input);
25
25
  }
26
+ /**
27
+ * Searches one existing family/individual registration by the phone-first
28
+ * business key used by channel apps.
29
+ */
30
+ searchFamilyOrganization(ctx, input) {
31
+ return requireClientMethod(this.client, 'searchFamilyOrganization')(ctx, input);
32
+ }
33
+ /**
34
+ * Searches one existing family/individual registration and starts the
35
+ * bootstrap flow only when the registration is still missing.
36
+ */
37
+ ensureFamilyOrganizationRegistration(ctx, input) {
38
+ return requireClientMethod(this.client, 'ensureFamilyOrganizationRegistration')(ctx, input);
39
+ }
26
40
  /**
27
41
  * Confirms the order returned by `startIndividualOrganization(...)`.
28
42
  */
@@ -85,6 +99,13 @@ export class IndividualControllerSdk {
85
99
  assertFacadeCapability(this.capabilities, ActorCapabilities.ConsentGrantProfessionalAccess, ActorKinds.IndividualController, 'grantProfessionalAccess');
86
100
  return requireClientMethod(this.client, 'grantProfessionalAccess')(ctx, input);
87
101
  }
102
+ /**
103
+ * Closes an existing professional consent by setting its period end.
104
+ */
105
+ revokeProfessionalAccess(ctx, input) {
106
+ assertFacadeCapability(this.capabilities, ActorCapabilities.ConsentGrantProfessionalAccess, ActorKinds.IndividualController, 'revokeProfessionalAccess');
107
+ return requireClientMethod(this.client, 'revokeProfessionalAccess')(ctx, input);
108
+ }
88
109
  /**
89
110
  * Imports a FHIR/IPS payload and waits until it is indexed.
90
111
  */
@@ -23,9 +23,10 @@ export declare class OrganizationControllerSdk {
23
23
  * Starts the host-side legal-organization verification transaction that GW
24
24
  * CORE forwards to ICA `_verify`.
25
25
  *
26
- * This is intentionally distinct from the later host `_activate` step:
26
+ * This is intentionally distinct from the older host `_activate` step:
27
27
  * - `_transaction` carries signed evidence and controller business binding
28
- * - `_activate` later consumes the ICA proof returned after verification
28
+ * - `_transaction` is complete on its own for the new flow
29
+ * - `_activate` remains only for the legacy ICA `_verify` compatibility path
29
30
  */
30
31
  submitLegalOrganizationVerificationTransaction(hostCtx: HostRouteContext, input: NodeLegalOrganizationVerificationTransactionInput, pollOptions?: PollOptions): Promise<SubmitAndPollResult>;
31
32
  /**
@@ -20,9 +20,10 @@ export class OrganizationControllerSdk {
20
20
  * Starts the host-side legal-organization verification transaction that GW
21
21
  * CORE forwards to ICA `_verify`.
22
22
  *
23
- * This is intentionally distinct from the later host `_activate` step:
23
+ * This is intentionally distinct from the older host `_activate` step:
24
24
  * - `_transaction` carries signed evidence and controller business binding
25
- * - `_activate` later consumes the ICA proof returned after verification
25
+ * - `_transaction` is complete on its own for the new flow
26
+ * - `_activate` remains only for the legacy ICA `_verify` compatibility path
26
27
  */
27
28
  submitLegalOrganizationVerificationTransaction(hostCtx, input, pollOptions) {
28
29
  return requireClientMethod(this.client, 'submitLegalOrganizationVerificationTransaction')(hostCtx, input, pollOptions);