@twin.org/dataspace-control-plane-service 0.0.3-next.18 → 0.0.3-next.19

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
@@ -1,6 +1,8 @@
1
- # TWIN Dataspace Control Plane Service
1
+ # Dataspace Control Plane Service
2
2
 
3
- Dataspace Control Plane contract implementation and REST endpoint definitions, implementing the Eclipse Dataspace Protocol (DSP) specification.
3
+ This package implements agreement negotiation and transfer process lifecycle management for control plane operations. It coordinates protocol-compliant state transitions and persists transfer state that can be consumed by downstream data plane components.
4
+
5
+ Its behaviour follows the [Eclipse Dataspace Protocol](https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/) and is designed for policy-aware transfer orchestration.
4
6
 
5
7
  ## Installation
6
8
 
@@ -8,104 +10,6 @@ Dataspace Control Plane contract implementation and REST endpoint definitions, i
8
10
  npm install @twin.org/dataspace-control-plane-service
9
11
  ```
10
12
 
11
- ## Overview
12
-
13
- The Control Plane manages DSP protocol operations including contract negotiation and transfer process management.
14
-
15
- ### Key Features
16
-
17
- - **Transfer Process Management**: Create, start, complete, suspend, and terminate transfers
18
- - **Contract Negotiation**: Negotiate agreements with providers via Policy Negotiation Point (PNP)
19
- - **Agreement Validation**: Validate agreements via Policy Administration Point (PAP)
20
- - **Dataset Validation**: Validate datasets via Federated Catalogue
21
- - **Entity Storage**: Persists `TransferProcessEntity` to shared storage (accessible by Data Plane)
22
- - **Token Generation**: Creates transfer tokens with configurable expiration
23
- - **State Machine**: Enforces valid state transitions per DSP specification
24
-
25
- ### Constructor Options
26
-
27
- - `loggingComponentType` (default: `logging`) - Logging component type
28
- - `identityComponentType` (default: `identity`) - Identity component for token signing
29
- - `identityAuthenticationComponentType` (default: `identity-authentication`) - Token validation component
30
- - `transferProcessEntityStorageType` (default: `transfer-process-entity`) - Entity storage for transfer processes
31
- - `policyAdministrationPointComponentType` (default: `policy-administration-point`) - Agreement lookup component
32
- - `policyNegotiationPointComponentType` (default: `policy-negotiation-point`) - Contract negotiation component
33
- - `federatedCatalogueComponentType` (default: `federated-catalogue`) - Dataset validation component
34
- - `trustComponentType` (default: `trust`) - Trust verification component
35
-
36
- ### DSP Protocols
37
-
38
- The Control Plane implements two separate DSP protocols, following the Eclipse Dataspace Protocol specification:
39
-
40
- #### 1. Contract Negotiation Protocol
41
-
42
- Negotiate agreements with providers before initiating transfers. Integrates with the Rights Management Policy Negotiation Point (PNP).
43
-
44
- **REST API Endpoints:**
45
-
46
- - `POST /control-plane/negotiations` - Initiate contract negotiation
47
- - `GET /control-plane/negotiations/:negotiationId` - Get negotiation status
48
-
49
- **Example Flow:**
50
-
51
- ```bash
52
- # Step 1: Initiate negotiation
53
- curl -X POST https://consumer.example.com/control-plane/negotiations \
54
- -H "Authorization: Bearer ${TOKEN}" \
55
- -H "Content-Type: application/json" \
56
- -d '{
57
- "offerId": "offer-from-catalog",
58
- "providerEndpoint": "https://provider.example.com/negotiations"
59
- }'
60
- # Response: { agreement: {...}, agreementId: "...", negotiationId: "..." }
61
-
62
- # Step 2: Check negotiation status (optional)
63
- curl -X GET https://consumer.example.com/control-plane/negotiations/${NEGOTIATION_ID} \
64
- -H "Authorization: Bearer ${TOKEN}"
65
- # Response: { negotiationId: "...", state: "FINALIZED", ... }
66
- ```
67
-
68
- **Service Methods:**
69
-
70
- - `negotiateAgreement()` - Initiate contract negotiation (returns agreement)
71
- - `getNegotiation()` - Retrieve negotiation state
72
-
73
- **Flow**: Catalog → Negotiation → Agreement → Transfer
74
-
75
- #### 2. Transfer Process Protocol
76
-
77
- Manage the lifecycle of data transfers using negotiated agreements.
78
-
79
- **REST API Endpoints:**
80
-
81
- - `POST /control-plane/transfers/request` - Request a transfer
82
- - `GET /control-plane/transfers/:pid` - Get transfer process state
83
- - `POST /control-plane/transfers/:pid/start` - Start a transfer
84
- - `POST /control-plane/transfers/:pid/complete` - Complete a transfer
85
- - `POST /control-plane/transfers/:pid/suspend` - Suspend a transfer
86
- - `POST /control-plane/transfers/:pid/terminate` - Terminate a transfer
87
-
88
- **Service Methods:**
89
-
90
- - `requestTransfer()` - Initiate a transfer request (requires existing agreement)
91
- - `getTransferProcess()` - Retrieve transfer process state
92
- - `startTransfer()` - Start an approved transfer
93
- - `completeTransfer()` - Mark transfer as complete
94
- - `suspendTransfer()` - Temporarily suspend a transfer
95
- - `terminateTransfer()` - Terminate a transfer
96
-
97
- ### Shared Storage Architecture
98
-
99
- The Control Plane writes `TransferProcessEntity` to entity storage, which is read by the Data Plane for `consumerPid` resolution:
100
-
101
- ```text
102
- Control Plane Data Plane
103
- │ │
104
- │ set(TransferProcessEntity) │ get(consumerPid)
105
- │ │
106
- └───── Entity Storage ──────────┘
107
- ```
108
-
109
13
  ## Examples
110
14
 
111
15
  Usage of the APIs is shown in the examples [docs/examples.md](docs/examples.md)
@@ -1,5 +1,5 @@
1
1
  import { ContextIdKeys, ContextIdStore } from "@twin.org/context";
2
- import { ArrayHelper, BaseError, ComponentFactory, Converter, GeneralError, Guards, Is, NotFoundError, RandomHelper, StringHelper, UnauthorizedError } from "@twin.org/core";
2
+ import { ArrayHelper, BaseError, ComponentFactory, Converter, GeneralError, Guards, Is, NotFoundError, RandomHelper, StringHelper, UnauthorizedError, ValidationError } from "@twin.org/core";
3
3
  import { JsonLdHelper } from "@twin.org/data-json-ld";
4
4
  import { DataspaceAppFactory, TransferProcessRole } from "@twin.org/dataspace-models";
5
5
  import { EngineCoreFactory } from "@twin.org/engine-models";
@@ -334,9 +334,8 @@ export class DataspaceControlPlaneService {
334
334
  */
335
335
  async requestTransfer(request, trustPayload) {
336
336
  const trustInfo = await TrustHelper.verifyTrust(this._trustComponent, trustPayload, "requestTransfer");
337
- const validationFailures = [];
338
- const isConformant = await DataspaceProtocolHelper.checkConformance(JsonLdHelper.toNodeObject(request), validationFailures);
339
- if (!isConformant) {
337
+ const validationFailures = await DataspaceProtocolHelper.validate(JsonLdHelper.toNodeObject(request));
338
+ if (validationFailures.length > 0) {
340
339
  await this._loggingComponent?.log({
341
340
  level: "error",
342
341
  source: DataspaceControlPlaneService.CLASS_NAME,
@@ -344,9 +343,7 @@ export class DataspaceControlPlaneService {
344
343
  message: "invalidTransferRequest",
345
344
  data: { validationFailures }
346
345
  });
347
- throw new GeneralError(DataspaceControlPlaneService.CLASS_NAME, "invalidTransferRequest", {
348
- validationFailures
349
- });
346
+ return transformToTransferError(new ValidationError(DataspaceControlPlaneService.CLASS_NAME, "request", validationFailures), request);
350
347
  }
351
348
  const providerPid = `urn:uuid:${RandomHelper.generateUuidV7()}`;
352
349
  let datasetId;
@@ -446,12 +443,16 @@ export class DataspaceControlPlaneService {
446
443
  */
447
444
  async startTransfer(message, publicOrigin, trustPayload) {
448
445
  const trustInfo = await TrustHelper.verifyTrust(this._trustComponent, trustPayload, "startTransfer");
449
- const validationFailures = [];
450
- const isConformant = await DataspaceProtocolHelper.checkConformance(JsonLdHelper.toNodeObject(message), validationFailures);
451
- if (!isConformant) {
452
- return transformToTransferError(new GeneralError(DataspaceControlPlaneService.CLASS_NAME, "invalidTransferStartMessage", {
453
- validationFailures
454
- }), message);
446
+ const validationFailures = await DataspaceProtocolHelper.validate(JsonLdHelper.toNodeObject(message));
447
+ if (validationFailures.length > 0) {
448
+ await this._loggingComponent?.log({
449
+ level: "error",
450
+ source: DataspaceControlPlaneService.CLASS_NAME,
451
+ ts: Date.now(),
452
+ message: "invalidTransferStartMessage",
453
+ data: { validationFailures }
454
+ });
455
+ return transformToTransferError(new ValidationError(DataspaceControlPlaneService.CLASS_NAME, "message", validationFailures), message);
455
456
  }
456
457
  try {
457
458
  const { entity, role } = await this.lookupTransferByMessage(message);
@@ -604,10 +605,16 @@ export class DataspaceControlPlaneService {
604
605
  */
605
606
  async completeTransfer(message, trustPayload) {
606
607
  const trustInfo = await TrustHelper.verifyTrust(this._trustComponent, trustPayload, "completeTransfer");
607
- const validationFailures = [];
608
- const isConformant = await DataspaceProtocolHelper.checkConformance(JsonLdHelper.toNodeObject(message), validationFailures);
609
- if (!isConformant) {
610
- return transformToTransferError(new GeneralError(DataspaceControlPlaneService.CLASS_NAME, "invalidTransferCompletionMessage", { validationFailures }), message);
608
+ const validationFailures = await DataspaceProtocolHelper.validate(JsonLdHelper.toNodeObject(message));
609
+ if (validationFailures.length > 0) {
610
+ await this._loggingComponent?.log({
611
+ level: "error",
612
+ source: DataspaceControlPlaneService.CLASS_NAME,
613
+ ts: Date.now(),
614
+ message: "invalidTransferCompletionMessage",
615
+ data: { validationFailures }
616
+ });
617
+ return transformToTransferError(new ValidationError(DataspaceControlPlaneService.CLASS_NAME, "message", validationFailures), message);
611
618
  }
612
619
  try {
613
620
  const { entity, role } = await this.lookupTransferByMessage(message);
@@ -653,10 +660,16 @@ export class DataspaceControlPlaneService {
653
660
  */
654
661
  async suspendTransfer(message, trustPayload) {
655
662
  const trustInfo = await TrustHelper.verifyTrust(this._trustComponent, trustPayload, "suspendTransfer");
656
- const validationFailures = [];
657
- const isConformant = await DataspaceProtocolHelper.checkConformance(JsonLdHelper.toNodeObject(message), validationFailures);
658
- if (!isConformant) {
659
- return transformToTransferError(new GeneralError(DataspaceControlPlaneService.CLASS_NAME, "invalidTransferSuspensionMessage", { validationFailures }), message);
663
+ const validationFailures = await DataspaceProtocolHelper.validate(JsonLdHelper.toNodeObject(message));
664
+ if (validationFailures.length > 0) {
665
+ await this._loggingComponent?.log({
666
+ level: "error",
667
+ source: DataspaceControlPlaneService.CLASS_NAME,
668
+ ts: Date.now(),
669
+ message: "invalidTransferSuspensionMessage",
670
+ data: { validationFailures }
671
+ });
672
+ return transformToTransferError(new ValidationError(DataspaceControlPlaneService.CLASS_NAME, "message", validationFailures), message);
660
673
  }
661
674
  try {
662
675
  const { entity, role } = await this.lookupTransferByMessage(message);
@@ -703,10 +716,16 @@ export class DataspaceControlPlaneService {
703
716
  */
704
717
  async terminateTransfer(message, trustPayload) {
705
718
  const trustInfo = await TrustHelper.verifyTrust(this._trustComponent, trustPayload, "terminateTransfer");
706
- const validationFailures = [];
707
- const isConformant = await DataspaceProtocolHelper.checkConformance(JsonLdHelper.toNodeObject(message), validationFailures);
708
- if (!isConformant) {
709
- return transformToTransferError(new GeneralError(DataspaceControlPlaneService.CLASS_NAME, "invalidTransferTerminationMessage", { validationFailures }), message);
719
+ const validationFailures = await DataspaceProtocolHelper.validate(JsonLdHelper.toNodeObject(message));
720
+ if (validationFailures.length > 0) {
721
+ await this._loggingComponent?.log({
722
+ level: "error",
723
+ source: DataspaceControlPlaneService.CLASS_NAME,
724
+ ts: Date.now(),
725
+ message: "invalidTransferTerminationMessage",
726
+ data: { validationFailures }
727
+ });
728
+ return transformToTransferError(new ValidationError(DataspaceControlPlaneService.CLASS_NAME, "message", validationFailures), message);
710
729
  }
711
730
  try {
712
731
  const { entity, role } = await this.lookupTransferByMessage(message);
@@ -1 +1 @@
1
- {"version":3,"file":"dataspaceControlPlaneService.js","sourceRoot":"","sources":["../../src/dataspaceControlPlaneService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { ITaskSchedulerComponent } from \"@twin.org/background-task-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tRandomHelper,\n\tStringHelper,\n\tUnauthorizedError,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { JsonLdHelper, type JsonLdObjectWithNoContext } from \"@twin.org/data-json-ld\";\nimport {\n\tDataspaceAppFactory,\n\tTransferProcessRole,\n\ttype IDataspaceApp,\n\ttype IDataspaceControlPlaneComponent,\n\ttype IDataspaceControlPlaneResolverComponent,\n\ttype INegotiationCallback,\n\ttype ITransferContext,\n\ttype ITransferProcess,\n\ttype TransferProcess\n} from \"@twin.org/dataspace-models\";\nimport { EngineCoreFactory } from \"@twin.org/engine-models\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { IFederatedCatalogueComponent } from \"@twin.org/federated-catalogue-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport {\n\tOdrlPolicyHelper,\n\tPolicyRequesterFactory,\n\ttype IPolicyAdministrationPointComponent,\n\ttype IPolicyNegotiationAdminPointComponent,\n\ttype IPolicyNegotiationPointComponent\n} from \"@twin.org/rights-management-models\";\nimport {\n\tDataspaceProtocolContexts,\n\tDataspaceProtocolContractNegotiationTypes,\n\tDataspaceProtocolEndpointType,\n\tDataspaceProtocolHelper,\n\tDataspaceProtocolTransferProcessStateType,\n\tDataspaceProtocolTransferProcessTypes,\n\ttype DataspaceProtocolContractNegotiationStateType,\n\ttype IDataspaceProtocolAgreement,\n\ttype IDataspaceProtocolContractNegotiation,\n\ttype IDataspaceProtocolContractNegotiationError,\n\ttype IDataspaceProtocolDataset,\n\ttype IDataspaceProtocolPolicy,\n\ttype IDataspaceProtocolTransferCompletionMessage,\n\ttype IDataspaceProtocolTransferError,\n\ttype IDataspaceProtocolTransferProcess,\n\ttype IDataspaceProtocolTransferRequestMessage,\n\ttype IDataspaceProtocolTransferStartMessage,\n\ttype IDataspaceProtocolTransferSuspensionMessage,\n\ttype IDataspaceProtocolTransferTerminationMessage\n} from \"@twin.org/standards-dataspace-protocol\";\nimport type { IDcatDataset } from \"@twin.org/standards-w3c-dcat\";\nimport { TrustHelper, type ITrustComponent } from \"@twin.org/trust-models\";\nimport { DataspaceControlPlanePolicyRequester } from \"./dataspaceControlPlanePolicyRequester.js\";\nimport type { IDataspaceControlPlaneServiceConstructorOptions } from \"./models/IDataspaceControlPlaneServiceConstructorOptions.js\";\nimport { getJsonLdId, getJsonLdType } from \"./utils/dataHelpers.js\";\nimport {\n\tisCatalogError,\n\tisCatalogErrorName,\n\ttransformToTransferError\n} from \"./utils/transferErrorUtils.js\";\n\n/**\n * Stalled negotiation threshold in milliseconds (30 minutes).\n * Negotiations that haven't received a state update within this time are considered stalled.\n */\nconst STALLED_NEGOTIATION_THRESHOLD_MS = 30 * 60 * 1000;\n\n/**\n * Dataspace Control Plane Service implementation.\n *\n * Handles contract negotiation (via PNP callbacks) and transfer process management.\n * Negotiation is fully callback-driven: negotiateAgreement() returns immediately with\n * a negotiationId, and the caller is notified via INegotiationCallback when complete.\n */\nexport class DataspaceControlPlaneService\n\timplements IDataspaceControlPlaneComponent, IDataspaceControlPlaneResolverComponent\n{\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<DataspaceControlPlaneService>();\n\n\t/**\n\t * Hardcoded requester type for PNP registration.\n\t * PNP uses this to route callbacks to our PolicyRequester.\n\t * @internal\n\t */\n\tprivate static readonly _REQUESTER_TYPE = \"dataspace-control-plane-requester\";\n\n\t/**\n\t * The logging component.\n\t * @internal\n\t */\n\tprivate readonly _loggingComponent?: ILoggingComponent;\n\n\t/**\n\t * Policy Administration Point component for Agreement lookup.\n\t * @internal\n\t */\n\tprivate readonly _policyAdministrationPointComponent: IPolicyAdministrationPointComponent;\n\n\t/**\n\t * Policy Negotiation Point component for contract negotiation.\n\t * Used to negotiate agreements with providers before creating transfer processes.\n\n\t * @internal\n\t */\n\tprivate readonly _policyNegotiationPointComponent: IPolicyNegotiationPointComponent;\n\n\t/**\n\t * Policy Negotiation Admin Point component for negotiation history.\n\t * Optional - if not configured, history queries will fail gracefully.\n\t * @internal\n\t */\n\tprivate readonly _policyNegotiationAdminPointComponent?: IPolicyNegotiationAdminPointComponent;\n\n\t/**\n\t * Federated Catalogue component for dataset validation.\n\t * Used to validate that Agreements reference valid catalog datasets.\n\t * @internal\n\t */\n\tprivate readonly _federatedCatalogueComponent: IFederatedCatalogueComponent;\n\n\t/**\n\t * Entity storage for Transfer Process entities.\n\t * Shared between Control Plane and Data Plane.\n\t * @internal\n\t */\n\tprivate readonly _transferProcessStorage: IEntityStorageConnector<TransferProcess>;\n\n\t/**\n\t * The trust component for token verification and generation.\n\t * @internal\n\t */\n\tprivate readonly _trustComponent: ITrustComponent;\n\n\t/**\n\t * Override trust generator type for token generation.\n\t * @internal\n\t */\n\tprivate readonly _overrideTrustGeneratorType?: string;\n\n\t/**\n\t * Data plane endpoint path (path only, not full URL).\n\t * Will be combined with public origin from hosting component.\n\t * If not configured, PULL transfers are not supported.\n\t * @internal\n\t */\n\tprivate readonly _dataPlanePath?: string;\n\n\t/**\n\t * Policy requester instance for handling negotiation callbacks.\n\t * @internal\n\t */\n\tprivate readonly _policyRequester: DataspaceControlPlanePolicyRequester;\n\n\t/**\n\t * Task scheduler for periodic stalled negotiation cleanup.\n\t * @internal\n\t */\n\tprivate readonly _taskScheduler?: ITaskSchedulerComponent;\n\n\t/**\n\t * Registered negotiation callbacks from upstream callers, keyed by registration key.\n\t * @internal\n\t */\n\tprivate readonly _negotiationCallbacks: Map<string, INegotiationCallback>;\n\n\t/**\n\t * Create a new instance of DataspaceControlPlaneService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IDataspaceControlPlaneServiceConstructorOptions) {\n\t\tthis._loggingComponent = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\t\toptions?.loggingComponentType ?? \"logging\"\n\t\t);\n\n\t\t// Retrieve PAP component with default\n\t\tthis._policyAdministrationPointComponent =\n\t\t\tComponentFactory.get<IPolicyAdministrationPointComponent>(\n\t\t\t\toptions?.policyAdministrationPointComponentType ?? \"policy-administration-point\"\n\t\t\t);\n\n\t\t// Retrieve PNP component with default\n\t\tthis._policyNegotiationPointComponent = ComponentFactory.get<IPolicyNegotiationPointComponent>(\n\t\t\toptions?.policyNegotiationPointComponentType ?? \"policy-negotiation-point\"\n\t\t);\n\n\t\t// Retrieve PNAP component (optional) for negotiation history\n\t\tthis._policyNegotiationAdminPointComponent =\n\t\t\tComponentFactory.getIfExists<IPolicyNegotiationAdminPointComponent>(\n\t\t\t\toptions?.policyNegotiationAdminPointComponentType ?? \"policy-negotiation-admin-point\"\n\t\t\t);\n\n\t\t// Retrieve Federated Catalogue component with default\n\t\tthis._federatedCatalogueComponent = ComponentFactory.get<IFederatedCatalogueComponent>(\n\t\t\toptions?.federatedCatalogueComponentType ?? \"federated-catalogue\"\n\t\t);\n\n\t\tthis._transferProcessStorage = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<TransferProcess>\n\t\t>(options?.transferProcessEntityStorageType ?? nameofKebabCase<TransferProcess>());\n\n\t\tthis._trustComponent = ComponentFactory.get<ITrustComponent>(\n\t\t\toptions?.trustComponentType ?? \"trust\"\n\t\t);\n\n\t\tthis._overrideTrustGeneratorType = options?.config?.overrideTrustGeneratorType;\n\n\t\tthis._dataPlanePath = Is.stringValue(options?.config?.dataPlanePath)\n\t\t\t? StringHelper.trimLeadingSlashes(options.config.dataPlanePath)\n\t\t\t: undefined;\n\n\t\tthis._taskScheduler = ComponentFactory.getIfExists<ITaskSchedulerComponent>(\n\t\t\toptions?.taskSchedulerComponentType ?? \"task-scheduler\"\n\t\t);\n\n\t\tthis._negotiationCallbacks = new Map();\n\n\t\tconst internalCallback: INegotiationCallback = {\n\t\t\tonStateChanged: async (negotiationId, state, data) => {\n\t\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cb.onStateChanged(negotiationId, state, data);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\t\tdata: { key, negotiationId, method: \"onStateChanged\", error }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCompleted: async (negotiationId, agreementId) => {\n\t\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cb.onCompleted(negotiationId, agreementId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\t\tdata: { key, negotiationId, method: \"onCompleted\", error }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailed: async (negotiationId, reason) => {\n\t\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cb.onFailed(negotiationId, reason);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\t\tdata: { key, negotiationId, method: \"onFailed\", error }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tthis._policyRequester = new DataspaceControlPlanePolicyRequester(\n\t\t\toptions?.loggingComponentType ?? \"logging\",\n\t\t\tinternalCallback\n\t\t);\n\n\t\tPolicyRequesterFactory.register(\n\t\t\tDataspaceControlPlaneService._REQUESTER_TYPE,\n\t\t\t() => this._policyRequester\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn DataspaceControlPlaneService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register a callback to receive negotiation state change notifications.\n\t * Upstream modules (e.g. supply-chain) register their callback here.\n\t * @param key A unique key identifying this callback registration.\n\t * @param callback The callback interface to register.\n\t */\n\tpublic registerNegotiationCallback(key: string, callback: INegotiationCallback): void {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(key), key);\n\t\tthis._negotiationCallbacks.set(key, callback);\n\t}\n\n\t/**\n\t * Unregister a previously registered negotiation callback.\n\t * @param key The key used when registering the callback.\n\t */\n\tpublic unregisterNegotiationCallback(key: string): void {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(key), key);\n\t\tthis._negotiationCallbacks.delete(key);\n\t}\n\n\t/**\n\t * The service needs to be started when the application is initialized.\n\t * Populates the Federated Catalogue with datasets from registered apps\n\t * and starts the stalled negotiation cleanup task.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t */\n\tpublic async start(nodeLoggingComponentType?: string): Promise<void> {\n\t\tconst engine = EngineCoreFactory.getIfExists(\"engine\");\n\t\t// Skip if no engine exists OR if this is a clone instance\n\t\tif (Is.empty(engine) || engine.isClone()) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tts: Date.now(),\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"engineCloneStart\"\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tts: Date.now(),\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tmessage: \"populatingFederatedCatalogue\"\n\t\t});\n\n\t\t// Get all registered apps\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tts: Date.now(),\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tmessage: \"discoveredApps\",\n\t\t\tdata: { count: appNames.length, apps: appNames }\n\t\t});\n\n\t\tlet registeredCount = 0;\n\t\tlet errorCount = 0;\n\n\t\t// Collect and register datasets from each app\n\t\tfor (const appName of appNames) {\n\t\t\ttry {\n\t\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appName);\n\t\t\t\tconst datasets = await app.datasetsHandled();\n\n\t\t\t\tfor (const dataset of datasets) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Ensure publisher is set (required for Federated Catalogue)\n\t\t\t\t\t\tconst datasetWithPublisher = await this.ensurePublisher(dataset);\n\n\t\t\t\t\t\t// Register with Federated Catalogue\n\t\t\t\t\t\tawait this._federatedCatalogueComponent.set(\n\t\t\t\t\t\t\tdatasetWithPublisher as unknown as IDcatDataset\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tregisteredCount++;\n\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tmessage: \"datasetRegistered\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tdatasetId: getJsonLdId(datasetWithPublisher) ?? \"\",\n\t\t\t\t\t\t\t\tappName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\terrorCount++;\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tmessage: \"datasetRegistrationFailed\",\n\t\t\t\t\t\t\terror: BaseError.fromError(error),\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tdatasetId: getJsonLdId(dataset) ?? \"\",\n\t\t\t\t\t\t\t\tappName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tmessage: \"appDatasetsRetrievalFailed\",\n\t\t\t\t\terror: BaseError.fromError(error),\n\t\t\t\t\tdata: { appName }\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tts: Date.now(),\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tmessage: \"federatedCataloguePopulated\",\n\t\t\tdata: {\n\t\t\t\tregisteredCount,\n\t\t\t\terrorCount,\n\t\t\t\ttotalApps: appNames.length\n\t\t\t}\n\t\t});\n\n\t\tif (this._taskScheduler) {\n\t\t\tawait this._taskScheduler.addTask(\n\t\t\t\t\"control-plane-negotiation-cleanup\",\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tnextTriggerTime: Date.now(),\n\t\t\t\t\t\tintervalMinutes: 5\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tasync () => {\n\t\t\t\t\tawait this.cleanupStalledNegotiations();\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the service.\n\t * Removes the stalled negotiation cleanup task.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t */\n\tpublic async stop(nodeLoggingComponentType?: string): Promise<void> {\n\t\tif (this._taskScheduler) {\n\t\t\tawait this._taskScheduler.removeTask(\"control-plane-negotiation-cleanup\");\n\t\t}\n\t}\n\n\t// ----------------------------------------------------------------------------\n\t// CONSUMER SIDE OPERATIONS\n\t// ----------------------------------------------------------------------------\n\n\t/**\n\t * Request a Transfer Process.\n\t * Creates a new Transfer Process in REQUESTED state.\n\t * @param request Transfer request message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state REQUESTED, or TransferError if the operation fails.\n\t *\n\t * Role Performed: Provider\n\t * Called by: Consumer when it wants to request a new Transfer Process\n\t */\n\tpublic async requestTransfer(\n\t\trequest: IDataspaceProtocolTransferRequestMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"requestTransfer\"\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tconst isConformant = await DataspaceProtocolHelper.checkConformance(\n\t\t\tJsonLdHelper.toNodeObject(request),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tif (!isConformant) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"invalidTransferRequest\",\n\t\t\t\tdata: { validationFailures }\n\t\t\t});\n\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidTransferRequest\", {\n\t\t\t\tvalidationFailures\n\t\t\t});\n\t\t}\n\n\t\tconst providerPid = `urn:uuid:${RandomHelper.generateUuidV7()}`;\n\n\t\tlet datasetId: string;\n\t\tlet consumerIdentity: string;\n\t\tlet providerIdentity: string;\n\t\tlet policies: IDataspaceProtocolPolicy[] = [];\n\n\t\ttry {\n\t\t\tconst agreement = await this.lookupAgreement(request.agreementId);\n\n\t\t\tif (!agreement) {\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"agreementNotFound\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tagreementId: request.agreementId,\n\t\t\t\t\t\thint: \"Agreement must exist before transfer. Use contract negotiation to create agreement first.\"\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"agreementNotFound\",\n\t\t\t\t\trequest.agreementId,\n\t\t\t\t\t{\n\t\t\t\t\t\tagreementId: request.agreementId,\n\t\t\t\t\t\thint: \"Perform contract negotiation first to create an agreement\"\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst assigneeIdentity = OdrlPolicyHelper.extractAssigneeIdentity(agreement);\n\t\t\tconst assigneeIds = ArrayHelper.fromObjectOrArray<string>(assigneeIdentity);\n\n\t\t\tif (!assigneeIds.includes(trustInfo.identity)) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"callerNotAuthorizedForAgreement\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tconsumerIdentity = trustInfo.identity;\n\n\t\t\tconst assignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\t\tconst assignerIds = ArrayHelper.fromObjectOrArray<string>(assignerIdentity);\n\t\t\tif (assignerIds.length > 1) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"multipleAssignersNotSupported\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tproviderIdentity = assignerIds[0];\n\n\t\t\tdatasetId = this.extractDatasetId(agreement);\n\n\t\t\tawait this.validateCatalogDataset(datasetId, agreement);\n\n\t\t\tpolicies = [agreement];\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, { consumerPid: request.consumerPid, providerPid });\n\t\t}\n\n\t\tconst now = new Date();\n\n\t\tconst storageEntity: TransferProcess = {\n\t\t\tid: Converter.bytesToHex(RandomHelper.generate(32)),\n\t\t\tconsumerPid: request.consumerPid,\n\t\t\tproviderPid,\n\t\t\tstate: DataspaceProtocolTransferProcessStateType.REQUESTED,\n\t\t\tagreementId: request.agreementId,\n\t\t\tdatasetId,\n\t\t\tconsumerIdentity,\n\t\t\tproviderIdentity,\n\t\t\t// offerId should reference Catalog Offer (via Agreement)\n\t\t\t// For now, use agreementId as reference (proper flow: Catalog → Negotiation → Agreement)\n\t\t\tofferId: request.agreementId,\n\t\t\tpolicies,\n\t\t\tcallbackAddress: request.callbackAddress,\n\t\t\tformat: request.format,\n\t\t\tdataAddress: request.dataAddress,\n\t\t\tdateCreated: now.toISOString(),\n\t\t\tdateModified: now.toISOString()\n\t\t};\n\n\t\tawait this._transferProcessStorage.set(storageEntity);\n\n\t\tconst entity: ITransferProcess = this.storageEntityToModel(storageEntity);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"transferProcessInitiated\",\n\t\t\tdata: {\n\t\t\t\tconsumerPid: request.consumerPid,\n\t\t\t\tproviderPid,\n\t\t\t\tagreementId: request.agreementId\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tstate: entity.state\n\t\t};\n\t}\n\n\t// ----------------------------------------------------------------------------\n\t// PROVIDER SIDE OPERATIONS\n\t// ----------------------------------------------------------------------------\n\n\t/**\n\t * Start a Transfer Process.\n\t * Transitions Transfer Process from REQUESTED to STARTED state or resumes from SUSPENDED state.\n\t * @param message Transfer start message (DSP compliant).\n\t * @param publicOrigin The public origin URL of this service.\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Start Message (DSP compliant) with dataAddress for PULL transfers, or TransferError if the operation fails.\n\t *\n\t * Role Performed: Provider / Consumer\n\t */\n\tpublic async startTransfer(\n\t\tmessage: IDataspaceProtocolTransferStartMessage,\n\t\tpublicOrigin: string,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferStartMessage | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"startTransfer\"\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tconst isConformant = await DataspaceProtocolHelper.checkConformance(\n\t\t\tJsonLdHelper.toNodeObject(message),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tif (!isConformant) {\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidTransferStartMessage\", {\n\t\t\t\t\tvalidationFailures\n\t\t\t\t}),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsProvider(trustInfo.identity, entity);\n\n\t\t\tif (\n\t\t\t\tentity.state !== DataspaceProtocolTransferProcessStateType.REQUESTED &&\n\t\t\t\tentity.state !== DataspaceProtocolTransferProcessStateType.SUSPENDED\n\t\t\t) {\n\t\t\t\treturn transformToTransferError(\n\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidStateForStart\", {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tcurrentState: entity.state\n\t\t\t\t\t}),\n\t\t\t\t\tmessage\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.STARTED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessStarted\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst response: IDataspaceProtocolTransferStartMessage = {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferStartMessage,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid\n\t\t\t};\n\n\t\t\t// ============================================================================\n\t\t\t// PULL vs PUSH Transfer Mode Detection (DSP Protocol)\n\t\t\t// ============================================================================\n\t\t\t// The transfer mode is determined by whether the consumer provided a dataAddress\n\t\t\t// in the original TransferRequestMessage:\n\t\t\t//\n\t\t\t// PULL Mode (dataAddress NOT provided by consumer):\n\t\t\t// - Consumer requests data but doesn't specify where to receive it\n\t\t\t// - Provider generates access token and returns dataAddress in TransferStartMessage\n\t\t\t// - Consumer uses the returned endpoint + token to PULL data from provider\n\t\t\t// - Flow: Consumer → GET /entities?consumerPid=X (with Bearer token) → Provider\n\t\t\t//\n\t\t\t// PUSH Mode (dataAddress PROVIDED by consumer):\n\t\t\t// - Consumer specifies endpoint where they want data sent (e.g., webhook URL)\n\t\t\t// - Provider will PUSH data to the consumer's specified endpoint\n\t\t\t// - Flow: Provider → POST to consumer's dataAddress endpoint → Consumer\n\t\t\t//\n\t\t\t// See: https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/#transfer-start-message\n\t\t\t// ============================================================================\n\n\t\t\tif (Is.empty(entity.dataAddress)) {\n\t\t\t\tif (!Is.stringValue(this._dataPlanePath)) {\n\t\t\t\t\treturn transformToTransferError(\n\t\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"pullTransfersNotSupported\", {\n\t\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\t\tproviderPid: entity.providerPid\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tmessage\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Provider signs the data access token with its own identity.\n\t\t\t\t// The subject contains the transfer context claims that the data plane\n\t\t\t\t// will verify when the consumer presents this token.\n\t\t\t\tif (!Is.stringValue(entity.providerIdentity)) {\n\t\t\t\t\tthrow new GeneralError(\n\t\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\"providerIdentityMissing\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst accessToken = await this._trustComponent.generate(\n\t\t\t\t\tentity.providerIdentity,\n\t\t\t\t\tthis._overrideTrustGeneratorType,\n\t\t\t\t\t{\n\t\t\t\t\t\tsubject: {\n\t\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\t\tagreementId: entity.agreementId,\n\t\t\t\t\t\t\tdatasetId: entity.datasetId\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tconst tokenString = accessToken as string;\n\t\t\t\tconst fullEndpoint = `${publicOrigin}/${this._dataPlanePath}`;\n\n\t\t\t\tresponse.dataAddress = {\n\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.DataAddress,\n\t\t\t\t\tendpointType: DataspaceProtocolEndpointType.HttpsQueryEndpoint,\n\t\t\t\t\tendpoint: fullEndpoint,\n\t\t\t\t\tendpointProperties: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.EndpointProperty,\n\t\t\t\t\t\t\tname: \"authorization\",\n\t\t\t\t\t\t\tvalue: tokenString\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.EndpointProperty,\n\t\t\t\t\t\t\tname: \"authType\",\n\t\t\t\t\t\t\tvalue: \"bearer\"\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t};\n\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"dataAccessTokenGenerated\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tendpoint: fullEndpoint,\n\t\t\t\t\t\ttransferMode: \"PULL\"\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// PUSH MODE: Provider will push data to consumer's specified endpoint\n\t\t\t\t// The consumer provided dataAddress in TransferRequestMessage, indicating\n\t\t\t\t// where they want data sent. Provider acknowledges and will push data there.\n\t\t\t\t//\n\t\t\t\t// TODO: PUSH transfer implementation (RFC-007 future work)\n\t\t\t\t// Implementation would need to:\n\t\t\t\t// 1. Generate provider's own trust token to authenticate when pushing to consumer\n\t\t\t\t// 2. Validate consumer's dataAddress endpoint is reachable\n\t\t\t\t// 3. Extract any consumer-provided authorization from endpointProperties\n\t\t\t\t// 4. Schedule background task to push data to consumer's endpoint\n\t\t\t\t// 5. POST data to entity.dataAddress.endpoint with provider's trust token\n\t\t\t\t// 6. Implement retry logic with exponential backoff\n\t\t\t\t// 7. Send TransferCompletionMessage when push completes successfully\n\t\t\t\t//\n\t\t\t\t// Trust flow for PUSH (mirror of PULL):\n\t\t\t\t// - PULL: Provider generates token → Consumer uses to authenticate when pulling\n\t\t\t\t// - PUSH: Provider generates token → Provider uses to authenticate when pushing\n\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"pushTransferModeNotImplemented\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tconsumerEndpoint: entity.dataAddress.endpoint,\n\t\t\t\t\t\ttransferMode: \"PUSH\"\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t// ----------------------------------------------------------------------------\n\t// SHARED STATE MANAGEMENT OPERATIONS (Either Side)\n\t// ----------------------------------------------------------------------------\n\n\t/**\n\t * Complete a Transfer Process.\n\t * @param message Transfer completion message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state COMPLETED, or TransferError if the operation fails.\n\t */\n\tpublic async completeTransfer(\n\t\tmessage: IDataspaceProtocolTransferCompletionMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"completeTransfer\"\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tconst isConformant = await DataspaceProtocolHelper.checkConformance(\n\t\t\tJsonLdHelper.toNodeObject(message),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tif (!isConformant) {\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew GeneralError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"invalidTransferCompletionMessage\",\n\t\t\t\t\t{ validationFailures }\n\t\t\t\t),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsConsumer(trustInfo.identity, entity);\n\n\t\t\tif (entity.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\t\treturn transformToTransferError(\n\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidStateForComplete\", {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tcurrentState: entity.state\n\t\t\t\t\t}),\n\t\t\t\t\tmessage\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.COMPLETED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessCompleted\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t/**\n\t * Suspend a Transfer Process.\n\t * @param message Transfer suspension message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state SUSPENDED, or TransferError if the operation fails.\n\t */\n\tpublic async suspendTransfer(\n\t\tmessage: IDataspaceProtocolTransferSuspensionMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"suspendTransfer\"\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tconst isConformant = await DataspaceProtocolHelper.checkConformance(\n\t\t\tJsonLdHelper.toNodeObject(message),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tif (!isConformant) {\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew GeneralError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"invalidTransferSuspensionMessage\",\n\t\t\t\t\t{ validationFailures }\n\t\t\t\t),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsTransferParty(trustInfo.identity, entity);\n\n\t\t\tif (entity.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\t\treturn transformToTransferError(\n\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidStateForSuspend\", {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tcurrentState: entity.state\n\t\t\t\t\t}),\n\t\t\t\t\tmessage\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.SUSPENDED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessSuspended\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole,\n\t\t\t\t\treason: message.reason\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t/**\n\t * Terminate a Transfer Process.\n\t * @param message Transfer termination message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state TERMINATED, or TransferError if the operation fails.\n\t */\n\tpublic async terminateTransfer(\n\t\tmessage: IDataspaceProtocolTransferTerminationMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"terminateTransfer\"\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tconst isConformant = await DataspaceProtocolHelper.checkConformance(\n\t\t\tJsonLdHelper.toNodeObject(message),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tif (!isConformant) {\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew GeneralError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"invalidTransferTerminationMessage\",\n\t\t\t\t\t{ validationFailures }\n\t\t\t\t),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsTransferParty(trustInfo.identity, entity);\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.TERMINATED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessTerminated\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole,\n\t\t\t\t\treason: message.reason\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t/**\n\t * Get Transfer Process state.\n\t * @param pid Process ID (consumerPid or providerPid).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with current state, or TransferError if the operation fails.\n\t */\n\tpublic async getTransferProcess(\n\t\tpid: string,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"getTransferProcess\"\n\t\t);\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByPid(pid);\n\n\t\t\tthis.validateCallerIsTransferParty(trustInfo.identity, entity);\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessQueried\",\n\t\t\t\tdata: {\n\t\t\t\t\tpid,\n\t\t\t\t\trole,\n\t\t\t\t\tstate: entity.state\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, { consumerPid: pid, providerPid: pid });\n\t\t}\n\t}\n\n\t// ============================================================================\n\t// CONTRACT NEGOTIATION\n\t// ============================================================================\n\n\t/**\n\t * Negotiate a contract agreement with a provider.\n\t * Returns immediately with a negotiationId. The caller is notified\n\t * via the registered INegotiationCallback when the negotiation completes.\n\t *\n\t * @param datasetId The dataset ID from the provider's catalog.\n\t * @param offerId The offer ID from the provider's catalog.\n\t * @param providerEndpoint The provider's contract negotiation endpoint URL.\n\t * @param publicOrigin The public origin URL of this control plane (for callbacks).\n\t * @param trustPayload The trust payload for authentication.\n\t * @returns The negotiation ID. Use the registered callback for completion notification.\n\t */\n\tpublic async negotiateAgreement(\n\t\tdatasetId: string,\n\t\tofferId: string,\n\t\tproviderEndpoint: string,\n\t\tpublicOrigin: string,\n\t\ttrustPayload: unknown\n\t): Promise<{ negotiationId: string }> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(offerId), offerId);\n\t\tGuards.stringValue(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(providerEndpoint),\n\t\t\tproviderEndpoint\n\t\t);\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(publicOrigin), publicOrigin);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"startingContractNegotiation\",\n\t\t\tdata: { datasetId, offerId, providerEndpoint, publicOrigin }\n\t\t});\n\n\t\tconst catalogResult = await this._federatedCatalogueComponent.get(datasetId);\n\n\t\tif (isCatalogError(catalogResult)) {\n\t\t\tif (isCatalogErrorName(catalogResult, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"datasetNotFoundInCatalog\",\n\t\t\t\t\tdatasetId,\n\t\t\t\t\t{\n\t\t\t\t\t\tdatasetId,\n\t\t\t\t\t\tofferId,\n\t\t\t\t\t\tproviderEndpoint\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"catalogLookupFailedForNegotiation\",\n\t\t\t\t{\n\t\t\t\t\tdatasetId,\n\t\t\t\t\tofferId,\n\t\t\t\t\tproviderEndpoint,\n\t\t\t\t\terrorCode: catalogResult.code\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst rawOffers = this.getCatalogDatasetPolicies(catalogResult);\n\n\t\tif (!Is.arrayValue(rawOffers)) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"datasetHasNoOffers\", {\n\t\t\t\tofferId,\n\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\"\n\t\t\t});\n\t\t}\n\n\t\tconst catalogOffers = rawOffers.filter(offer => Is.object<IDataspaceProtocolPolicy>(offer));\n\n\t\tif (!Is.arrayValue(catalogOffers)) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"datasetHasNoValidOffers\", {\n\t\t\t\tofferId,\n\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\"\n\t\t\t});\n\t\t}\n\n\t\tconst matchingOffer = catalogOffers.find((offer: IDataspaceProtocolPolicy) => {\n\t\t\tconst offerUid = OdrlPolicyHelper.getUid(offer);\n\t\t\treturn offerUid === offerId;\n\t\t});\n\n\t\tif (!matchingOffer) {\n\t\t\tconst availableOffers = catalogOffers\n\t\t\t\t.map((o: IDataspaceProtocolPolicy) => OdrlPolicyHelper.getUid(o) ?? \"unknown\")\n\t\t\t\t.join(\", \");\n\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"offerNotFoundInDataset\",\n\t\t\t\tofferId,\n\t\t\t\t{\n\t\t\t\t\tofferId,\n\t\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\",\n\t\t\t\t\tavailableOffers\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"offerFoundInCatalog\",\n\t\t\tdata: {\n\t\t\t\tofferId,\n\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\",\n\t\t\t\tofferType: getJsonLdType(matchingOffer)\n\t\t\t}\n\t\t});\n\n\t\tconst negotiationId = await this._policyNegotiationPointComponent.sendRequestToProvider(\n\t\t\tproviderEndpoint,\n\t\t\tDataspaceControlPlaneService._REQUESTER_TYPE,\n\t\t\tofferId,\n\t\t\tpublicOrigin\n\t\t);\n\n\t\tif (!negotiationId) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"negotiationInitiationFailed\",\n\t\t\t\t{\n\t\t\t\t\tofferId,\n\t\t\t\t\tproviderEndpoint\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tthis._policyRequester.trackNegotiation(negotiationId);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"negotiationInitiated\",\n\t\t\tdata: { negotiationId, offerId }\n\t\t});\n\n\t\treturn { negotiationId };\n\t}\n\n\t/**\n\t * Get the current state of a contract negotiation.\n\t * @param negotiationId The unique identifier of the negotiation.\n\t * @param trustPayload The trust payload for authentication.\n\t * @returns Current state of the negotiation.\n\t */\n\tpublic async getNegotiation(\n\t\tnegotiationId: string,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolContractNegotiation | IDataspaceProtocolContractNegotiationError> {\n\t\tGuards.stringValue(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(negotiationId),\n\t\t\tnegotiationId\n\t\t);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"getNegotiation\",\n\t\t\tdata: { negotiationId }\n\t\t});\n\n\t\tconst result = await this._policyNegotiationPointComponent.getNegotiation(\n\t\t\tnegotiationId,\n\t\t\ttrustPayload\n\t\t);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"negotiationStateRetrieved\",\n\t\t\tdata: {\n\t\t\t\tnegotiationId,\n\t\t\t\ttype: getJsonLdType(result),\n\t\t\t\tstate: (result as IDataspaceProtocolContractNegotiation).state\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get negotiation history.\n\t * @param state Optional filter by negotiation state.\n\t * @param cursor Optional pagination cursor.\n\t * @param trustPayload Trust payload for authentication.\n\t * @returns List of negotiation history entries with pagination.\n\t */\n\tpublic async getNegotiationHistory(\n\t\tstate: string | undefined,\n\t\tcursor: string | undefined,\n\t\ttrustPayload: unknown\n\t): Promise<{\n\t\tnegotiations: {\n\t\t\tnegotiation:\n\t\t\t\t| IDataspaceProtocolContractNegotiation\n\t\t\t\t| IDataspaceProtocolContractNegotiationError;\n\t\t\tcreatedAt: string;\n\t\t\tofferId?: string;\n\t\t\tagreementId?: string;\n\t\t}[];\n\t\tcursor?: string;\n\t\tcount: number;\n\t}> {\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"getNegotiationHistory\",\n\t\t\tdata: { state, cursor }\n\t\t});\n\n\t\tif (!this._policyNegotiationAdminPointComponent) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"pnapNotConfigured\", {\n\t\t\t\tmessage:\n\t\t\t\t\t\"Policy Negotiation Admin Point not configured. \" +\n\t\t\t\t\t\"Set policyNegotiationAdminPointComponentType in constructor options.\"\n\t\t\t});\n\t\t}\n\n\t\tconst { items: pnapNegotiations, cursor: nextCursor } =\n\t\t\tawait this._policyNegotiationAdminPointComponent.query(\n\t\t\t\tstate as DataspaceProtocolContractNegotiationStateType | undefined,\n\t\t\t\tcursor\n\t\t\t);\n\n\t\tconst negotiations = pnapNegotiations.map(pnapNeg => {\n\t\t\tconst dspNegotiation: IDataspaceProtocolContractNegotiation = {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolContractNegotiationTypes.ContractNegotiation,\n\t\t\t\tconsumerPid: pnapNeg.id,\n\t\t\t\tproviderPid: pnapNeg.correlationId,\n\t\t\t\tstate: pnapNeg.state\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tnegotiation: dspNegotiation,\n\t\t\t\tcreatedAt: pnapNeg.dateCreated,\n\t\t\t\tofferId: OdrlPolicyHelper.getUid(pnapNeg.offer),\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(pnapNeg.agreement)\n\t\t\t};\n\t\t});\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"negotiationHistoryRetrieved\",\n\t\t\tdata: {\n\t\t\t\tcount: negotiations.length,\n\t\t\t\tstate,\n\t\t\t\thasCursor: Boolean(nextCursor)\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tnegotiations,\n\t\t\tcursor: nextCursor,\n\t\t\tcount: negotiations.length\n\t\t};\n\t}\n\n\t// ============================================================================\n\t// RESOLVER METHODS - IDataspaceControlPlaneResolverComponent\n\t// ============================================================================\n\n\t/**\n\t * Resolve consumerPid to Transfer Context.\n\t * @param consumerPid Consumer Process ID.\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Context with Agreement, datasetId, and Transfer Process metadata.\n\t */\n\tpublic async resolveConsumerPid(\n\t\tconsumerPid: string,\n\t\ttrustPayload: unknown\n\t): Promise<ITransferContext> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tawait TrustHelper.verifyTrust(this._trustComponent, trustPayload, \"resolveConsumerPid\");\n\n\t\tconst storageEntity = await this._transferProcessStorage.get(consumerPid);\n\n\t\tif (!storageEntity) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"transferProcessNotFound\",\n\t\t\t\tundefined,\n\t\t\t\t{ consumerPid }\n\t\t\t);\n\t\t}\n\n\t\tconst entity = this.storageEntityToModel(storageEntity);\n\n\t\tif (entity.state === DataspaceProtocolTransferProcessStateType.TERMINATED) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"transferProcessTerminated\", {\n\t\t\t\tconsumerPid\n\t\t\t});\n\t\t}\n\n\t\tconst agreement = await this.lookupAgreement(entity.agreementId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst currentOrgId = contextIds?.[ContextIdKeys.Organization];\n\n\t\tif (!currentOrgId) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"organizationContextMissing\",\n\t\t\t\t{\n\t\t\t\t\tconsumerPid\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst assignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\tconst assignerIds = ArrayHelper.fromObjectOrArray<string>(assignerIdentity);\n\n\t\tif (!assignerIds.includes(currentOrgId)) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementAssignerMismatch\",\n\t\t\t\t{\n\t\t\t\t\tconsumerPid,\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\texpectedOrgId: currentOrgId,\n\t\t\t\t\tactualAssigner: assignerIds.join(\", \")\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"resolvedConsumerPid\",\n\t\t\tdata: {\n\t\t\t\tconsumerPid,\n\t\t\t\tdatasetId: entity.datasetId,\n\t\t\t\tstate: entity.state,\n\t\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\torganizationId: currentOrgId\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tagreement,\n\t\t\tdatasetId: entity.datasetId,\n\t\t\tofferId: entity.offerId,\n\t\t\tstate: entity.state,\n\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\tdataAddress: entity.dataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Resolve providerPid to Transfer Context.\n\t * @param providerPid Provider Process ID.\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Context with Agreement, datasetId, and Transfer Process metadata.\n\t */\n\tpublic async resolveProviderPid(\n\t\tproviderPid: string,\n\t\ttrustPayload: unknown\n\t): Promise<ITransferContext> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(providerPid), providerPid);\n\n\t\tawait TrustHelper.verifyTrust(this._trustComponent, trustPayload, \"resolveProviderPid\");\n\n\t\tconst { entity } = await this.lookupTransferByPid(providerPid);\n\n\t\tif (entity.state === DataspaceProtocolTransferProcessStateType.TERMINATED) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"transferProcessTerminatedProvider\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst agreement = await this.lookupAgreement(entity.agreementId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst currentOrgId = contextIds?.[ContextIdKeys.Organization];\n\n\t\tif (!currentOrgId) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"organizationContextMissingProvider\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\t// Extract assigner UID (can be string, array, or IOdrlParty object)\n\n\t\tconst assignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\tconst assignerIds = ArrayHelper.fromObjectOrArray<string>(assignerIdentity);\n\n\t\tif (!assignerIds.includes(currentOrgId)) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementAssignerMismatchProvider\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid,\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\texpectedOrgId: currentOrgId,\n\t\t\t\t\tactualAssigner: assignerIds.join(\", \")\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\t// Validate that Agreement assignee matches expected consumer identity\n\t\t// This ensures we're pushing to the correct consumer\n\t\t// If assignee is undefined but consumerIdentity has a value, this is also a mismatch\n\t\tconst assigneeIdentity = OdrlPolicyHelper.extractAssigneeIdentity(agreement);\n\t\tconst assigneeIds = ArrayHelper.fromObjectOrArray<string>(assigneeIdentity);\n\n\t\tif (\n\t\t\t!Is.stringValue(entity.consumerIdentity) ||\n\t\t\t!assigneeIds.includes(entity.consumerIdentity)\n\t\t) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementAssigneeMismatch\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid,\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\texpectedConsumerIdentity: entity.consumerIdentity,\n\t\t\t\t\tactualAssignee: assigneeIds.join(\", \")\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"resolvedProviderPid\",\n\t\t\tdata: {\n\t\t\t\tproviderPid,\n\t\t\t\tdatasetId: entity.datasetId,\n\t\t\t\tstate: entity.state,\n\t\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\torganizationId: currentOrgId\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tagreement,\n\t\t\tdatasetId: entity.datasetId,\n\t\t\tofferId: entity.offerId,\n\t\t\tstate: entity.state,\n\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\tdataAddress: entity.dataAddress\n\t\t};\n\t}\n\n\t// ============================================================================\n\t// PRIVATE HELPER METHODS\n\t// ============================================================================\n\n\t/**\n\t * Cleanup stalled negotiations.\n\t * Called periodically by the task scheduler.\n\t * @internal\n\t */\n\tprivate async cleanupStalledNegotiations(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tconst stalled: string[] = [];\n\n\t\tfor (const [negotiationId, state] of this._policyRequester.getActiveNegotiations()) {\n\t\t\tif (now - state.updatedAt > STALLED_NEGOTIATION_THRESHOLD_MS) {\n\t\t\t\tstalled.push(negotiationId);\n\t\t\t}\n\t\t}\n\n\t\tfor (const negotiationId of stalled) {\n\t\t\tthis._policyRequester.removeNegotiation(negotiationId);\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"stalledNegotiationCleanedUp\",\n\t\t\t\tdata: { negotiationId }\n\t\t\t});\n\n\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait cb.onFailed(negotiationId, \"negotiationStalled\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\tdata: { key, negotiationId, method: \"onFailed\", error }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (stalled.length > 0) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"stalledNegotiationsCleanupComplete\",\n\t\t\t\tdata: { cleanedUp: stalled.length }\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Convert a storage entity to model.\n\t * @param storageEntity The entity from storage.\n\t * @returns The model representation.\n\t * @internal\n\t */\n\tprivate storageEntityToModel(storageEntity: TransferProcess): ITransferProcess {\n\t\treturn {\n\t\t\tid: storageEntity.id,\n\t\t\tconsumerPid: storageEntity.consumerPid,\n\t\t\tproviderPid: storageEntity.providerPid,\n\t\t\tstate: storageEntity.state,\n\t\t\tagreementId: storageEntity.agreementId,\n\t\t\tdatasetId: storageEntity.datasetId,\n\t\t\tofferId: storageEntity.offerId,\n\t\t\tconsumerIdentity: storageEntity.consumerIdentity,\n\t\t\tproviderIdentity: storageEntity.providerIdentity,\n\t\t\tformat: storageEntity.format,\n\t\t\tcallbackAddress: storageEntity.callbackAddress,\n\t\t\tdateCreated: new Date(storageEntity.dateCreated),\n\t\t\tdateModified: new Date(storageEntity.dateModified),\n\t\t\tpolicies: storageEntity.policies,\n\t\t\tdataAddress: storageEntity.dataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Convert a model to storage entity.\n\t * @param entity The model representation.\n\t * @returns The entity for storage.\n\t * @internal\n\t */\n\tprivate modelToStorageEntity(entity: ITransferProcess): TransferProcess {\n\t\treturn {\n\t\t\tid: entity.id,\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tstate: entity.state,\n\t\t\tagreementId: entity.agreementId,\n\t\t\tdatasetId: entity.datasetId,\n\t\t\tofferId: entity.offerId,\n\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\tformat: entity.format,\n\t\t\tcallbackAddress: entity.callbackAddress,\n\t\t\tdateCreated: entity.dateCreated.toISOString(),\n\t\t\tdateModified: entity.dateModified.toISOString(),\n\t\t\tpolicies: entity.policies,\n\t\t\tdataAddress: entity.dataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Look up Agreement from PAP.\n\t * @param agreementId Agreement ID.\n\t * @returns Agreement.\n\t * @internal\n\t */\n\tprivate async lookupAgreement(agreementId: string): Promise<IDataspaceProtocolAgreement> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(agreementId), agreementId);\n\n\t\tlet agreement;\n\t\ttry {\n\t\t\tagreement = await this._policyAdministrationPointComponent.getAgreement(agreementId);\n\t\t} catch (error) {\n\t\t\tif (BaseError.isErrorName(error, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementLookupFailed\",\n\t\t\t\t{ agreementId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\n\t\treturn agreement;\n\t}\n\n\t/**\n\t * Validate that the caller's verified identity matches the consumer of a transfer process.\n\t * @param callerIdentity The identity from the verified trust token.\n\t * @param entity The transfer process entity.\n\t * @throws UnauthorizedError if the caller is not the consumer.\n\t * @internal\n\t */\n\tprivate validateCallerIsConsumer(callerIdentity: string, entity: ITransferProcess): void {\n\t\tif (callerIdentity !== entity.consumerIdentity) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"callerNotAuthorizedAsConsumer\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Validate that the caller's verified identity matches the provider of a transfer process.\n\t * @param callerIdentity The identity from the verified trust token.\n\t * @param entity The transfer process entity.\n\t * @throws UnauthorizedError if the caller is not the provider.\n\t * @internal\n\t */\n\tprivate validateCallerIsProvider(callerIdentity: string, entity: ITransferProcess): void {\n\t\tif (callerIdentity !== entity.providerIdentity) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"callerNotAuthorizedAsProvider\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Validate that the caller's verified identity matches either the consumer or provider of a transfer process.\n\t * @param callerIdentity The identity from the verified trust token.\n\t * @param entity The transfer process entity.\n\t * @throws UnauthorizedError if the caller is not a party to the transfer.\n\t * @internal\n\t */\n\tprivate validateCallerIsTransferParty(callerIdentity: string, entity: ITransferProcess): void {\n\t\tif (callerIdentity !== entity.consumerIdentity && callerIdentity !== entity.providerIdentity) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"callerNotAuthorizedForTransfer\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Extract dataset ID from Agreement target.\n\t * @param agreement Agreement.\n\t * @returns Dataset ID.\n\t * @internal\n\t */\n\tprivate extractDatasetId(agreement: IDataspaceProtocolAgreement): string {\n\t\tif (Is.empty(agreement.target)) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"agreementMissingTarget\", {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement)\n\t\t\t});\n\t\t}\n\n\t\tconst targetIds = OdrlPolicyHelper.getTargets(agreement);\n\n\t\tif (targetIds.length === 0) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"agreementTargetMissingUid\", {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement)\n\t\t\t});\n\t\t}\n\n\t\t// Validate single target, multiple targets are not currently supported\n\t\tif (targetIds.length > 1) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementMultipleTargetsNotSupported\",\n\t\t\t\t{\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\ttargetCount: targetIds.length\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn targetIds[0];\n\t}\n\n\t/**\n\t * Validate that the dataset exists in the Federated Catalogue.\n\t * @param datasetId Dataset identifier extracted from Agreement.\n\t * @param agreement The Agreement being validated.\n\t * @internal\n\t */\n\tprivate async validateCatalogDataset(\n\t\tdatasetId: string,\n\t\tagreement: IDataspaceProtocolAgreement\n\t): Promise<void> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tGuards.object<IDataspaceProtocolAgreement>(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(agreement),\n\t\t\tagreement\n\t\t);\n\n\t\t// Lookup dataset in catalog\n\t\tconst catalogResult = await this._federatedCatalogueComponent.get(datasetId);\n\n\t\tif (isCatalogError(catalogResult)) {\n\t\t\tif (isCatalogErrorName(catalogResult, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"datasetNotInCatalog\",\n\t\t\t\t\tdatasetId,\n\t\t\t\t\t{\n\t\t\t\t\t\tdatasetId,\n\t\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement)\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"catalogLookupFailed\", {\n\t\t\t\tdatasetId,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\terrorCode: catalogResult.code\n\t\t\t});\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"catalogDatasetFound\",\n\t\t\tdata: {\n\t\t\t\tdatasetId,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\tdatasetTitle: catalogResult[\"dcterms:title\"]\n\t\t\t}\n\t\t});\n\n\t\tawait this.validateAgreementMatchesOffer(agreement, catalogResult);\n\t}\n\n\t/**\n\t * Extract PID from DSP message and lookup Transfer Process with role detection.\n\t * @param message DSP protocol message with consumerPid and/or providerPid fields.\n\t * @returns Transfer Process entity and our role in this transfer.\n\t * @internal\n\t */\n\tprivate async lookupTransferByMessage(message: {\n\t\tconsumerPid?: string;\n\t\tproviderPid?: string;\n\t}): Promise<{\n\t\tentity: ITransferProcess;\n\t\trole: TransferProcessRole;\n\t}> {\n\t\tconst pid = message.consumerPid ?? message.providerPid;\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, \"pid\", pid);\n\n\t\treturn this.lookupTransferByPid(pid);\n\t}\n\n\t/**\n\t * Lookup Transfer Process by PID and determine our role.\n\t * @param pid Either consumerPid or providerPid.\n\t * @returns Transfer Process entity and our role in this transfer.\n\t * @internal\n\t */\n\tprivate async lookupTransferByPid(pid: string): Promise<{\n\t\tentity: ITransferProcess;\n\t\trole: TransferProcessRole;\n\t}> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(pid), pid);\n\n\t\t// Check if pid is a consumerPid (primary key lookup)\n\t\tconst storageEntity = await this._transferProcessStorage.get(pid);\n\n\t\tif (storageEntity) {\n\t\t\treturn {\n\t\t\t\tentity: this.storageEntityToModel(storageEntity),\n\t\t\t\trole: TransferProcessRole.Consumer\n\t\t\t};\n\t\t}\n\n\t\t// Check if pid is a providerPid (secondary key lookup)\n\t\tconst providerPidEntity = await this._transferProcessStorage.get(pid, \"providerPid\");\n\t\tif (providerPidEntity) {\n\t\t\treturn {\n\t\t\t\tentity: this.storageEntityToModel(providerPidEntity),\n\t\t\t\trole: TransferProcessRole.Provider\n\t\t\t};\n\t\t}\n\n\t\tthrow new NotFoundError(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\"transferProcessNotFound\",\n\t\t\tpid,\n\t\t\t{\n\t\t\t\tpid\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Get raw policy entries from a catalog dataset.\n\t * @param catalogDataset Catalog dataset.\n\t * @returns Raw policy entries.\n\t * @internal\n\t */\n\tprivate getCatalogDatasetPolicies(\n\t\tcatalogDataset: IDcatDataset | IDataspaceProtocolDataset\n\t): JsonLdObjectWithNoContext<IDataspaceProtocolPolicy>[] {\n\t\t// Support both \"odrl:hasPolicy\" and \"hasPolicy\" to accommodate different catalog implementations\n\t\tif (Is.object<IDcatDataset>(catalogDataset) && !Is.empty(catalogDataset[\"odrl:hasPolicy\"])) {\n\t\t\tconst items = ArrayHelper.fromObjectOrArray(catalogDataset[\"odrl:hasPolicy\"]) ?? [];\n\t\t\treturn items.map(item => ({\n\t\t\t\t...item,\n\t\t\t\t\"@id\": OdrlPolicyHelper.getUid(item) ?? \"\"\n\t\t\t}));\n\t\t}\n\n\t\tif (\n\t\t\tIs.object<IDataspaceProtocolDataset>(catalogDataset) &&\n\t\t\t!Is.empty(catalogDataset.hasPolicy)\n\t\t) {\n\t\t\treturn ArrayHelper.fromObjectOrArray(catalogDataset.hasPolicy) ?? [];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Validate that the Agreement policies match at least one Catalog Offer.\n\t * @param agreement Agreement to validate.\n\t * @param catalogDataset Catalog dataset containing Offers.\n\t * @internal\n\t */\n\tprivate async validateAgreementMatchesOffer(\n\t\tagreement: IDataspaceProtocolAgreement,\n\t\tcatalogDataset: IDcatDataset\n\t): Promise<void> {\n\t\tGuards.object<IDataspaceProtocolAgreement>(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(agreement),\n\t\t\tagreement\n\t\t);\n\t\tGuards.object<IDcatDataset>(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(catalogDataset),\n\t\t\tcatalogDataset\n\t\t);\n\n\t\tconst datasetId = getJsonLdId(catalogDataset);\n\t\tif (!Is.stringValue(datasetId)) {\n\t\t\tthrow new NotFoundError(DataspaceControlPlaneService.CLASS_NAME, \"catalogDatasetMissingId\");\n\t\t}\n\t\tconst rawOffers = this.getCatalogDatasetPolicies(catalogDataset);\n\n\t\tif (!Is.arrayValue(rawOffers)) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"catalogDatasetHasNoOffers\",\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: getJsonLdId(catalogDataset) ?? \"\",\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\"\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst catalogOffers = rawOffers.filter(offer => Is.object<IDataspaceProtocolPolicy>(offer));\n\n\t\tif (!Is.arrayValue(catalogOffers)) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"catalogDatasetHasNoOffers\",\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: getJsonLdId(catalogDataset) ?? \"\",\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\"\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst matchingOffer = catalogOffers.find(\n\t\t\t(offer: IDataspaceProtocolPolicy) =>\n\t\t\t\tOdrlPolicyHelper.getUid(offer) === OdrlPolicyHelper.getUid(agreement) ||\n\t\t\t\tthis.isPolicyDerivedFrom(agreement, offer)\n\t\t);\n\n\t\tif (!matchingOffer) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"agreementNotMatchingOffer\", {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\tdatasetId: getJsonLdId(catalogDataset) ?? \"\",\n\t\t\t\tavailableOffers: catalogOffers\n\t\t\t\t\t.map((o: IDataspaceProtocolPolicy) => OdrlPolicyHelper.getUid(o) ?? \"unknown\")\n\t\t\t\t\t.join(\", \")\n\t\t\t});\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"agreementMatchedOffer\",\n\t\t\tdata: {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\tofferId: OdrlPolicyHelper.getUid(matchingOffer) ?? \"\",\n\t\t\t\tdatasetId\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Check if an Agreement is derived from an Offer.\n\t * Per the DS Protocol spec, Offers within a Dataset's hasPolicy array must NOT\n\t * include an explicit \"target\" property — the target is implicitly the Dataset itself.\n\t * When the offer has no explicit targets, we use the datasetId as the implicit target\n\t * so that the comparison with the agreement's target can succeed.\n\t * @param agreement Agreement to check.\n\t * @param offer Offer to compare against.\n\t * @returns True if Agreement appears derived from Offer.\n\t * @see https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/#lower-level-types\n\t * @internal\n\t */\n\tprivate isPolicyDerivedFrom(\n\t\tagreement: IDataspaceProtocolAgreement,\n\t\toffer: IDataspaceProtocolPolicy\n\t): boolean {\n\t\tconst agreementTargets = OdrlPolicyHelper.getTargets(agreement);\n\t\tconst offerTargets = OdrlPolicyHelper.getTargets(offer);\n\n\t\tif (\n\t\t\tagreementTargets.length === 0 ||\n\t\t\tofferTargets.length === 0 ||\n\t\t\t!agreementTargets.some((agreementTarget: string) => offerTargets.includes(agreementTarget))\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst agreementAssignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\tconst offerAssignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(offer);\n\n\t\tconst agreementAssigner = ArrayHelper.fromObjectOrArray(agreementAssignerIdentity);\n\t\tconst offerAssigner = ArrayHelper.fromObjectOrArray(offerAssignerIdentity);\n\n\t\tif (!agreementAssigner.some(assigner => offerAssigner.includes(assigner))) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!Is.array(agreement.permission) || !Is.array(offer.permission)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Ensure the dataset has a publisher set.\n\t * @param dataset The dataset.\n\t * @returns The dataset with publisher set.\n\t * @internal\n\t */\n\tprivate async ensurePublisher(\n\t\tdataset: IDataspaceProtocolDataset\n\t): Promise<IDataspaceProtocolDataset> {\n\t\tif (dataset[\"dcterms:publisher\"]) {\n\t\t\treturn dataset;\n\t\t}\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst orgId = contextIds?.[ContextIdKeys.Organization];\n\n\t\tif (orgId) {\n\t\t\treturn {\n\t\t\t\t...dataset,\n\t\t\t\t\"dcterms:publisher\": orgId\n\t\t\t};\n\t\t}\n\n\t\treturn dataset;\n\t}\n}\n"]}
1
+ {"version":3,"file":"dataspaceControlPlaneService.js","sourceRoot":"","sources":["../../src/dataspaceControlPlaneService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { ITaskSchedulerComponent } from \"@twin.org/background-task-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tRandomHelper,\n\tStringHelper,\n\tUnauthorizedError,\n\tValidationError\n} from \"@twin.org/core\";\nimport { JsonLdHelper, type JsonLdObjectWithNoContext } from \"@twin.org/data-json-ld\";\nimport {\n\tDataspaceAppFactory,\n\tTransferProcessRole,\n\ttype IDataspaceApp,\n\ttype IDataspaceControlPlaneComponent,\n\ttype IDataspaceControlPlaneResolverComponent,\n\ttype INegotiationCallback,\n\ttype ITransferContext,\n\ttype ITransferProcess,\n\ttype TransferProcess\n} from \"@twin.org/dataspace-models\";\nimport { EngineCoreFactory } from \"@twin.org/engine-models\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { IFederatedCatalogueComponent } from \"@twin.org/federated-catalogue-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport {\n\tOdrlPolicyHelper,\n\tPolicyRequesterFactory,\n\ttype IPolicyAdministrationPointComponent,\n\ttype IPolicyNegotiationAdminPointComponent,\n\ttype IPolicyNegotiationPointComponent\n} from \"@twin.org/rights-management-models\";\nimport {\n\tDataspaceProtocolContexts,\n\tDataspaceProtocolContractNegotiationTypes,\n\tDataspaceProtocolEndpointType,\n\tDataspaceProtocolHelper,\n\tDataspaceProtocolTransferProcessStateType,\n\tDataspaceProtocolTransferProcessTypes,\n\ttype DataspaceProtocolContractNegotiationStateType,\n\ttype IDataspaceProtocolAgreement,\n\ttype IDataspaceProtocolContractNegotiation,\n\ttype IDataspaceProtocolContractNegotiationError,\n\ttype IDataspaceProtocolDataset,\n\ttype IDataspaceProtocolPolicy,\n\ttype IDataspaceProtocolTransferCompletionMessage,\n\ttype IDataspaceProtocolTransferError,\n\ttype IDataspaceProtocolTransferProcess,\n\ttype IDataspaceProtocolTransferRequestMessage,\n\ttype IDataspaceProtocolTransferStartMessage,\n\ttype IDataspaceProtocolTransferSuspensionMessage,\n\ttype IDataspaceProtocolTransferTerminationMessage\n} from \"@twin.org/standards-dataspace-protocol\";\nimport type { IDcatDataset } from \"@twin.org/standards-w3c-dcat\";\nimport { TrustHelper, type ITrustComponent } from \"@twin.org/trust-models\";\nimport { DataspaceControlPlanePolicyRequester } from \"./dataspaceControlPlanePolicyRequester.js\";\nimport type { IDataspaceControlPlaneServiceConstructorOptions } from \"./models/IDataspaceControlPlaneServiceConstructorOptions.js\";\nimport { getJsonLdId, getJsonLdType } from \"./utils/dataHelpers.js\";\nimport {\n\tisCatalogError,\n\tisCatalogErrorName,\n\ttransformToTransferError\n} from \"./utils/transferErrorUtils.js\";\n\n/**\n * Stalled negotiation threshold in milliseconds (30 minutes).\n * Negotiations that haven't received a state update within this time are considered stalled.\n */\nconst STALLED_NEGOTIATION_THRESHOLD_MS = 30 * 60 * 1000;\n\n/**\n * Dataspace Control Plane Service implementation.\n *\n * Handles contract negotiation (via PNP callbacks) and transfer process management.\n * Negotiation is fully callback-driven: negotiateAgreement() returns immediately with\n * a negotiationId, and the caller is notified via INegotiationCallback when complete.\n */\nexport class DataspaceControlPlaneService\n\timplements IDataspaceControlPlaneComponent, IDataspaceControlPlaneResolverComponent\n{\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<DataspaceControlPlaneService>();\n\n\t/**\n\t * Hardcoded requester type for PNP registration.\n\t * PNP uses this to route callbacks to our PolicyRequester.\n\t * @internal\n\t */\n\tprivate static readonly _REQUESTER_TYPE = \"dataspace-control-plane-requester\";\n\n\t/**\n\t * The logging component.\n\t * @internal\n\t */\n\tprivate readonly _loggingComponent?: ILoggingComponent;\n\n\t/**\n\t * Policy Administration Point component for Agreement lookup.\n\t * @internal\n\t */\n\tprivate readonly _policyAdministrationPointComponent: IPolicyAdministrationPointComponent;\n\n\t/**\n\t * Policy Negotiation Point component for contract negotiation.\n\t * Used to negotiate agreements with providers before creating transfer processes.\n\n\t * @internal\n\t */\n\tprivate readonly _policyNegotiationPointComponent: IPolicyNegotiationPointComponent;\n\n\t/**\n\t * Policy Negotiation Admin Point component for negotiation history.\n\t * Optional - if not configured, history queries will fail gracefully.\n\t * @internal\n\t */\n\tprivate readonly _policyNegotiationAdminPointComponent?: IPolicyNegotiationAdminPointComponent;\n\n\t/**\n\t * Federated Catalogue component for dataset validation.\n\t * Used to validate that Agreements reference valid catalog datasets.\n\t * @internal\n\t */\n\tprivate readonly _federatedCatalogueComponent: IFederatedCatalogueComponent;\n\n\t/**\n\t * Entity storage for Transfer Process entities.\n\t * Shared between Control Plane and Data Plane.\n\t * @internal\n\t */\n\tprivate readonly _transferProcessStorage: IEntityStorageConnector<TransferProcess>;\n\n\t/**\n\t * The trust component for token verification and generation.\n\t * @internal\n\t */\n\tprivate readonly _trustComponent: ITrustComponent;\n\n\t/**\n\t * Override trust generator type for token generation.\n\t * @internal\n\t */\n\tprivate readonly _overrideTrustGeneratorType?: string;\n\n\t/**\n\t * Data plane endpoint path (path only, not full URL).\n\t * Will be combined with public origin from hosting component.\n\t * If not configured, PULL transfers are not supported.\n\t * @internal\n\t */\n\tprivate readonly _dataPlanePath?: string;\n\n\t/**\n\t * Policy requester instance for handling negotiation callbacks.\n\t * @internal\n\t */\n\tprivate readonly _policyRequester: DataspaceControlPlanePolicyRequester;\n\n\t/**\n\t * Task scheduler for periodic stalled negotiation cleanup.\n\t * @internal\n\t */\n\tprivate readonly _taskScheduler?: ITaskSchedulerComponent;\n\n\t/**\n\t * Registered negotiation callbacks from upstream callers, keyed by registration key.\n\t * @internal\n\t */\n\tprivate readonly _negotiationCallbacks: Map<string, INegotiationCallback>;\n\n\t/**\n\t * Create a new instance of DataspaceControlPlaneService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IDataspaceControlPlaneServiceConstructorOptions) {\n\t\tthis._loggingComponent = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\t\toptions?.loggingComponentType ?? \"logging\"\n\t\t);\n\n\t\t// Retrieve PAP component with default\n\t\tthis._policyAdministrationPointComponent =\n\t\t\tComponentFactory.get<IPolicyAdministrationPointComponent>(\n\t\t\t\toptions?.policyAdministrationPointComponentType ?? \"policy-administration-point\"\n\t\t\t);\n\n\t\t// Retrieve PNP component with default\n\t\tthis._policyNegotiationPointComponent = ComponentFactory.get<IPolicyNegotiationPointComponent>(\n\t\t\toptions?.policyNegotiationPointComponentType ?? \"policy-negotiation-point\"\n\t\t);\n\n\t\t// Retrieve PNAP component (optional) for negotiation history\n\t\tthis._policyNegotiationAdminPointComponent =\n\t\t\tComponentFactory.getIfExists<IPolicyNegotiationAdminPointComponent>(\n\t\t\t\toptions?.policyNegotiationAdminPointComponentType ?? \"policy-negotiation-admin-point\"\n\t\t\t);\n\n\t\t// Retrieve Federated Catalogue component with default\n\t\tthis._federatedCatalogueComponent = ComponentFactory.get<IFederatedCatalogueComponent>(\n\t\t\toptions?.federatedCatalogueComponentType ?? \"federated-catalogue\"\n\t\t);\n\n\t\tthis._transferProcessStorage = EntityStorageConnectorFactory.get<\n\t\t\tIEntityStorageConnector<TransferProcess>\n\t\t>(options?.transferProcessEntityStorageType ?? nameofKebabCase<TransferProcess>());\n\n\t\tthis._trustComponent = ComponentFactory.get<ITrustComponent>(\n\t\t\toptions?.trustComponentType ?? \"trust\"\n\t\t);\n\n\t\tthis._overrideTrustGeneratorType = options?.config?.overrideTrustGeneratorType;\n\n\t\tthis._dataPlanePath = Is.stringValue(options?.config?.dataPlanePath)\n\t\t\t? StringHelper.trimLeadingSlashes(options.config.dataPlanePath)\n\t\t\t: undefined;\n\n\t\tthis._taskScheduler = ComponentFactory.getIfExists<ITaskSchedulerComponent>(\n\t\t\toptions?.taskSchedulerComponentType ?? \"task-scheduler\"\n\t\t);\n\n\t\tthis._negotiationCallbacks = new Map();\n\n\t\tconst internalCallback: INegotiationCallback = {\n\t\t\tonStateChanged: async (negotiationId, state, data) => {\n\t\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cb.onStateChanged(negotiationId, state, data);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\t\tdata: { key, negotiationId, method: \"onStateChanged\", error }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCompleted: async (negotiationId, agreementId) => {\n\t\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cb.onCompleted(negotiationId, agreementId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\t\tdata: { key, negotiationId, method: \"onCompleted\", error }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailed: async (negotiationId, reason) => {\n\t\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait cb.onFailed(negotiationId, reason);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\t\tdata: { key, negotiationId, method: \"onFailed\", error }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tthis._policyRequester = new DataspaceControlPlanePolicyRequester(\n\t\t\toptions?.loggingComponentType ?? \"logging\",\n\t\t\tinternalCallback\n\t\t);\n\n\t\tPolicyRequesterFactory.register(\n\t\t\tDataspaceControlPlaneService._REQUESTER_TYPE,\n\t\t\t() => this._policyRequester\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn DataspaceControlPlaneService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register a callback to receive negotiation state change notifications.\n\t * Upstream modules (e.g. supply-chain) register their callback here.\n\t * @param key A unique key identifying this callback registration.\n\t * @param callback The callback interface to register.\n\t */\n\tpublic registerNegotiationCallback(key: string, callback: INegotiationCallback): void {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(key), key);\n\t\tthis._negotiationCallbacks.set(key, callback);\n\t}\n\n\t/**\n\t * Unregister a previously registered negotiation callback.\n\t * @param key The key used when registering the callback.\n\t */\n\tpublic unregisterNegotiationCallback(key: string): void {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(key), key);\n\t\tthis._negotiationCallbacks.delete(key);\n\t}\n\n\t/**\n\t * The service needs to be started when the application is initialized.\n\t * Populates the Federated Catalogue with datasets from registered apps\n\t * and starts the stalled negotiation cleanup task.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t */\n\tpublic async start(nodeLoggingComponentType?: string): Promise<void> {\n\t\tconst engine = EngineCoreFactory.getIfExists(\"engine\");\n\t\t// Skip if no engine exists OR if this is a clone instance\n\t\tif (Is.empty(engine) || engine.isClone()) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"debug\",\n\t\t\t\tts: Date.now(),\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tmessage: \"engineCloneStart\"\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tts: Date.now(),\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tmessage: \"populatingFederatedCatalogue\"\n\t\t});\n\n\t\t// Get all registered apps\n\t\tconst appNames = DataspaceAppFactory.names();\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"debug\",\n\t\t\tts: Date.now(),\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tmessage: \"discoveredApps\",\n\t\t\tdata: { count: appNames.length, apps: appNames }\n\t\t});\n\n\t\tlet registeredCount = 0;\n\t\tlet errorCount = 0;\n\n\t\t// Collect and register datasets from each app\n\t\tfor (const appName of appNames) {\n\t\t\ttry {\n\t\t\t\tconst app = DataspaceAppFactory.get<IDataspaceApp>(appName);\n\t\t\t\tconst datasets = await app.datasetsHandled();\n\n\t\t\t\tfor (const dataset of datasets) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Ensure publisher is set (required for Federated Catalogue)\n\t\t\t\t\t\tconst datasetWithPublisher = await this.ensurePublisher(dataset);\n\n\t\t\t\t\t\t// Register with Federated Catalogue\n\t\t\t\t\t\tawait this._federatedCatalogueComponent.set(\n\t\t\t\t\t\t\tdatasetWithPublisher as unknown as IDcatDataset\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tregisteredCount++;\n\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"debug\",\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tmessage: \"datasetRegistered\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tdatasetId: getJsonLdId(datasetWithPublisher) ?? \"\",\n\t\t\t\t\t\t\t\tappName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\terrorCount++;\n\t\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\tmessage: \"datasetRegistrationFailed\",\n\t\t\t\t\t\t\terror: BaseError.fromError(error),\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tdatasetId: getJsonLdId(dataset) ?? \"\",\n\t\t\t\t\t\t\t\tappName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tmessage: \"appDatasetsRetrievalFailed\",\n\t\t\t\t\terror: BaseError.fromError(error),\n\t\t\t\t\tdata: { appName }\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tts: Date.now(),\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tmessage: \"federatedCataloguePopulated\",\n\t\t\tdata: {\n\t\t\t\tregisteredCount,\n\t\t\t\terrorCount,\n\t\t\t\ttotalApps: appNames.length\n\t\t\t}\n\t\t});\n\n\t\tif (this._taskScheduler) {\n\t\t\tawait this._taskScheduler.addTask(\n\t\t\t\t\"control-plane-negotiation-cleanup\",\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tnextTriggerTime: Date.now(),\n\t\t\t\t\t\tintervalMinutes: 5\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tasync () => {\n\t\t\t\t\tawait this.cleanupStalledNegotiations();\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the service.\n\t * Removes the stalled negotiation cleanup task.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t */\n\tpublic async stop(nodeLoggingComponentType?: string): Promise<void> {\n\t\tif (this._taskScheduler) {\n\t\t\tawait this._taskScheduler.removeTask(\"control-plane-negotiation-cleanup\");\n\t\t}\n\t}\n\n\t// ----------------------------------------------------------------------------\n\t// CONSUMER SIDE OPERATIONS\n\t// ----------------------------------------------------------------------------\n\n\t/**\n\t * Request a Transfer Process.\n\t * Creates a new Transfer Process in REQUESTED state.\n\t * @param request Transfer request message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state REQUESTED, or TransferError if the operation fails.\n\t *\n\t * Role Performed: Provider\n\t * Called by: Consumer when it wants to request a new Transfer Process\n\t */\n\tpublic async requestTransfer(\n\t\trequest: IDataspaceProtocolTransferRequestMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"requestTransfer\"\n\t\t);\n\n\t\tconst validationFailures = await DataspaceProtocolHelper.validate(\n\t\t\tJsonLdHelper.toNodeObject(request)\n\t\t);\n\n\t\tif (validationFailures.length > 0) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"invalidTransferRequest\",\n\t\t\t\tdata: { validationFailures }\n\t\t\t});\n\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew ValidationError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tnameof(request),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t),\n\t\t\t\trequest\n\t\t\t);\n\t\t}\n\n\t\tconst providerPid = `urn:uuid:${RandomHelper.generateUuidV7()}`;\n\n\t\tlet datasetId: string;\n\t\tlet consumerIdentity: string;\n\t\tlet providerIdentity: string;\n\t\tlet policies: IDataspaceProtocolPolicy[] = [];\n\n\t\ttry {\n\t\t\tconst agreement = await this.lookupAgreement(request.agreementId);\n\n\t\t\tif (!agreement) {\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"agreementNotFound\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tagreementId: request.agreementId,\n\t\t\t\t\t\thint: \"Agreement must exist before transfer. Use contract negotiation to create agreement first.\"\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"agreementNotFound\",\n\t\t\t\t\trequest.agreementId,\n\t\t\t\t\t{\n\t\t\t\t\t\tagreementId: request.agreementId,\n\t\t\t\t\t\thint: \"Perform contract negotiation first to create an agreement\"\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst assigneeIdentity = OdrlPolicyHelper.extractAssigneeIdentity(agreement);\n\t\t\tconst assigneeIds = ArrayHelper.fromObjectOrArray<string>(assigneeIdentity);\n\n\t\t\tif (!assigneeIds.includes(trustInfo.identity)) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"callerNotAuthorizedForAgreement\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tconsumerIdentity = trustInfo.identity;\n\n\t\t\tconst assignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\t\tconst assignerIds = ArrayHelper.fromObjectOrArray<string>(assignerIdentity);\n\t\t\tif (assignerIds.length > 1) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"multipleAssignersNotSupported\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tproviderIdentity = assignerIds[0];\n\n\t\t\tdatasetId = this.extractDatasetId(agreement);\n\n\t\t\tawait this.validateCatalogDataset(datasetId, agreement);\n\n\t\t\tpolicies = [agreement];\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, { consumerPid: request.consumerPid, providerPid });\n\t\t}\n\n\t\tconst now = new Date();\n\n\t\tconst storageEntity: TransferProcess = {\n\t\t\tid: Converter.bytesToHex(RandomHelper.generate(32)),\n\t\t\tconsumerPid: request.consumerPid,\n\t\t\tproviderPid,\n\t\t\tstate: DataspaceProtocolTransferProcessStateType.REQUESTED,\n\t\t\tagreementId: request.agreementId,\n\t\t\tdatasetId,\n\t\t\tconsumerIdentity,\n\t\t\tproviderIdentity,\n\t\t\t// offerId should reference Catalog Offer (via Agreement)\n\t\t\t// For now, use agreementId as reference (proper flow: Catalog → Negotiation → Agreement)\n\t\t\tofferId: request.agreementId,\n\t\t\tpolicies,\n\t\t\tcallbackAddress: request.callbackAddress,\n\t\t\tformat: request.format,\n\t\t\tdataAddress: request.dataAddress,\n\t\t\tdateCreated: now.toISOString(),\n\t\t\tdateModified: now.toISOString()\n\t\t};\n\n\t\tawait this._transferProcessStorage.set(storageEntity);\n\n\t\tconst entity: ITransferProcess = this.storageEntityToModel(storageEntity);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"transferProcessInitiated\",\n\t\t\tdata: {\n\t\t\t\tconsumerPid: request.consumerPid,\n\t\t\t\tproviderPid,\n\t\t\t\tagreementId: request.agreementId\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tstate: entity.state\n\t\t};\n\t}\n\n\t// ----------------------------------------------------------------------------\n\t// PROVIDER SIDE OPERATIONS\n\t// ----------------------------------------------------------------------------\n\n\t/**\n\t * Start a Transfer Process.\n\t * Transitions Transfer Process from REQUESTED to STARTED state or resumes from SUSPENDED state.\n\t * @param message Transfer start message (DSP compliant).\n\t * @param publicOrigin The public origin URL of this service.\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Start Message (DSP compliant) with dataAddress for PULL transfers, or TransferError if the operation fails.\n\t *\n\t * Role Performed: Provider / Consumer\n\t */\n\tpublic async startTransfer(\n\t\tmessage: IDataspaceProtocolTransferStartMessage,\n\t\tpublicOrigin: string,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferStartMessage | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"startTransfer\"\n\t\t);\n\n\t\tconst validationFailures = await DataspaceProtocolHelper.validate(\n\t\t\tJsonLdHelper.toNodeObject(message)\n\t\t);\n\n\t\tif (validationFailures.length > 0) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"invalidTransferStartMessage\",\n\t\t\t\tdata: { validationFailures }\n\t\t\t});\n\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew ValidationError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tnameof(message),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsProvider(trustInfo.identity, entity);\n\n\t\t\tif (\n\t\t\t\tentity.state !== DataspaceProtocolTransferProcessStateType.REQUESTED &&\n\t\t\t\tentity.state !== DataspaceProtocolTransferProcessStateType.SUSPENDED\n\t\t\t) {\n\t\t\t\treturn transformToTransferError(\n\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidStateForStart\", {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tcurrentState: entity.state\n\t\t\t\t\t}),\n\t\t\t\t\tmessage\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.STARTED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessStarted\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst response: IDataspaceProtocolTransferStartMessage = {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferStartMessage,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid\n\t\t\t};\n\n\t\t\t// ============================================================================\n\t\t\t// PULL vs PUSH Transfer Mode Detection (DSP Protocol)\n\t\t\t// ============================================================================\n\t\t\t// The transfer mode is determined by whether the consumer provided a dataAddress\n\t\t\t// in the original TransferRequestMessage:\n\t\t\t//\n\t\t\t// PULL Mode (dataAddress NOT provided by consumer):\n\t\t\t// - Consumer requests data but doesn't specify where to receive it\n\t\t\t// - Provider generates access token and returns dataAddress in TransferStartMessage\n\t\t\t// - Consumer uses the returned endpoint + token to PULL data from provider\n\t\t\t// - Flow: Consumer → GET /entities?consumerPid=X (with Bearer token) → Provider\n\t\t\t//\n\t\t\t// PUSH Mode (dataAddress PROVIDED by consumer):\n\t\t\t// - Consumer specifies endpoint where they want data sent (e.g., webhook URL)\n\t\t\t// - Provider will PUSH data to the consumer's specified endpoint\n\t\t\t// - Flow: Provider → POST to consumer's dataAddress endpoint → Consumer\n\t\t\t//\n\t\t\t// See: https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/#transfer-start-message\n\t\t\t// ============================================================================\n\n\t\t\tif (Is.empty(entity.dataAddress)) {\n\t\t\t\tif (!Is.stringValue(this._dataPlanePath)) {\n\t\t\t\t\treturn transformToTransferError(\n\t\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"pullTransfersNotSupported\", {\n\t\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\t\tproviderPid: entity.providerPid\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tmessage\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Provider signs the data access token with its own identity.\n\t\t\t\t// The subject contains the transfer context claims that the data plane\n\t\t\t\t// will verify when the consumer presents this token.\n\t\t\t\tif (!Is.stringValue(entity.providerIdentity)) {\n\t\t\t\t\tthrow new GeneralError(\n\t\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\t\"providerIdentityMissing\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst accessToken = await this._trustComponent.generate(\n\t\t\t\t\tentity.providerIdentity,\n\t\t\t\t\tthis._overrideTrustGeneratorType,\n\t\t\t\t\t{\n\t\t\t\t\t\tsubject: {\n\t\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\t\tagreementId: entity.agreementId,\n\t\t\t\t\t\t\tdatasetId: entity.datasetId\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tconst tokenString = accessToken as string;\n\t\t\t\tconst fullEndpoint = `${publicOrigin}/${this._dataPlanePath}`;\n\n\t\t\t\tresponse.dataAddress = {\n\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.DataAddress,\n\t\t\t\t\tendpointType: DataspaceProtocolEndpointType.HttpsQueryEndpoint,\n\t\t\t\t\tendpoint: fullEndpoint,\n\t\t\t\t\tendpointProperties: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.EndpointProperty,\n\t\t\t\t\t\t\tname: \"authorization\",\n\t\t\t\t\t\t\tvalue: tokenString\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.EndpointProperty,\n\t\t\t\t\t\t\tname: \"authType\",\n\t\t\t\t\t\t\tvalue: \"bearer\"\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t};\n\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"dataAccessTokenGenerated\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tendpoint: fullEndpoint,\n\t\t\t\t\t\ttransferMode: \"PULL\"\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// PUSH MODE: Provider will push data to consumer's specified endpoint\n\t\t\t\t// The consumer provided dataAddress in TransferRequestMessage, indicating\n\t\t\t\t// where they want data sent. Provider acknowledges and will push data there.\n\t\t\t\t//\n\t\t\t\t// TODO: PUSH transfer implementation (RFC-007 future work)\n\t\t\t\t// Implementation would need to:\n\t\t\t\t// 1. Generate provider's own trust token to authenticate when pushing to consumer\n\t\t\t\t// 2. Validate consumer's dataAddress endpoint is reachable\n\t\t\t\t// 3. Extract any consumer-provided authorization from endpointProperties\n\t\t\t\t// 4. Schedule background task to push data to consumer's endpoint\n\t\t\t\t// 5. POST data to entity.dataAddress.endpoint with provider's trust token\n\t\t\t\t// 6. Implement retry logic with exponential backoff\n\t\t\t\t// 7. Send TransferCompletionMessage when push completes successfully\n\t\t\t\t//\n\t\t\t\t// Trust flow for PUSH (mirror of PULL):\n\t\t\t\t// - PULL: Provider generates token → Consumer uses to authenticate when pulling\n\t\t\t\t// - PUSH: Provider generates token → Provider uses to authenticate when pushing\n\n\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"pushTransferModeNotImplemented\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tconsumerEndpoint: entity.dataAddress.endpoint,\n\t\t\t\t\t\ttransferMode: \"PUSH\"\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t// ----------------------------------------------------------------------------\n\t// SHARED STATE MANAGEMENT OPERATIONS (Either Side)\n\t// ----------------------------------------------------------------------------\n\n\t/**\n\t * Complete a Transfer Process.\n\t * @param message Transfer completion message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state COMPLETED, or TransferError if the operation fails.\n\t */\n\tpublic async completeTransfer(\n\t\tmessage: IDataspaceProtocolTransferCompletionMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"completeTransfer\"\n\t\t);\n\n\t\tconst validationFailures = await DataspaceProtocolHelper.validate(\n\t\t\tJsonLdHelper.toNodeObject(message)\n\t\t);\n\n\t\tif (validationFailures.length > 0) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"invalidTransferCompletionMessage\",\n\t\t\t\tdata: { validationFailures }\n\t\t\t});\n\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew ValidationError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tnameof(message),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsConsumer(trustInfo.identity, entity);\n\n\t\t\tif (entity.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\t\treturn transformToTransferError(\n\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidStateForComplete\", {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tcurrentState: entity.state\n\t\t\t\t\t}),\n\t\t\t\t\tmessage\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.COMPLETED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessCompleted\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t/**\n\t * Suspend a Transfer Process.\n\t * @param message Transfer suspension message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state SUSPENDED, or TransferError if the operation fails.\n\t */\n\tpublic async suspendTransfer(\n\t\tmessage: IDataspaceProtocolTransferSuspensionMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"suspendTransfer\"\n\t\t);\n\n\t\tconst validationFailures = await DataspaceProtocolHelper.validate(\n\t\t\tJsonLdHelper.toNodeObject(message)\n\t\t);\n\n\t\tif (validationFailures.length > 0) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"invalidTransferSuspensionMessage\",\n\t\t\t\tdata: { validationFailures }\n\t\t\t});\n\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew ValidationError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tnameof(message),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsTransferParty(trustInfo.identity, entity);\n\n\t\t\tif (entity.state !== DataspaceProtocolTransferProcessStateType.STARTED) {\n\t\t\t\treturn transformToTransferError(\n\t\t\t\t\tnew GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"invalidStateForSuspend\", {\n\t\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\t\tcurrentState: entity.state\n\t\t\t\t\t}),\n\t\t\t\t\tmessage\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.SUSPENDED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessSuspended\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole,\n\t\t\t\t\treason: message.reason\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t/**\n\t * Terminate a Transfer Process.\n\t * @param message Transfer termination message (DSP compliant).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with state TERMINATED, or TransferError if the operation fails.\n\t */\n\tpublic async terminateTransfer(\n\t\tmessage: IDataspaceProtocolTransferTerminationMessage,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"terminateTransfer\"\n\t\t);\n\n\t\tconst validationFailures = await DataspaceProtocolHelper.validate(\n\t\t\tJsonLdHelper.toNodeObject(message)\n\t\t);\n\n\t\tif (validationFailures.length > 0) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"invalidTransferTerminationMessage\",\n\t\t\t\tdata: { validationFailures }\n\t\t\t});\n\n\t\t\treturn transformToTransferError(\n\t\t\t\tnew ValidationError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\tnameof(message),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t),\n\t\t\t\tmessage\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByMessage(message);\n\n\t\t\tthis.validateCallerIsTransferParty(trustInfo.identity, entity);\n\n\t\t\tentity.state = DataspaceProtocolTransferProcessStateType.TERMINATED;\n\t\t\tentity.dateModified = new Date();\n\n\t\t\tawait this._transferProcessStorage.set(this.modelToStorageEntity(entity));\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessTerminated\",\n\t\t\t\tdata: {\n\t\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\t\trole,\n\t\t\t\t\treason: message.reason\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, message);\n\t\t}\n\t}\n\n\t/**\n\t * Get Transfer Process state.\n\t * @param pid Process ID (consumerPid or providerPid).\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Process (DSP compliant) with current state, or TransferError if the operation fails.\n\t */\n\tpublic async getTransferProcess(\n\t\tpid: string,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolTransferProcess | IDataspaceProtocolTransferError> {\n\t\tconst trustInfo = await TrustHelper.verifyTrust(\n\t\t\tthis._trustComponent,\n\t\t\ttrustPayload,\n\t\t\t\"getTransferProcess\"\n\t\t);\n\n\t\ttry {\n\t\t\tconst { entity, role } = await this.lookupTransferByPid(pid);\n\n\t\t\tthis.validateCallerIsTransferParty(trustInfo.identity, entity);\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"transferProcessQueried\",\n\t\t\t\tdata: {\n\t\t\t\t\tpid,\n\t\t\t\t\trole,\n\t\t\t\t\tstate: entity.state\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\t\t\t\tconsumerPid: entity.consumerPid,\n\t\t\t\tproviderPid: entity.providerPid,\n\t\t\t\tstate: entity.state\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn transformToTransferError(error, { consumerPid: pid, providerPid: pid });\n\t\t}\n\t}\n\n\t// ============================================================================\n\t// CONTRACT NEGOTIATION\n\t// ============================================================================\n\n\t/**\n\t * Negotiate a contract agreement with a provider.\n\t * Returns immediately with a negotiationId. The caller is notified\n\t * via the registered INegotiationCallback when the negotiation completes.\n\t *\n\t * @param datasetId The dataset ID from the provider's catalog.\n\t * @param offerId The offer ID from the provider's catalog.\n\t * @param providerEndpoint The provider's contract negotiation endpoint URL.\n\t * @param publicOrigin The public origin URL of this control plane (for callbacks).\n\t * @param trustPayload The trust payload for authentication.\n\t * @returns The negotiation ID. Use the registered callback for completion notification.\n\t */\n\tpublic async negotiateAgreement(\n\t\tdatasetId: string,\n\t\tofferId: string,\n\t\tproviderEndpoint: string,\n\t\tpublicOrigin: string,\n\t\ttrustPayload: unknown\n\t): Promise<{ negotiationId: string }> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(offerId), offerId);\n\t\tGuards.stringValue(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(providerEndpoint),\n\t\t\tproviderEndpoint\n\t\t);\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(publicOrigin), publicOrigin);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"startingContractNegotiation\",\n\t\t\tdata: { datasetId, offerId, providerEndpoint, publicOrigin }\n\t\t});\n\n\t\tconst catalogResult = await this._federatedCatalogueComponent.get(datasetId);\n\n\t\tif (isCatalogError(catalogResult)) {\n\t\t\tif (isCatalogErrorName(catalogResult, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"datasetNotFoundInCatalog\",\n\t\t\t\t\tdatasetId,\n\t\t\t\t\t{\n\t\t\t\t\t\tdatasetId,\n\t\t\t\t\t\tofferId,\n\t\t\t\t\t\tproviderEndpoint\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"catalogLookupFailedForNegotiation\",\n\t\t\t\t{\n\t\t\t\t\tdatasetId,\n\t\t\t\t\tofferId,\n\t\t\t\t\tproviderEndpoint,\n\t\t\t\t\terrorCode: catalogResult.code\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst rawOffers = this.getCatalogDatasetPolicies(catalogResult);\n\n\t\tif (!Is.arrayValue(rawOffers)) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"datasetHasNoOffers\", {\n\t\t\t\tofferId,\n\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\"\n\t\t\t});\n\t\t}\n\n\t\tconst catalogOffers = rawOffers.filter(offer => Is.object<IDataspaceProtocolPolicy>(offer));\n\n\t\tif (!Is.arrayValue(catalogOffers)) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"datasetHasNoValidOffers\", {\n\t\t\t\tofferId,\n\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\"\n\t\t\t});\n\t\t}\n\n\t\tconst matchingOffer = catalogOffers.find((offer: IDataspaceProtocolPolicy) => {\n\t\t\tconst offerUid = OdrlPolicyHelper.getUid(offer);\n\t\t\treturn offerUid === offerId;\n\t\t});\n\n\t\tif (!matchingOffer) {\n\t\t\tconst availableOffers = catalogOffers\n\t\t\t\t.map((o: IDataspaceProtocolPolicy) => OdrlPolicyHelper.getUid(o) ?? \"unknown\")\n\t\t\t\t.join(\", \");\n\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"offerNotFoundInDataset\",\n\t\t\t\tofferId,\n\t\t\t\t{\n\t\t\t\t\tofferId,\n\t\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\",\n\t\t\t\t\tavailableOffers\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"offerFoundInCatalog\",\n\t\t\tdata: {\n\t\t\t\tofferId,\n\t\t\t\tdatasetId: getJsonLdId(catalogResult) ?? \"\",\n\t\t\t\tofferType: getJsonLdType(matchingOffer)\n\t\t\t}\n\t\t});\n\n\t\tconst negotiationId = await this._policyNegotiationPointComponent.sendRequestToProvider(\n\t\t\tproviderEndpoint,\n\t\t\tDataspaceControlPlaneService._REQUESTER_TYPE,\n\t\t\tofferId,\n\t\t\tpublicOrigin\n\t\t);\n\n\t\tif (!negotiationId) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"negotiationInitiationFailed\",\n\t\t\t\t{\n\t\t\t\t\tofferId,\n\t\t\t\t\tproviderEndpoint\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tthis._policyRequester.trackNegotiation(negotiationId);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"negotiationInitiated\",\n\t\t\tdata: { negotiationId, offerId }\n\t\t});\n\n\t\treturn { negotiationId };\n\t}\n\n\t/**\n\t * Get the current state of a contract negotiation.\n\t * @param negotiationId The unique identifier of the negotiation.\n\t * @param trustPayload The trust payload for authentication.\n\t * @returns Current state of the negotiation.\n\t */\n\tpublic async getNegotiation(\n\t\tnegotiationId: string,\n\t\ttrustPayload: unknown\n\t): Promise<IDataspaceProtocolContractNegotiation | IDataspaceProtocolContractNegotiationError> {\n\t\tGuards.stringValue(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(negotiationId),\n\t\t\tnegotiationId\n\t\t);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"getNegotiation\",\n\t\t\tdata: { negotiationId }\n\t\t});\n\n\t\tconst result = await this._policyNegotiationPointComponent.getNegotiation(\n\t\t\tnegotiationId,\n\t\t\ttrustPayload\n\t\t);\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"negotiationStateRetrieved\",\n\t\t\tdata: {\n\t\t\t\tnegotiationId,\n\t\t\t\ttype: getJsonLdType(result),\n\t\t\t\tstate: (result as IDataspaceProtocolContractNegotiation).state\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get negotiation history.\n\t * @param state Optional filter by negotiation state.\n\t * @param cursor Optional pagination cursor.\n\t * @param trustPayload Trust payload for authentication.\n\t * @returns List of negotiation history entries with pagination.\n\t */\n\tpublic async getNegotiationHistory(\n\t\tstate: string | undefined,\n\t\tcursor: string | undefined,\n\t\ttrustPayload: unknown\n\t): Promise<{\n\t\tnegotiations: {\n\t\t\tnegotiation:\n\t\t\t\t| IDataspaceProtocolContractNegotiation\n\t\t\t\t| IDataspaceProtocolContractNegotiationError;\n\t\t\tcreatedAt: string;\n\t\t\tofferId?: string;\n\t\t\tagreementId?: string;\n\t\t}[];\n\t\tcursor?: string;\n\t\tcount: number;\n\t}> {\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"getNegotiationHistory\",\n\t\t\tdata: { state, cursor }\n\t\t});\n\n\t\tif (!this._policyNegotiationAdminPointComponent) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"pnapNotConfigured\", {\n\t\t\t\tmessage:\n\t\t\t\t\t\"Policy Negotiation Admin Point not configured. \" +\n\t\t\t\t\t\"Set policyNegotiationAdminPointComponentType in constructor options.\"\n\t\t\t});\n\t\t}\n\n\t\tconst { items: pnapNegotiations, cursor: nextCursor } =\n\t\t\tawait this._policyNegotiationAdminPointComponent.query(\n\t\t\t\tstate as DataspaceProtocolContractNegotiationStateType | undefined,\n\t\t\t\tcursor\n\t\t\t);\n\n\t\tconst negotiations = pnapNegotiations.map(pnapNeg => {\n\t\t\tconst dspNegotiation: IDataspaceProtocolContractNegotiation = {\n\t\t\t\t\"@context\": [DataspaceProtocolContexts.Context],\n\t\t\t\t\"@type\": DataspaceProtocolContractNegotiationTypes.ContractNegotiation,\n\t\t\t\tconsumerPid: pnapNeg.id,\n\t\t\t\tproviderPid: pnapNeg.correlationId,\n\t\t\t\tstate: pnapNeg.state\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tnegotiation: dspNegotiation,\n\t\t\t\tcreatedAt: pnapNeg.dateCreated,\n\t\t\t\tofferId: OdrlPolicyHelper.getUid(pnapNeg.offer),\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(pnapNeg.agreement)\n\t\t\t};\n\t\t});\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"negotiationHistoryRetrieved\",\n\t\t\tdata: {\n\t\t\t\tcount: negotiations.length,\n\t\t\t\tstate,\n\t\t\t\thasCursor: Boolean(nextCursor)\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tnegotiations,\n\t\t\tcursor: nextCursor,\n\t\t\tcount: negotiations.length\n\t\t};\n\t}\n\n\t// ============================================================================\n\t// RESOLVER METHODS - IDataspaceControlPlaneResolverComponent\n\t// ============================================================================\n\n\t/**\n\t * Resolve consumerPid to Transfer Context.\n\t * @param consumerPid Consumer Process ID.\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Context with Agreement, datasetId, and Transfer Process metadata.\n\t */\n\tpublic async resolveConsumerPid(\n\t\tconsumerPid: string,\n\t\ttrustPayload: unknown\n\t): Promise<ITransferContext> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(consumerPid), consumerPid);\n\n\t\tawait TrustHelper.verifyTrust(this._trustComponent, trustPayload, \"resolveConsumerPid\");\n\n\t\tconst storageEntity = await this._transferProcessStorage.get(consumerPid);\n\n\t\tif (!storageEntity) {\n\t\t\tthrow new NotFoundError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"transferProcessNotFound\",\n\t\t\t\tundefined,\n\t\t\t\t{ consumerPid }\n\t\t\t);\n\t\t}\n\n\t\tconst entity = this.storageEntityToModel(storageEntity);\n\n\t\tif (entity.state === DataspaceProtocolTransferProcessStateType.TERMINATED) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"transferProcessTerminated\", {\n\t\t\t\tconsumerPid\n\t\t\t});\n\t\t}\n\n\t\tconst agreement = await this.lookupAgreement(entity.agreementId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst currentOrgId = contextIds?.[ContextIdKeys.Organization];\n\n\t\tif (!currentOrgId) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"organizationContextMissing\",\n\t\t\t\t{\n\t\t\t\t\tconsumerPid\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst assignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\tconst assignerIds = ArrayHelper.fromObjectOrArray<string>(assignerIdentity);\n\n\t\tif (!assignerIds.includes(currentOrgId)) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementAssignerMismatch\",\n\t\t\t\t{\n\t\t\t\t\tconsumerPid,\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\texpectedOrgId: currentOrgId,\n\t\t\t\t\tactualAssigner: assignerIds.join(\", \")\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"resolvedConsumerPid\",\n\t\t\tdata: {\n\t\t\t\tconsumerPid,\n\t\t\t\tdatasetId: entity.datasetId,\n\t\t\t\tstate: entity.state,\n\t\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\torganizationId: currentOrgId\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tagreement,\n\t\t\tdatasetId: entity.datasetId,\n\t\t\tofferId: entity.offerId,\n\t\t\tstate: entity.state,\n\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\tdataAddress: entity.dataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Resolve providerPid to Transfer Context.\n\t * @param providerPid Provider Process ID.\n\t * @param trustPayload Trust payload containing authorization information (Base64-encoded token).\n\t * @returns Transfer Context with Agreement, datasetId, and Transfer Process metadata.\n\t */\n\tpublic async resolveProviderPid(\n\t\tproviderPid: string,\n\t\ttrustPayload: unknown\n\t): Promise<ITransferContext> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(providerPid), providerPid);\n\n\t\tawait TrustHelper.verifyTrust(this._trustComponent, trustPayload, \"resolveProviderPid\");\n\n\t\tconst { entity } = await this.lookupTransferByPid(providerPid);\n\n\t\tif (entity.state === DataspaceProtocolTransferProcessStateType.TERMINATED) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"transferProcessTerminatedProvider\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst agreement = await this.lookupAgreement(entity.agreementId);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst currentOrgId = contextIds?.[ContextIdKeys.Organization];\n\n\t\tif (!currentOrgId) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"organizationContextMissingProvider\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\t// Extract assigner UID (can be string, array, or IOdrlParty object)\n\n\t\tconst assignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\tconst assignerIds = ArrayHelper.fromObjectOrArray<string>(assignerIdentity);\n\n\t\tif (!assignerIds.includes(currentOrgId)) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementAssignerMismatchProvider\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid,\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\texpectedOrgId: currentOrgId,\n\t\t\t\t\tactualAssigner: assignerIds.join(\", \")\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\t// Validate that Agreement assignee matches expected consumer identity\n\t\t// This ensures we're pushing to the correct consumer\n\t\t// If assignee is undefined but consumerIdentity has a value, this is also a mismatch\n\t\tconst assigneeIdentity = OdrlPolicyHelper.extractAssigneeIdentity(agreement);\n\t\tconst assigneeIds = ArrayHelper.fromObjectOrArray<string>(assigneeIdentity);\n\n\t\tif (\n\t\t\t!Is.stringValue(entity.consumerIdentity) ||\n\t\t\t!assigneeIds.includes(entity.consumerIdentity)\n\t\t) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementAssigneeMismatch\",\n\t\t\t\t{\n\t\t\t\t\tproviderPid,\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\texpectedConsumerIdentity: entity.consumerIdentity,\n\t\t\t\t\tactualAssignee: assigneeIds.join(\", \")\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"resolvedProviderPid\",\n\t\t\tdata: {\n\t\t\t\tproviderPid,\n\t\t\t\tdatasetId: entity.datasetId,\n\t\t\t\tstate: entity.state,\n\t\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\torganizationId: currentOrgId\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tagreement,\n\t\t\tdatasetId: entity.datasetId,\n\t\t\tofferId: entity.offerId,\n\t\t\tstate: entity.state,\n\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\tdataAddress: entity.dataAddress\n\t\t};\n\t}\n\n\t// ============================================================================\n\t// PRIVATE HELPER METHODS\n\t// ============================================================================\n\n\t/**\n\t * Cleanup stalled negotiations.\n\t * Called periodically by the task scheduler.\n\t * @internal\n\t */\n\tprivate async cleanupStalledNegotiations(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tconst stalled: string[] = [];\n\n\t\tfor (const [negotiationId, state] of this._policyRequester.getActiveNegotiations()) {\n\t\t\tif (now - state.updatedAt > STALLED_NEGOTIATION_THRESHOLD_MS) {\n\t\t\t\tstalled.push(negotiationId);\n\t\t\t}\n\t\t}\n\n\t\tfor (const negotiationId of stalled) {\n\t\t\tthis._policyRequester.removeNegotiation(negotiationId);\n\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"stalledNegotiationCleanedUp\",\n\t\t\t\tdata: { negotiationId }\n\t\t\t});\n\n\t\t\tfor (const [key, cb] of this._negotiationCallbacks.entries()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait cb.onFailed(negotiationId, \"negotiationStalled\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tawait this._loggingComponent?.log({\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\tmessage: \"negotiationCallbackError\",\n\t\t\t\t\t\tdata: { key, negotiationId, method: \"onFailed\", error }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (stalled.length > 0) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"stalledNegotiationsCleanupComplete\",\n\t\t\t\tdata: { cleanedUp: stalled.length }\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Convert a storage entity to model.\n\t * @param storageEntity The entity from storage.\n\t * @returns The model representation.\n\t * @internal\n\t */\n\tprivate storageEntityToModel(storageEntity: TransferProcess): ITransferProcess {\n\t\treturn {\n\t\t\tid: storageEntity.id,\n\t\t\tconsumerPid: storageEntity.consumerPid,\n\t\t\tproviderPid: storageEntity.providerPid,\n\t\t\tstate: storageEntity.state,\n\t\t\tagreementId: storageEntity.agreementId,\n\t\t\tdatasetId: storageEntity.datasetId,\n\t\t\tofferId: storageEntity.offerId,\n\t\t\tconsumerIdentity: storageEntity.consumerIdentity,\n\t\t\tproviderIdentity: storageEntity.providerIdentity,\n\t\t\tformat: storageEntity.format,\n\t\t\tcallbackAddress: storageEntity.callbackAddress,\n\t\t\tdateCreated: new Date(storageEntity.dateCreated),\n\t\t\tdateModified: new Date(storageEntity.dateModified),\n\t\t\tpolicies: storageEntity.policies,\n\t\t\tdataAddress: storageEntity.dataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Convert a model to storage entity.\n\t * @param entity The model representation.\n\t * @returns The entity for storage.\n\t * @internal\n\t */\n\tprivate modelToStorageEntity(entity: ITransferProcess): TransferProcess {\n\t\treturn {\n\t\t\tid: entity.id,\n\t\t\tconsumerPid: entity.consumerPid,\n\t\t\tproviderPid: entity.providerPid,\n\t\t\tstate: entity.state,\n\t\t\tagreementId: entity.agreementId,\n\t\t\tdatasetId: entity.datasetId,\n\t\t\tofferId: entity.offerId,\n\t\t\tconsumerIdentity: entity.consumerIdentity,\n\t\t\tproviderIdentity: entity.providerIdentity,\n\t\t\tformat: entity.format,\n\t\t\tcallbackAddress: entity.callbackAddress,\n\t\t\tdateCreated: entity.dateCreated.toISOString(),\n\t\t\tdateModified: entity.dateModified.toISOString(),\n\t\t\tpolicies: entity.policies,\n\t\t\tdataAddress: entity.dataAddress\n\t\t};\n\t}\n\n\t/**\n\t * Look up Agreement from PAP.\n\t * @param agreementId Agreement ID.\n\t * @returns Agreement.\n\t * @internal\n\t */\n\tprivate async lookupAgreement(agreementId: string): Promise<IDataspaceProtocolAgreement> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(agreementId), agreementId);\n\n\t\tlet agreement;\n\t\ttry {\n\t\t\tagreement = await this._policyAdministrationPointComponent.getAgreement(agreementId);\n\t\t} catch (error) {\n\t\t\tif (BaseError.isErrorName(error, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementLookupFailed\",\n\t\t\t\t{ agreementId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\n\t\treturn agreement;\n\t}\n\n\t/**\n\t * Validate that the caller's verified identity matches the consumer of a transfer process.\n\t * @param callerIdentity The identity from the verified trust token.\n\t * @param entity The transfer process entity.\n\t * @throws UnauthorizedError if the caller is not the consumer.\n\t * @internal\n\t */\n\tprivate validateCallerIsConsumer(callerIdentity: string, entity: ITransferProcess): void {\n\t\tif (callerIdentity !== entity.consumerIdentity) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"callerNotAuthorizedAsConsumer\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Validate that the caller's verified identity matches the provider of a transfer process.\n\t * @param callerIdentity The identity from the verified trust token.\n\t * @param entity The transfer process entity.\n\t * @throws UnauthorizedError if the caller is not the provider.\n\t * @internal\n\t */\n\tprivate validateCallerIsProvider(callerIdentity: string, entity: ITransferProcess): void {\n\t\tif (callerIdentity !== entity.providerIdentity) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"callerNotAuthorizedAsProvider\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Validate that the caller's verified identity matches either the consumer or provider of a transfer process.\n\t * @param callerIdentity The identity from the verified trust token.\n\t * @param entity The transfer process entity.\n\t * @throws UnauthorizedError if the caller is not a party to the transfer.\n\t * @internal\n\t */\n\tprivate validateCallerIsTransferParty(callerIdentity: string, entity: ITransferProcess): void {\n\t\tif (callerIdentity !== entity.consumerIdentity && callerIdentity !== entity.providerIdentity) {\n\t\t\tthrow new UnauthorizedError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"callerNotAuthorizedForTransfer\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Extract dataset ID from Agreement target.\n\t * @param agreement Agreement.\n\t * @returns Dataset ID.\n\t * @internal\n\t */\n\tprivate extractDatasetId(agreement: IDataspaceProtocolAgreement): string {\n\t\tif (Is.empty(agreement.target)) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"agreementMissingTarget\", {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement)\n\t\t\t});\n\t\t}\n\n\t\tconst targetIds = OdrlPolicyHelper.getTargets(agreement);\n\n\t\tif (targetIds.length === 0) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"agreementTargetMissingUid\", {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement)\n\t\t\t});\n\t\t}\n\n\t\t// Validate single target, multiple targets are not currently supported\n\t\tif (targetIds.length > 1) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\"agreementMultipleTargetsNotSupported\",\n\t\t\t\t{\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement),\n\t\t\t\t\ttargetCount: targetIds.length\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn targetIds[0];\n\t}\n\n\t/**\n\t * Validate that the dataset exists in the Federated Catalogue.\n\t * @param datasetId Dataset identifier extracted from Agreement.\n\t * @param agreement The Agreement being validated.\n\t * @internal\n\t */\n\tprivate async validateCatalogDataset(\n\t\tdatasetId: string,\n\t\tagreement: IDataspaceProtocolAgreement\n\t): Promise<void> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(datasetId), datasetId);\n\t\tGuards.object<IDataspaceProtocolAgreement>(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(agreement),\n\t\t\tagreement\n\t\t);\n\n\t\t// Lookup dataset in catalog\n\t\tconst catalogResult = await this._federatedCatalogueComponent.get(datasetId);\n\n\t\tif (isCatalogError(catalogResult)) {\n\t\t\tif (isCatalogErrorName(catalogResult, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\t\t\"datasetNotInCatalog\",\n\t\t\t\t\tdatasetId,\n\t\t\t\t\t{\n\t\t\t\t\t\tdatasetId,\n\t\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement)\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"catalogLookupFailed\", {\n\t\t\t\tdatasetId,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\terrorCode: catalogResult.code\n\t\t\t});\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"catalogDatasetFound\",\n\t\t\tdata: {\n\t\t\t\tdatasetId,\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\tdatasetTitle: catalogResult[\"dcterms:title\"]\n\t\t\t}\n\t\t});\n\n\t\tawait this.validateAgreementMatchesOffer(agreement, catalogResult);\n\t}\n\n\t/**\n\t * Extract PID from DSP message and lookup Transfer Process with role detection.\n\t * @param message DSP protocol message with consumerPid and/or providerPid fields.\n\t * @returns Transfer Process entity and our role in this transfer.\n\t * @internal\n\t */\n\tprivate async lookupTransferByMessage(message: {\n\t\tconsumerPid?: string;\n\t\tproviderPid?: string;\n\t}): Promise<{\n\t\tentity: ITransferProcess;\n\t\trole: TransferProcessRole;\n\t}> {\n\t\tconst pid = message.consumerPid ?? message.providerPid;\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, \"pid\", pid);\n\n\t\treturn this.lookupTransferByPid(pid);\n\t}\n\n\t/**\n\t * Lookup Transfer Process by PID and determine our role.\n\t * @param pid Either consumerPid or providerPid.\n\t * @returns Transfer Process entity and our role in this transfer.\n\t * @internal\n\t */\n\tprivate async lookupTransferByPid(pid: string): Promise<{\n\t\tentity: ITransferProcess;\n\t\trole: TransferProcessRole;\n\t}> {\n\t\tGuards.stringValue(DataspaceControlPlaneService.CLASS_NAME, nameof(pid), pid);\n\n\t\t// Check if pid is a consumerPid (primary key lookup)\n\t\tconst storageEntity = await this._transferProcessStorage.get(pid);\n\n\t\tif (storageEntity) {\n\t\t\treturn {\n\t\t\t\tentity: this.storageEntityToModel(storageEntity),\n\t\t\t\trole: TransferProcessRole.Consumer\n\t\t\t};\n\t\t}\n\n\t\t// Check if pid is a providerPid (secondary key lookup)\n\t\tconst providerPidEntity = await this._transferProcessStorage.get(pid, \"providerPid\");\n\t\tif (providerPidEntity) {\n\t\t\treturn {\n\t\t\t\tentity: this.storageEntityToModel(providerPidEntity),\n\t\t\t\trole: TransferProcessRole.Provider\n\t\t\t};\n\t\t}\n\n\t\tthrow new NotFoundError(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\"transferProcessNotFound\",\n\t\t\tpid,\n\t\t\t{\n\t\t\t\tpid\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Get raw policy entries from a catalog dataset.\n\t * @param catalogDataset Catalog dataset.\n\t * @returns Raw policy entries.\n\t * @internal\n\t */\n\tprivate getCatalogDatasetPolicies(\n\t\tcatalogDataset: IDcatDataset | IDataspaceProtocolDataset\n\t): JsonLdObjectWithNoContext<IDataspaceProtocolPolicy>[] {\n\t\t// Support both \"odrl:hasPolicy\" and \"hasPolicy\" to accommodate different catalog implementations\n\t\tif (Is.object<IDcatDataset>(catalogDataset) && !Is.empty(catalogDataset[\"odrl:hasPolicy\"])) {\n\t\t\tconst items = ArrayHelper.fromObjectOrArray(catalogDataset[\"odrl:hasPolicy\"]) ?? [];\n\t\t\treturn items.map(item => ({\n\t\t\t\t...item,\n\t\t\t\t\"@id\": OdrlPolicyHelper.getUid(item) ?? \"\"\n\t\t\t}));\n\t\t}\n\n\t\tif (\n\t\t\tIs.object<IDataspaceProtocolDataset>(catalogDataset) &&\n\t\t\t!Is.empty(catalogDataset.hasPolicy)\n\t\t) {\n\t\t\treturn ArrayHelper.fromObjectOrArray(catalogDataset.hasPolicy) ?? [];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Validate that the Agreement policies match at least one Catalog Offer.\n\t * @param agreement Agreement to validate.\n\t * @param catalogDataset Catalog dataset containing Offers.\n\t * @internal\n\t */\n\tprivate async validateAgreementMatchesOffer(\n\t\tagreement: IDataspaceProtocolAgreement,\n\t\tcatalogDataset: IDcatDataset\n\t): Promise<void> {\n\t\tGuards.object<IDataspaceProtocolAgreement>(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(agreement),\n\t\t\tagreement\n\t\t);\n\t\tGuards.object<IDcatDataset>(\n\t\t\tDataspaceControlPlaneService.CLASS_NAME,\n\t\t\tnameof(catalogDataset),\n\t\t\tcatalogDataset\n\t\t);\n\n\t\tconst datasetId = getJsonLdId(catalogDataset);\n\t\tif (!Is.stringValue(datasetId)) {\n\t\t\tthrow new NotFoundError(DataspaceControlPlaneService.CLASS_NAME, \"catalogDatasetMissingId\");\n\t\t}\n\t\tconst rawOffers = this.getCatalogDatasetPolicies(catalogDataset);\n\n\t\tif (!Is.arrayValue(rawOffers)) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"catalogDatasetHasNoOffers\",\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: getJsonLdId(catalogDataset) ?? \"\",\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\"\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst catalogOffers = rawOffers.filter(offer => Is.object<IDataspaceProtocolPolicy>(offer));\n\n\t\tif (!Is.arrayValue(catalogOffers)) {\n\t\t\tawait this._loggingComponent?.log({\n\t\t\t\tlevel: \"warn\",\n\t\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"catalogDatasetHasNoOffers\",\n\t\t\t\tdata: {\n\t\t\t\t\tdatasetId: getJsonLdId(catalogDataset) ?? \"\",\n\t\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\"\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst matchingOffer = catalogOffers.find(\n\t\t\t(offer: IDataspaceProtocolPolicy) =>\n\t\t\t\tOdrlPolicyHelper.getUid(offer) === OdrlPolicyHelper.getUid(agreement) ||\n\t\t\t\tthis.isPolicyDerivedFrom(agreement, offer)\n\t\t);\n\n\t\tif (!matchingOffer) {\n\t\t\tthrow new GeneralError(DataspaceControlPlaneService.CLASS_NAME, \"agreementNotMatchingOffer\", {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\tdatasetId: getJsonLdId(catalogDataset) ?? \"\",\n\t\t\t\tavailableOffers: catalogOffers\n\t\t\t\t\t.map((o: IDataspaceProtocolPolicy) => OdrlPolicyHelper.getUid(o) ?? \"unknown\")\n\t\t\t\t\t.join(\", \")\n\t\t\t});\n\t\t}\n\n\t\tawait this._loggingComponent?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: DataspaceControlPlaneService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"agreementMatchedOffer\",\n\t\t\tdata: {\n\t\t\t\tagreementId: OdrlPolicyHelper.getUid(agreement) ?? \"\",\n\t\t\t\tofferId: OdrlPolicyHelper.getUid(matchingOffer) ?? \"\",\n\t\t\t\tdatasetId\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Check if an Agreement is derived from an Offer.\n\t * Per the DS Protocol spec, Offers within a Dataset's hasPolicy array must NOT\n\t * include an explicit \"target\" property — the target is implicitly the Dataset itself.\n\t * When the offer has no explicit targets, we use the datasetId as the implicit target\n\t * so that the comparison with the agreement's target can succeed.\n\t * @param agreement Agreement to check.\n\t * @param offer Offer to compare against.\n\t * @returns True if Agreement appears derived from Offer.\n\t * @see https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/#lower-level-types\n\t * @internal\n\t */\n\tprivate isPolicyDerivedFrom(\n\t\tagreement: IDataspaceProtocolAgreement,\n\t\toffer: IDataspaceProtocolPolicy\n\t): boolean {\n\t\tconst agreementTargets = OdrlPolicyHelper.getTargets(agreement);\n\t\tconst offerTargets = OdrlPolicyHelper.getTargets(offer);\n\n\t\tif (\n\t\t\tagreementTargets.length === 0 ||\n\t\t\tofferTargets.length === 0 ||\n\t\t\t!agreementTargets.some((agreementTarget: string) => offerTargets.includes(agreementTarget))\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst agreementAssignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(agreement);\n\t\tconst offerAssignerIdentity = OdrlPolicyHelper.extractAssignerIdentity(offer);\n\n\t\tconst agreementAssigner = ArrayHelper.fromObjectOrArray(agreementAssignerIdentity);\n\t\tconst offerAssigner = ArrayHelper.fromObjectOrArray(offerAssignerIdentity);\n\n\t\tif (!agreementAssigner.some(assigner => offerAssigner.includes(assigner))) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!Is.array(agreement.permission) || !Is.array(offer.permission)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Ensure the dataset has a publisher set.\n\t * @param dataset The dataset.\n\t * @returns The dataset with publisher set.\n\t * @internal\n\t */\n\tprivate async ensurePublisher(\n\t\tdataset: IDataspaceProtocolDataset\n\t): Promise<IDataspaceProtocolDataset> {\n\t\tif (dataset[\"dcterms:publisher\"]) {\n\t\t\treturn dataset;\n\t\t}\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst orgId = contextIds?.[ContextIdKeys.Organization];\n\n\t\tif (orgId) {\n\t\t\treturn {\n\t\t\t\t...dataset,\n\t\t\t\t\"dcterms:publisher\": orgId\n\t\t\t};\n\t\t}\n\n\t\treturn dataset;\n\t}\n}\n"]}
package/docs/changelog.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.19](https://github.com/twinfoundation/dataspace/compare/dataspace-control-plane-service-v0.0.3-next.18...dataspace-control-plane-service-v0.0.3-next.19) (2026-03-12)
4
+
5
+
6
+ ### Features
7
+
8
+ * improve validation ([#82](https://github.com/twinfoundation/dataspace/issues/82)) ([8bfaf7b](https://github.com/twinfoundation/dataspace/commit/8bfaf7b830f89b63575f8a51ee96bd8ac4da02f4))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/dataspace-models bumped from 0.0.3-next.18 to 0.0.3-next.19
16
+
3
17
  ## [0.0.3-next.18](https://github.com/twinfoundation/dataspace/compare/dataspace-control-plane-service-v0.0.3-next.17...dataspace-control-plane-service-v0.0.3-next.18) (2026-03-09)
4
18
 
5
19
 
@@ -76,4 +90,4 @@
76
90
  * dependencies
77
91
  * @twin.org/data-exchange-models bumped from 0.0.3-next.0 to 0.0.3-next.1
78
92
 
79
- ## @twin.org/data-exchange-service - Changelog
93
+ ## Changelog
package/docs/examples.md CHANGED
@@ -1 +1,144 @@
1
- # @twin.org/data-exchange-service - Examples
1
+ # Control Plane Service Examples
2
+
3
+ Use these snippets to negotiate agreements, manage transfer lifecycle, and resolve process identifiers in service components.
4
+
5
+ ## DataspaceControlPlaneService
6
+
7
+ ```typescript
8
+ import { DataspaceControlPlaneService } from '@twin.org/dataspace-control-plane-service';
9
+
10
+ const service = new DataspaceControlPlaneService({
11
+ loggingComponentType: 'logging',
12
+ trustComponentType: 'trust',
13
+ config: {
14
+ dataPlanePath: 'dataspace-data-plane'
15
+ }
16
+ });
17
+
18
+ console.log(service.className()); // DataspaceControlPlaneService
19
+ ```
20
+
21
+ ```typescript
22
+ import { DataspaceControlPlaneService } from '@twin.org/dataspace-control-plane-service';
23
+
24
+ const service = new DataspaceControlPlaneService();
25
+
26
+ service.registerNegotiationCallback('supply-chain', {
27
+ onStateChanged: async (negotiationId, state) => {
28
+ console.log(negotiationId); // urn:negotiation:001
29
+ console.log(state); // OFFERED
30
+ },
31
+ onCompleted: async (negotiationId, agreementId) => {
32
+ console.log(negotiationId); // urn:negotiation:001
33
+ console.log(agreementId); // urn:agreement:001
34
+ },
35
+ onFailed: async (negotiationId, reason) => {
36
+ console.log(negotiationId); // urn:negotiation:001
37
+ console.log(reason); // negotiationTerminatedByProvider
38
+ }
39
+ });
40
+
41
+ await service.start();
42
+ await service.stop();
43
+ service.unregisterNegotiationCallback('supply-chain');
44
+ ```
45
+
46
+ ```typescript
47
+ import { DataspaceControlPlaneService } from '@twin.org/dataspace-control-plane-service';
48
+ import type {
49
+ IDataspaceProtocolAgreement,
50
+ IDataspaceProtocolTransferRequestMessage,
51
+ IDataspaceProtocolTransferStartMessage,
52
+ IDataspaceProtocolTransferCompletionMessage,
53
+ IDataspaceProtocolTransferSuspensionMessage,
54
+ IDataspaceProtocolTransferTerminationMessage
55
+ } from '@twin.org/standards-dataspace-protocol';
56
+
57
+ const service = new DataspaceControlPlaneService();
58
+ const trustPayload = 'eyJhbGciOi...';
59
+
60
+ declare const agreement: IDataspaceProtocolAgreement;
61
+ declare const requestMessage: IDataspaceProtocolTransferRequestMessage;
62
+ declare const startMessage: IDataspaceProtocolTransferStartMessage;
63
+ declare const completionMessage: IDataspaceProtocolTransferCompletionMessage;
64
+ declare const suspensionMessage: IDataspaceProtocolTransferSuspensionMessage;
65
+ declare const terminationMessage: IDataspaceProtocolTransferTerminationMessage;
66
+
67
+ const requested = await service.requestTransfer(requestMessage, trustPayload);
68
+ const started = await service.startTransfer(startMessage, trustPayload);
69
+ const completed = await service.completeTransfer(completionMessage, trustPayload);
70
+ const suspended = await service.suspendTransfer(suspensionMessage, trustPayload);
71
+ const terminated = await service.terminateTransfer(terminationMessage, trustPayload);
72
+
73
+ const negotiationId = await service.negotiateAgreement(
74
+ agreement,
75
+ 'https://provider.example',
76
+ trustPayload
77
+ );
78
+ const negotiation = await service.getNegotiation(negotiationId, trustPayload);
79
+ const history = await service.getNegotiationHistory(negotiationId, trustPayload);
80
+
81
+ console.log(requested['@type']); // TransferProcess
82
+ console.log(started['@type']); // TransferStartMessage
83
+ console.log(completed['@type']); // TransferProcess
84
+ console.log(suspended['@type']); // TransferProcess
85
+ console.log(terminated['@type']); // TransferProcess
86
+ console.log(negotiation['@id']); // urn:negotiation:001
87
+ console.log(history.length); // 3
88
+ ```
89
+
90
+ ```typescript
91
+ import { DataspaceControlPlaneService } from '@twin.org/dataspace-control-plane-service';
92
+
93
+ const service = new DataspaceControlPlaneService();
94
+
95
+ const transfer = await service.getTransferProcess('consumer-process-id', 'eyJhbGciOi...');
96
+ const consumerPid = await service.resolveConsumerPid('provider-process-id');
97
+ const providerPid = await service.resolveProviderPid('consumer-process-id');
98
+
99
+ console.log(transfer['@type']); // TransferProcess
100
+ console.log(consumerPid); // consumer-process-id
101
+ console.log(providerPid); // provider-process-id
102
+ ```
103
+
104
+ ## DataspaceControlPlanePolicyRequester
105
+
106
+ ```typescript
107
+ import { DataspaceControlPlanePolicyRequester } from '@twin.org/dataspace-control-plane-service';
108
+ import type {
109
+ IDataspaceProtocolAgreement,
110
+ IDataspaceProtocolOffer
111
+ } from '@twin.org/standards-dataspace-protocol';
112
+
113
+ const requester = new DataspaceControlPlanePolicyRequester('logging', {
114
+ onStateChanged: async (negotiationId, state) => {
115
+ console.log(negotiationId); // urn:negotiation:001
116
+ console.log(state); // OFFERED
117
+ },
118
+ onCompleted: async (negotiationId, agreementId) => {
119
+ console.log(negotiationId); // urn:negotiation:001
120
+ console.log(agreementId); // urn:agreement:001
121
+ },
122
+ onFailed: async (negotiationId, reason) => {
123
+ console.log(negotiationId); // urn:negotiation:001
124
+ console.log(reason); // negotiationTerminatedByProvider
125
+ }
126
+ });
127
+
128
+ console.log(requester.className()); // DataspaceControlPlanePolicyRequester
129
+
130
+ requester.trackNegotiation('urn:negotiation:001');
131
+ const active = requester.getActiveNegotiations();
132
+ console.log(active.size); // 1
133
+
134
+ declare const offer: IDataspaceProtocolOffer;
135
+ declare const agreement: IDataspaceProtocolAgreement;
136
+
137
+ await requester.offer('urn:negotiation:001', offer);
138
+ await requester.agreement('urn:negotiation:001', agreement);
139
+ await requester.finalised('urn:negotiation:001');
140
+
141
+ requester.trackNegotiation('urn:negotiation:002');
142
+ await requester.terminated('urn:negotiation:002');
143
+ requester.removeNegotiation('urn:negotiation:002');
144
+ ```
@@ -11,12 +11,6 @@ Dataspace Control Plane service constructor options.
11
11
  Policy Administration Point component type.
12
12
  Used for Agreement lookup and validation during Transfer Process initiation.
13
13
 
14
- #### Default
15
-
16
- ```ts
17
- policy-administration-point
18
- ```
19
-
20
14
  ***
21
15
 
22
16
  ### policyNegotiationPointComponentType?
@@ -26,12 +20,6 @@ policy-administration-point
26
20
  Policy Negotiation Point component type.
27
21
  Used for contract negotiation to create agreements before transfer processes.
28
22
 
29
- #### Default
30
-
31
- ```ts
32
- policy-negotiation-point
33
- ```
34
-
35
23
  ***
36
24
 
37
25
  ### policyNegotiationAdminPointComponentType?
@@ -42,12 +30,6 @@ Policy Negotiation Admin Point component type.
42
30
  Used for querying negotiation history.
43
31
  Optional - if not provided, negotiation history will not be available.
44
32
 
45
- #### Default
46
-
47
- ```ts
48
- policy-negotiation-admin-point
49
- ```
50
-
51
33
  ***
52
34
 
53
35
  ### federatedCatalogueComponentType?
@@ -58,12 +40,6 @@ Federated Catalogue component type.
58
40
  Used for dataset validation during Transfer Process initiation.
59
41
  Validates that Agreements reference valid catalog datasets.
60
42
 
61
- #### Default
62
-
63
- ```ts
64
- federated-catalogue
65
- ```
66
-
67
43
  ***
68
44
 
69
45
  ### loggingComponentType?
@@ -72,12 +48,6 @@ federated-catalogue
72
48
 
73
49
  Logging component type.
74
50
 
75
- #### Default
76
-
77
- ```ts
78
- logging
79
- ```
80
-
81
51
  ***
82
52
 
83
53
  ### identityComponentType?
@@ -86,12 +56,6 @@ logging
86
56
 
87
57
  Identity component type (for token signing/verification).
88
58
 
89
- #### Default
90
-
91
- ```ts
92
- identity
93
- ```
94
-
95
59
  ***
96
60
 
97
61
  ### identityAuthenticationComponentType?
@@ -100,12 +64,6 @@ identity
100
64
 
101
65
  Identity Authentication component type (for token validation).
102
66
 
103
- #### Default
104
-
105
- ```ts
106
- identity-authentication
107
- ```
108
-
109
67
  ***
110
68
 
111
69
  ### trustComponentType?
@@ -115,12 +73,6 @@ identity-authentication
115
73
  Trust component type for trust verification.
116
74
  Used to verify JWT/VC tokens and extract identity information.
117
75
 
118
- #### Default
119
-
120
- ```ts
121
- trust
122
- ```
123
-
124
76
  ***
125
77
 
126
78
  ### transferProcessEntityStorageType?
@@ -131,12 +83,6 @@ Entity storage type for Transfer Process entities.
131
83
  Used to persist transfer state for the consumerPid flow.
132
84
  Must match the Data Plane's transferProcessEntityStorageType for shared storage.
133
85
 
134
- #### Default
135
-
136
- ```ts
137
- transfer-process
138
- ```
139
-
140
86
  ***
141
87
 
142
88
  ### taskSchedulerComponentType?
@@ -145,12 +91,6 @@ transfer-process
145
91
 
146
92
  Task scheduler component type for periodic cleanup of stalled negotiations.
147
93
 
148
- #### Default
149
-
150
- ```ts
151
- task-scheduler
152
- ```
153
-
154
94
  ***
155
95
 
156
96
  ### config?
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@twin.org/dataspace-control-plane-service",
3
- "version": "0.0.3-next.18",
4
- "description": "Dataspace Control Plane service implementation for Eclipse Dataspace Protocol Transfer Process Protocol",
3
+ "version": "0.0.3-next.19",
4
+ "description": "Implements agreement negotiation and transfer process lifecycle management for control plane operations.",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/twinfoundation/dataspace.git",
@@ -17,7 +17,7 @@
17
17
  "@twin.org/api-models": "next",
18
18
  "@twin.org/context": "next",
19
19
  "@twin.org/core": "next",
20
- "@twin.org/dataspace-models": "0.0.3-next.18",
20
+ "@twin.org/dataspace-models": "0.0.3-next.19",
21
21
  "@twin.org/entity": "next",
22
22
  "@twin.org/entity-storage-models": "next",
23
23
  "@twin.org/federated-catalogue-models": "next",