@ajna-inc/workflow 0.6.4 → 0.6.5
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/.npmvc/attestations.jsonld +8 -8
- package/.npmvc/sbom.cdx.json +3 -3
- package/build/WorkflowModule.mjs +10 -3
- package/build/WorkflowModule.mjs.map +1 -1
- package/build/protocol/handlers/AdvanceHandler.d.mts +1 -1
- package/build/protocol/handlers/AdvanceHandler.d.mts.map +1 -1
- package/build/protocol/handlers/CancelHandler.d.mts +1 -1
- package/build/protocol/handlers/CancelHandler.d.mts.map +1 -1
- package/build/protocol/handlers/CompleteHandler.d.mts +1 -1
- package/build/protocol/handlers/CompleteHandler.d.mts.map +1 -1
- package/build/protocol/handlers/PauseHandler.d.mts +1 -1
- package/build/protocol/handlers/PauseHandler.d.mts.map +1 -1
- package/build/protocol/handlers/ResumeHandler.d.mts +1 -1
- package/build/protocol/handlers/ResumeHandler.d.mts.map +1 -1
- package/build/protocol/handlers/StartHandler.d.mts +1 -1
- package/build/protocol/handlers/StartHandler.d.mts.map +1 -1
- package/build/protocol/handlers/StatusHandler.d.mts +1 -1
- package/build/protocol/handlers/StatusHandler.d.mts.map +1 -1
- package/build/protocol/messages/AdvanceMessage.d.mts +2 -2
- package/build/protocol/messages/CompleteMessage.d.mts +2 -2
- package/build/protocol/messages/DiscoverMessage.d.mts +2 -2
- package/build/protocol/messages/FetchTemplateMessage.d.mts +2 -2
- package/build/protocol/messages/StartMessage.d.mts +2 -2
- package/build/protocol/messages/TemplateMessage.d.mts +2 -2
- package/build/services/WorkflowService.mjs +7 -2
- package/build/services/WorkflowService.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -2,40 +2,40 @@
|
|
|
2
2
|
"schema": "https://npmvc.com/schemas/attestation-bundle/v1",
|
|
3
3
|
"package": {
|
|
4
4
|
"name": "@ajna-inc/workflow",
|
|
5
|
-
"version": "0.6.
|
|
5
|
+
"version": "0.6.5"
|
|
6
6
|
},
|
|
7
|
-
"bundledAt": "2026-
|
|
7
|
+
"bundledAt": "2026-05-01T13:15:36.707Z",
|
|
8
8
|
"envelopes": [
|
|
9
9
|
{
|
|
10
10
|
"payloadType": "application/vc+json",
|
|
11
|
-
"payload": "
|
|
11
|
+
"payload": "eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiLCJodHRwczovL25wbXZjLmNvbS9zY2hlbWFzL3N1cHBseWNoYWluL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImJ1aWxkQ29tbWFuZCI6InRzZG93biAtLWNvbmZpZy1sb2FkZXIgdW5jb25maWciLCJidWlsZGVyIjp7ImlkIjoiZGlkOmtleTp6Nk1raEo1WUJTZEJMSEhKYmppNDVraUpuUmRMVURQdVRWaTdkUDg0TWpTdUV1Y28iLCJraW5kIjoibG9jYWwifSwiaWQiOiJwa2c6bnBtL0Bham5hLWluYy93b3JrZmxvd0AwLjYuNSIsInJlcHJvZHVjaWJsZSI6ZmFsc2UsInNsc2FMZXZlbCI6Miwic291cmNlUmVwbyI6eyJjb21taXQiOiI0N2E5ZTU2NGE3MGI2M2NiYmI4MzkwOTNjZDBiODAxNDY1Y2I1NzM0IiwidHlwZSI6ImdpdCIsInVybCI6InVua25vd24ifSwidGFyYmFsbCI6eyJkaWdlc3QiOnt9LCJuYW1lIjoiQGFqbmEtaW5jL3dvcmtmbG93IiwidmVyc2lvbiI6IjAuNi41In0sInRvb2xjaGFpbiI6eyJub2RlIjoiMjAuMTkuNSIsIm5wbSI6IjEwLjIyLjAifX0sImlkIjoidXJuOnV1aWQ6MTE5ZDNkZTctM2ZiNi00MTY4LTk3ZDQtZWUzYzU5MWRhNzljIiwiaXNzdWVyIjoiZGlkOmtleTp6Nk1raEo1WUJTZEJMSEhKYmppNDVraUpuUmRMVURQdVRWaTdkUDg0TWpTdUV1Y28iLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiUHJvdmVuYW5jZUNyZWRlbnRpYWwiXSwidmFsaWRGcm9tIjoiMjAyNi0wNS0wMVQxMzoxNTozNi40NTZaIn0=",
|
|
12
12
|
"signatures": [
|
|
13
13
|
{
|
|
14
14
|
"keyid": "did:key:z6MkhJ5YBSdBLHHJbji45kiJnRdLUDPuTVi7dP84MjSuEuco#z6MkhJ5YBSdBLHHJbji45kiJnRdLUDPuTVi7dP84MjSuEuco",
|
|
15
15
|
"alg": "Ed25519",
|
|
16
|
-
"sig": "
|
|
16
|
+
"sig": "qaZkB7kCctlf7hN8GLcy66CiAyuWj8Q+vnXweRtYeLQllxAy3EGzlmbQWx+w0tAGayETGe0AYAPTwVJrMfboBQ=="
|
|
17
17
|
}
|
|
18
18
|
]
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"payloadType": "application/vc+json",
|
|
22
|
-
"payload": "
|
|
22
|
+
"payload": "eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiLCJodHRwczovL25wbXZjLmNvbS9zY2hlbWFzL3N1cHBseWNoYWluL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImRlY2xhcmVkU2NyaXB0cyI6WyJidWlsZCIsInByZXB1Ymxpc2hPbmx5IiwiY2xlYW4iLCJwcmVwYWNrIl0sImlkIjoicGtnOm5wbS9AYWpuYS1pbmMvd29ya2Zsb3dAMC42LjUiLCJwb3N0SW5zdGFsbFBvbGljeSI6ImZvcmJpZGRlbiIsInRhcmJhbGwiOnsiZGlnZXN0Ijp7fSwibmFtZSI6IkBham5hLWluYy93b3JrZmxvdyIsInZlcnNpb24iOiIwLjYuNSJ9LCJ3aGl0ZWxpc3RlZFNjcmlwdHMiOltdfSwiaWQiOiJ1cm46dXVpZDo5NDc3ZTcyZS0wMWQ4LTQxMTktOTBkOC1iYzM0YWVhNTk4MDYiLCJpc3N1ZXIiOiJkaWQ6a2V5Ono2TWtoSjVZQlNkQkxISEpiamk0NWtpSm5SZExVRFB1VFZpN2RQODRNalN1RXVjbyIsInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJMaWZlY3ljbGVQb2xpY3lDcmVkZW50aWFsIl0sInZhbGlkRnJvbSI6IjIwMjYtMDUtMDFUMTM6MTU6MzYuNDc0WiJ9",
|
|
23
23
|
"signatures": [
|
|
24
24
|
{
|
|
25
25
|
"keyid": "did:key:z6MkhJ5YBSdBLHHJbji45kiJnRdLUDPuTVi7dP84MjSuEuco#z6MkhJ5YBSdBLHHJbji45kiJnRdLUDPuTVi7dP84MjSuEuco",
|
|
26
26
|
"alg": "Ed25519",
|
|
27
|
-
"sig": "
|
|
27
|
+
"sig": "cgfmd3JnIAn/rfyZYzeKs1fVAYMY5DOzarBPR/Qr4x4TfPaoa+bvOUCS8k6uTDgHq1309tOVvRuC0J9GnXEKAA=="
|
|
28
28
|
}
|
|
29
29
|
]
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"payloadType": "application/vc+json",
|
|
33
|
-
"payload": "
|
|
33
|
+
"payload": "eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiLCJodHRwczovL25wbXZjLmNvbS9zY2hlbWFzL3N1cHBseWNoYWluL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImZvcm1hdCI6ImN5Y2xvbmVkeC0xLjYiLCJpZCI6InBrZzpucG0vQGFqbmEtaW5jL3dvcmtmbG93QDAuNi41Iiwic2JvbURpZ2VzdCI6eyJhbGciOiJzaGEyNTYiLCJoZXgiOiIxNmYxMjhiZTM5ZjdlMTRlYWYxZDZmOTliMmRiNDJlMzhiZGY3MzMxYzkyYmQxM2YyYWY3MTM4MTExNTVjYzczIn0sInNib21VcmwiOiIuLy5ucG12Yy9zYm9tLmNkeC5qc29uIiwidGFyYmFsbCI6eyJkaWdlc3QiOnt9LCJuYW1lIjoiQGFqbmEtaW5jL3dvcmtmbG93IiwidmVyc2lvbiI6IjAuNi41In19LCJpZCI6InVybjp1dWlkOjI0NzYzMzI4LTY4MTYtNGE5Ni04MTRiLWYwMjhhM2FlZjk3YiIsImlzc3VlciI6ImRpZDprZXk6ejZNa2hKNVlCU2RCTEhISmJqaTQ1a2lKblJkTFVEUHVUVmk3ZFA4NE1qU3VFdWNvIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlNib21DcmVkZW50aWFsIl0sInZhbGlkRnJvbSI6IjIwMjYtMDUtMDFUMTM6MTU6MzYuNzA2WiJ9",
|
|
34
34
|
"signatures": [
|
|
35
35
|
{
|
|
36
36
|
"keyid": "did:key:z6MkhJ5YBSdBLHHJbji45kiJnRdLUDPuTVi7dP84MjSuEuco#z6MkhJ5YBSdBLHHJbji45kiJnRdLUDPuTVi7dP84MjSuEuco",
|
|
37
37
|
"alg": "Ed25519",
|
|
38
|
-
"sig": "
|
|
38
|
+
"sig": "h49MUZpK9ahdL3H2IqizIWEkNKo/kQ36qeHhX9mTV6/yvLGNNQkgGjbvAWrQ1Yi10HndDTQ4hgxFt+ZwILPUDA=="
|
|
39
39
|
}
|
|
40
40
|
]
|
|
41
41
|
}
|
package/.npmvc/sbom.cdx.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"specVersion": "1.6",
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
|
-
"timestamp": "2026-
|
|
6
|
+
"timestamp": "2026-05-01T13:15:36.701Z",
|
|
7
7
|
"component": {
|
|
8
8
|
"type": "application",
|
|
9
9
|
"name": "@ajna-inc/workflow",
|
|
10
|
-
"version": "0.6.
|
|
11
|
-
"purl": "pkg:npm/%40ajna-inc/workflow@0.6.
|
|
10
|
+
"version": "0.6.5",
|
|
11
|
+
"purl": "pkg:npm/%40ajna-inc/workflow@0.6.5"
|
|
12
12
|
},
|
|
13
13
|
"tools": [
|
|
14
14
|
{
|
package/build/WorkflowModule.mjs
CHANGED
|
@@ -101,7 +101,7 @@ var WorkflowModule = class {
|
|
|
101
101
|
}
|
|
102
102
|
};
|
|
103
103
|
} catch (error) {
|
|
104
|
-
logger.
|
|
104
|
+
logger.warn("WorkflowModule - unable to resolve context for event", {
|
|
105
105
|
contextCorrelationId: correlationId,
|
|
106
106
|
error: error.message
|
|
107
107
|
});
|
|
@@ -111,9 +111,16 @@ var WorkflowModule = class {
|
|
|
111
111
|
events.on(DidCommCredentialEventTypes.DidCommCredentialStateChanged, async (e) => {
|
|
112
112
|
const rec = e.payload.credentialExchangeRecord;
|
|
113
113
|
const connId = rec.connectionId;
|
|
114
|
-
|
|
114
|
+
logger.info(`[WorkflowModule] Credential state changed: ${rec.state}, connectionId=${connId}, contextCorrelationId=${e.metadata?.contextCorrelationId}`);
|
|
115
|
+
if (!connId) {
|
|
116
|
+
logger.warn("[WorkflowModule] No connectionId on credential record, skipping auto-advance");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
115
119
|
const scoped = await resolveEventContext(e.metadata);
|
|
116
|
-
if (!scoped)
|
|
120
|
+
if (!scoped) {
|
|
121
|
+
logger.warn("[WorkflowModule] Failed to resolve event context, skipping auto-advance");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
117
124
|
try {
|
|
118
125
|
if (rec.state === DidCommCredentialState.ProposalReceived) await service.autoAdvanceByConnection(scoped.context, connId, "proposal_received");
|
|
119
126
|
else if (rec.state === DidCommCredentialState.OfferReceived) await service.autoAdvanceByConnection(scoped.context, connId, "offer_received");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowModule.mjs","names":["createPaymentsV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)","PaymentsEventTypes: Partial<Record<PaymentEvtKeys, string>> | undefined","createPoeV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)","PoeEventTypes: Partial<Record<PoeEvtKeys, string>> | undefined","PoeState: { [key: string]: string } | undefined","workflowEvent: string | undefined","g: any","metadata: EventMetadata"],"sources":["../src/WorkflowModule.ts"],"sourcesContent":["import type { WorkflowModuleConfigOptions } from './WorkflowModuleConfig'\nimport type { AgentContext, DependencyManager, Module, AgentContextProvider, EventMetadata } from '@credo-ts/core'\nimport type { DidCommCredentialStateChangedEvent, DidCommProofStateChangedEvent } from '@credo-ts/didcomm'\n\nimport { AgentConfig, EventEmitter, InjectionSymbols } from '@credo-ts/core'\n\nimport { DidCommCredentialEventTypes, DidCommProofEventTypes, DidCommProtocol } from '@credo-ts/didcomm'\n\nimport { DidCommCredentialState, DidCommProofState } from '@credo-ts/didcomm'\n\nimport { DidCommFeatureRegistry, DidCommMessageHandlerRegistry, DidCommMessageSender, DidCommOutboundMessageContext, ReturnRouteTypes } from '@credo-ts/didcomm'\n\nimport { WorkflowModuleConfig } from './WorkflowModuleConfig'\nimport { CommandQueueService } from './queue/CommandQueue'\nimport { PersistentCommandQueue } from './queue/PersistentCommandQueue'\nimport { WorkflowApi } from './api/WorkflowApi'\nimport { WorkflowCommandRepository } from './repository/WorkflowCommandRepository'\nimport { AdvanceHandler } from './protocol/handlers/AdvanceHandler'\nimport { CancelHandler } from './protocol/handlers/CancelHandler'\nimport { CompleteHandler } from './protocol/handlers/CompleteHandler'\nimport { DiscoverHandler } from './protocol/handlers/DiscoverHandler'\nimport { FetchTemplateHandler } from './protocol/handlers/FetchTemplateHandler'\nimport { TemplateHandler } from './protocol/handlers/TemplateHandler'\nimport { PauseHandler } from './protocol/handlers/PauseHandler'\nimport { ProblemReportHandler } from './protocol/handlers/ProblemReportHandler'\nimport { PublishTemplateHandler } from './protocol/handlers/PublishTemplateHandler'\nimport { ResumeHandler } from './protocol/handlers/ResumeHandler'\nimport { StartHandler } from './protocol/handlers/StartHandler'\nimport { StatusHandler } from './protocol/handlers/StatusHandler'\nimport { WorkflowInstanceRepository } from './repository/WorkflowInstanceRepository'\nimport { WorkflowTemplateRepository } from './repository/WorkflowTemplateRepository'\nimport { WorkflowService } from './services/WorkflowService'\nimport { DidCommConnectionService } from '@credo-ts/didcomm'\n\nexport const WORKFLOW_PROTOCOL_URI = 'https://didcomm.org/workflow/1.0'\nexport const WORKFLOW_ROLES = ['processor', 'coordinator'] as const\n\nexport class WorkflowModule implements Module {\n public readonly api = WorkflowApi\n public readonly config: WorkflowModuleConfig\n\n public constructor(options?: WorkflowModuleConfigOptions) {\n this.config = new WorkflowModuleConfig(options)\n }\n\n public register(dependencyManager: DependencyManager) {\n dependencyManager.resolve(AgentConfig).logger.info('Registering WorkflowModule')\n dependencyManager.registerInstance(WorkflowModuleConfig, this.config)\n\n dependencyManager.registerSingleton(WorkflowTemplateRepository)\n dependencyManager.registerSingleton(WorkflowInstanceRepository)\n dependencyManager.registerSingleton(WorkflowCommandRepository)\n dependencyManager.registerSingleton(WorkflowService)\n // IMPORTANT: Do not register WorkflowApi as a singleton here.\n // The DependencyManager will register `module.api` (WorkflowApi) as context-scoped\n // via `registerModules`, ensuring a fresh API instance per AgentContext (tenant-safe).\n\n dependencyManager.registerSingleton(PublishTemplateHandler)\n dependencyManager.registerSingleton(StartHandler)\n dependencyManager.registerSingleton(AdvanceHandler)\n dependencyManager.registerSingleton(StatusHandler)\n dependencyManager.registerSingleton(ProblemReportHandler)\n dependencyManager.registerSingleton(PauseHandler)\n dependencyManager.registerSingleton(ResumeHandler)\n dependencyManager.registerSingleton(CancelHandler)\n dependencyManager.registerSingleton(CompleteHandler)\n dependencyManager.registerSingleton(DiscoverHandler)\n dependencyManager.registerSingleton(FetchTemplateHandler)\n dependencyManager.registerSingleton(TemplateHandler)\n }\n\n public async initialize(agentContext: AgentContext): Promise<void> {\n const dm = agentContext.dependencyManager\n const logger = dm.resolve(AgentConfig).logger\n const features = dm.resolve(DidCommFeatureRegistry)\n const handlers = dm.resolve(DidCommMessageHandlerRegistry)\n logger.info('Initializing WorkflowModule - registering workflow/1.0 protocol')\n try {\n features.register(new DidCommProtocol({ id: WORKFLOW_PROTOCOL_URI, roles: [...WORKFLOW_ROLES] }))\n } catch (_e) {\n void 0\n }\n handlers.registerMessageHandler(dm.resolve(PublishTemplateHandler))\n handlers.registerMessageHandler(dm.resolve(StartHandler))\n handlers.registerMessageHandler(dm.resolve(AdvanceHandler))\n handlers.registerMessageHandler(dm.resolve(StatusHandler))\n handlers.registerMessageHandler(dm.resolve(ProblemReportHandler))\n handlers.registerMessageHandler(dm.resolve(PauseHandler))\n handlers.registerMessageHandler(dm.resolve(ResumeHandler))\n handlers.registerMessageHandler(dm.resolve(CancelHandler))\n handlers.registerMessageHandler(dm.resolve(CompleteHandler))\n // discovery/fetch extension\n handlers.registerMessageHandler(dm.resolve(DiscoverHandler))\n handlers.registerMessageHandler(dm.resolve(FetchTemplateHandler))\n handlers.registerMessageHandler(dm.resolve(TemplateHandler))\n // Inbound mapping: credentials/proofs → workflow events\n const events = dm.resolve(EventEmitter)\n const service = dm.resolve(WorkflowService)\n const contextProvider = dm.resolve<AgentContextProvider>(InjectionSymbols.AgentContextProvider)\n const rootContextId = agentContext.contextCorrelationId\n\n const resolveEventContext = async (\n metadata: EventMetadata | undefined\n ): Promise<{ context: AgentContext; release: () => Promise<void> } | null> => {\n const correlationId = metadata?.contextCorrelationId\n if (!correlationId || correlationId === rootContextId) {\n return { context: agentContext, release: async () => {} }\n }\n\n try {\n const scopedContext = await contextProvider.getAgentContextForContextCorrelationId(correlationId)\n return {\n context: scopedContext,\n release: async () => {\n try {\n await contextProvider.endSessionForAgentContext(scopedContext)\n } catch (error) {\n logger.debug('WorkflowModule - failed to end tenant session after event', {\n contextCorrelationId: correlationId,\n error: (error as Error).message,\n })\n }\n },\n }\n } catch (error) {\n logger.debug('WorkflowModule - unable to resolve context for event', {\n contextCorrelationId: correlationId,\n error: (error as Error).message,\n })\n return null\n }\n }\n\n events.on<DidCommCredentialStateChangedEvent>(DidCommCredentialEventTypes.DidCommCredentialStateChanged, async (e) => {\n const rec = e.payload.credentialExchangeRecord\n const connId = rec.connectionId\n if (!connId) return\n const scoped = await resolveEventContext(e.metadata)\n if (!scoped) return\n try {\n if (rec.state === DidCommCredentialState.ProposalReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'proposal_received')\n } else if (rec.state === DidCommCredentialState.OfferReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'offer_received')\n } else if (rec.state === DidCommCredentialState.RequestReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'request_received')\n } else if (rec.state === DidCommCredentialState.Done) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'issued_ack')\n }\n } finally {\n await scoped.release()\n }\n })\n events.on<DidCommProofStateChangedEvent>(DidCommProofEventTypes.ProofStateChanged, async (e) => {\n const rec = e.payload.proofRecord\n const connId = rec.connectionId\n if (!connId) return\n const scoped = await resolveEventContext(e.metadata)\n if (!scoped) return\n try {\n if (rec.state === DidCommProofState.PresentationReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'presentation_received')\n } else if (rec.state === DidCommProofState.Done) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'verified_ack')\n }\n } finally {\n await scoped.release()\n }\n })\n\n // Optional: register payments v1 actions when payments module is available\n try {\n let createPaymentsV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)\n try {\n ;({ createPaymentsV1Actions } = require('@credo-ts/payments'))\n } catch {\n /* optional dependency */\n }\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@credo-ts/payments/workflow/PaymentsV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@credo-ts/payments/workflow/PaymentsV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n // Try @ajna-inc/payments (static require for React Native compatibility)\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@ajna-inc/payments'))\n } catch {\n /* optional dependency */\n }\n }\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@ajna-inc/payments/workflow/PaymentsV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n if (createPaymentsV1Actions) {\n const actions = createPaymentsV1Actions()\n try {\n // Prefer explicit API if available\n const svcAny = service as unknown as {\n registerActions?: (actions: unknown[]) => void\n actions?: { register: (h: unknown) => void }\n }\n if (typeof svcAny.registerActions === 'function') {\n svcAny.registerActions(actions)\n } else if (svcAny.actions && typeof svcAny.actions.register === 'function') {\n for (const a of actions) svcAny.actions.register(a)\n } else {\n throw new Error('no action registry available')\n }\n logger.info('WorkflowModule - registered PaymentsV1 actions')\n } catch (_e) {\n // swallow\n }\n }\n } catch {\n /* optional dependency */\n }\n\n // Optional: map payments events → workflow events (guarded if payments not installed)\n if (this.config.enablePaymentsEventMapping)\n try {\n type PaymentEvtKeys =\n | 'IntroResponded'\n | 'HandshakeAccepted'\n | 'ComplianceRequired'\n | 'ComplianceSatisfied'\n | 'ComplianceRejected'\n | 'SettlementUpdated'\n let PaymentsEventTypes: Partial<Record<PaymentEvtKeys, string>> | undefined\n try {\n ;({ PaymentsEventTypes } = require('@credo-ts/payments'))\n } catch {\n /* optional dependency */\n }\n if (!PaymentsEventTypes) {\n try {\n ;({ PaymentsEventTypes } = require('@credo-ts/payments/events/PaymentEvents'))\n } catch {\n /* optional dependency */\n }\n }\n if (!PaymentsEventTypes) {\n try {\n ;({ PaymentsEventTypes } = require('@credo-ts/payments/events/PaymentEvents'))\n } catch {\n /* optional dependency */\n }\n }\n if (!PaymentsEventTypes) throw new Error('payments not available')\n\n const adv = async (threadId: string, event: string, metadata?: EventMetadata) => {\n const scoped = await resolveEventContext(metadata)\n if (!scoped) return\n try {\n await service.advance(scoped.context, {\n instance_id: threadId,\n event,\n idempotency_key: `auto:payments:${event}:${threadId}`,\n })\n } catch (e) {\n logger.debug(`[Workflow] payments event advance error: ${(e as Error).message}`)\n } finally {\n await scoped.release()\n }\n }\n type PaymentListener = (e: {\n payload?: { threadId?: string; status?: string }\n metadata?: EventMetadata\n }) => void\n const on = (evt: string, cb: PaymentListener) =>\n (events as unknown as { on?: (evt: string, cb: PaymentListener) => void }).on?.(evt, cb)\n if (PaymentsEventTypes.IntroResponded)\n on(PaymentsEventTypes.IntroResponded, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.methods_received', e?.metadata)\n })\n if (PaymentsEventTypes.HandshakeAccepted)\n on(PaymentsEventTypes.HandshakeAccepted, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.handshake_accepted', e?.metadata)\n })\n if (PaymentsEventTypes.ComplianceRequired)\n on(PaymentsEventTypes.ComplianceRequired, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.compliance_required', e?.metadata)\n })\n if (PaymentsEventTypes.ComplianceSatisfied)\n on(PaymentsEventTypes.ComplianceSatisfied, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.compliance_satisfied', e?.metadata)\n })\n if (PaymentsEventTypes.ComplianceRejected)\n on(PaymentsEventTypes.ComplianceRejected, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.compliance_rejected', e?.metadata)\n })\n if (PaymentsEventTypes.SettlementUpdated)\n on(PaymentsEventTypes.SettlementUpdated, async (e) => {\n const p = e?.payload\n const th = p?.threadId\n const status = p?.status\n if (!status) return\n const map: Record<string, string> = {\n received: 'payments.receipt_received',\n pending: 'payments.settlement_pending',\n settled: 'payments.settled',\n failed: 'payments.failed',\n }\n const ev = map[status]\n if (ev && th) await adv(th, ev, e?.metadata)\n })\n logger.info('WorkflowModule - registered Payments event listeners')\n } catch {\n /* optional dependency */\n }\n\n // Optional: register POE v1 actions when POE module is available\n try {\n let createPoeV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)\n try {\n ;({ createPoeV1Actions } = require('@ajna-inc/poe'))\n } catch {\n /* optional dependency */\n }\n if (!createPoeV1Actions) {\n try {\n ;({ createPoeV1Actions } = require('@ajna-inc/poe/workflow/PoeV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n if (createPoeV1Actions) {\n const actions = createPoeV1Actions()\n try {\n const svcAny = service as unknown as {\n registerActions?: (actions: unknown[]) => void\n actions?: { register: (h: unknown) => void }\n }\n if (typeof svcAny.registerActions === 'function') {\n svcAny.registerActions(actions)\n } else if (svcAny.actions && typeof svcAny.actions.register === 'function') {\n for (const a of actions) svcAny.actions.register(a)\n } else {\n throw new Error('no action registry available')\n }\n logger.info('WorkflowModule - registered PoeV1 actions')\n } catch (_e) {\n // swallow\n }\n }\n } catch {\n /* optional dependency */\n }\n\n // Optional: map POE events → workflow events (guarded if POE not installed)\n if (this.config.enablePoeEventMapping)\n try {\n type PoeEvtKeys = 'PoeStateChanged'\n let PoeEventTypes: Partial<Record<PoeEvtKeys, string>> | undefined\n let PoeState: { [key: string]: string } | undefined\n try {\n ;({ PoeEventTypes, PoeState } = require('@ajna-inc/poe'))\n } catch {\n /* optional dependency */\n }\n if (!PoeEventTypes || !PoeState) throw new Error('poe not available')\n\n type PoeListener = (e: {\n payload?: {\n poeRecord?: {\n id?: string\n connectionId?: string\n sessionId?: string\n state?: string\n programId?: string\n verificationResult?: { verified?: boolean; errors?: string[] }\n finalProof?: { result?: unknown }\n }\n previousState?: string\n }\n metadata?: EventMetadata\n }) => void\n const on = (evt: string, cb: PoeListener) =>\n (events as unknown as { on?: (evt: string, cb: PoeListener) => void }).on?.(evt, cb)\n\n if (PoeEventTypes.PoeStateChanged)\n on(PoeEventTypes.PoeStateChanged, async (e) => {\n const poeRecord = e?.payload?.poeRecord\n const connectionId = poeRecord?.connectionId\n if (!connectionId) return\n\n const scoped = await resolveEventContext(e?.metadata)\n if (!scoped) return\n try {\n let workflowEvent: string | undefined\n\n switch (poeRecord.state) {\n case PoeState?.RequestReceived:\n workflowEvent = 'poe.request_received'\n break\n case PoeState?.SubmitReceived:\n workflowEvent = poeRecord.verificationResult?.verified\n ? 'poe.verified'\n : 'poe.verification_failed'\n break\n case PoeState?.ProposalReceived:\n workflowEvent = 'poe.proposal_received'\n break\n case PoeState?.Accepted:\n workflowEvent = 'poe.accepted'\n break\n case PoeState?.Declined:\n workflowEvent = 'poe.declined'\n break\n case PoeState?.Complete:\n workflowEvent = 'poe.completed'\n break\n case PoeState?.Problem:\n workflowEvent = 'poe.problem'\n break\n case PoeState?.ChallengeReceived:\n workflowEvent = 'poe.challenge_received'\n break\n }\n\n if (workflowEvent) {\n await service.autoAdvanceByConnection(\n scoped.context,\n connectionId,\n workflowEvent\n )\n }\n } catch (err) {\n logger.debug(`[Workflow] POE event advance error: ${(err as Error).message}`)\n } finally {\n await scoped.release()\n }\n })\n logger.info('WorkflowModule - registered POE event listeners')\n } catch {\n /* optional dependency */\n }\n\n // Initialize persistent command queue (always enabled, no Redis needed)\n logger.info('WorkflowModule - initializing persistent command queue')\n const commandRepo = dm.resolve(WorkflowCommandRepository)\n const queue = new PersistentCommandQueue(commandRepo, contextProvider, agentContext, {\n pollIntervalMs: this.config.asyncQueue?.pollIntervalMs,\n concurrency: this.config.asyncQueue?.concurrency,\n processingTimeoutMs: this.config.asyncQueue?.processingTimeoutMs,\n staleCheckIntervalMs: this.config.asyncQueue?.staleCheckIntervalMs,\n cleanupIntervalMs: this.config.asyncQueue?.cleanupIntervalMs,\n commandRetentionMs: this.config.asyncQueue?.commandRetentionMs,\n failedRetentionMs: this.config.asyncQueue?.failedRetentionMs,\n maxAttempts: this.config.asyncQueue?.maxAttempts,\n })\n\n // Test-time helper: register queue instance globally for best-effort shutdown in afterAll\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const g: any = globalThis as unknown\n g.__WF_QUEUES = g.__WF_QUEUES || new Set()\n g.__WF_QUEUES.add(queue)\n } catch {\n /* noop */\n }\n\n // In tests or minimal environments, dependencyManager may not expose registerInstance\n try {\n const anyDm = dm as unknown as { registerInstance?: (ctor: unknown, instance: unknown) => void }\n anyDm.registerInstance?.(CommandQueueService, queue)\n } catch {\n // no-op if DI container doesn't support instance registration in this context\n }\n\n // Start worker: processes commands and sends follow-up status messages\n await queue.startWorker(async (job) => {\n // Context resolution handled inside PersistentCommandQueue\n // Worker receives job with already-resolved context\n\n // This worker callback is called from PersistentCommandQueue.processCommand\n // which already resolves the context, so we need to get it here\n const metadata: EventMetadata = { contextCorrelationId: job.contextCorrelationId }\n const scoped = await (async () => {\n const correlationId = metadata.contextCorrelationId\n if (!correlationId || correlationId === rootContextId) {\n return { context: agentContext, release: async () => {} }\n }\n try {\n const scopedContext = await contextProvider.getAgentContextForContextCorrelationId(correlationId)\n return {\n context: scopedContext,\n release: async () => {\n try {\n await contextProvider.endSessionForAgentContext(scopedContext)\n } catch (error) {\n logger.debug('WorkflowModule - failed to end tenant session after queue job', {\n contextCorrelationId: correlationId,\n error: (error as Error).message,\n })\n }\n },\n }\n } catch (error) {\n logger.debug('WorkflowModule - unable to resolve context for queue job', {\n error: (error as Error).message,\n })\n return null\n }\n })()\n if (!scoped) return\n try {\n const ctx = scoped.context\n try {\n logger.info('[WorkflowWorker] handling job', {\n cmd: (job as { cmd?: string }).cmd,\n thid: (job as { thid?: string }).thid,\n connectionId: (job as { connectionId?: string }).connectionId,\n contextCorrelationId: (job as { contextCorrelationId?: string }).contextCorrelationId,\n })\n } catch {}\n switch (job.cmd) {\n case 'start': {\n // Ensure template exists before starting. If missing, attempt auto-discover and defer.\n try {\n const templateRepo = dm.resolve(WorkflowTemplateRepository)\n const p = (job.payload || {}) as unknown as {\n template_id?: string\n template_version?: string\n template_hash?: string\n allow_discover?: boolean\n }\n const templateRec = p.template_id\n ? await templateRepo.findByTemplateIdAndVersion(ctx, p.template_id, p.template_version)\n : null\n if (!templateRec) {\n const allowDiscover = p.allow_discover ?? true\n if (allowDiscover && this.config.enableAutoDiscoverOnStart && job.connectionId) {\n try {\n const sender = dm.resolve(DidCommMessageSender)\n const connectionSvc = dm.resolve(DidCommConnectionService)\n const connection = await connectionSvc.getById(ctx, job.connectionId)\n const { FetchTemplateMessage } = require('./protocol/messages/FetchTemplateMessage')\n const fetch = new FetchTemplateMessage({\n thid: job.thid,\n body: {\n template_id: p.template_id,\n template_version: p.template_version,\n prefer_hash: p.template_hash,\n },\n })\n try {\n fetch.setReturnRouting(ReturnRouteTypes.thread, job.thid)\n } catch {}\n const outbound = new DidCommOutboundMessageContext(fetch, { agentContext: ctx, connection })\n await sender.sendMessage(outbound)\n try {\n logger.info('[WorkflowWorker] fetch-template sent from worker', {\n thid: job.thid,\n template_id: p.template_id,\n template_version: p.template_version,\n })\n } catch {}\n } catch (e) {\n logger.debug('WorkflowModule - fetch-template send failed in worker', {\n error: (e as Error).message,\n })\n }\n }\n // Defer start by signaling invalid_template so queue will retry later\n const err = new Error('template not found for start') as Error & { code?: string }\n err.code = 'invalid_template'\n throw err\n }\n } catch (precheckErr) {\n // Rethrow to queue-level handler for unified deferral behavior\n throw precheckErr\n }\n await service.start(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] start completed', { thid: job.thid }) } catch {}\n break\n }\n case 'advance':\n await service.advance(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] advance completed', { thid: job.thid }) } catch {}\n break\n case 'pause':\n await service.pause(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] pause completed', { thid: job.thid }) } catch {}\n break\n case 'resume':\n await service.resume(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] resume completed', { thid: job.thid }) } catch {}\n break\n case 'cancel':\n await service.cancel(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] cancel completed', { thid: job.thid }) } catch {}\n break\n case 'complete':\n await service.complete(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] complete completed', { thid: job.thid }) } catch {}\n break\n }\n\n // Note: Per Workflow 1.0 spec §11.6 and §3.4, status is provided on-demand (pull-based).\n // The spec defines status as a request/response pattern where Coordinators explicitly\n // request status via StatusRequestMessage, and Processors respond with StatusMessage.\n //\n // Unsolicited push notifications are not part of the base protocol and cause issues:\n // - Tenant context mismatches in multi-tenant deployments\n // - Receivers interpret unsolicited StatusMessage as a request (same @type)\n // - HTTP transport timeouts (fire-and-forget over request/response transport)\n //\n // For real-time UI updates, use the existing WebSocket event system which emits\n // WorkflowInstanceStateChanged events to connected clients.\n } finally {\n await scoped.release()\n }\n })\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowModule.mjs","names":["createPaymentsV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)","PaymentsEventTypes: Partial<Record<PaymentEvtKeys, string>> | undefined","createPoeV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)","PoeEventTypes: Partial<Record<PoeEvtKeys, string>> | undefined","PoeState: { [key: string]: string } | undefined","workflowEvent: string | undefined","g: any","metadata: EventMetadata"],"sources":["../src/WorkflowModule.ts"],"sourcesContent":["import type { WorkflowModuleConfigOptions } from './WorkflowModuleConfig'\nimport type { AgentContext, DependencyManager, Module, AgentContextProvider, EventMetadata } from '@credo-ts/core'\nimport type { DidCommCredentialStateChangedEvent, DidCommProofStateChangedEvent } from '@credo-ts/didcomm'\n\nimport { AgentConfig, EventEmitter, InjectionSymbols } from '@credo-ts/core'\n\nimport { DidCommCredentialEventTypes, DidCommProofEventTypes, DidCommProtocol } from '@credo-ts/didcomm'\n\nimport { DidCommCredentialState, DidCommProofState } from '@credo-ts/didcomm'\n\nimport { DidCommFeatureRegistry, DidCommMessageHandlerRegistry, DidCommMessageSender, DidCommOutboundMessageContext, ReturnRouteTypes } from '@credo-ts/didcomm'\n\nimport { WorkflowModuleConfig } from './WorkflowModuleConfig'\nimport { CommandQueueService } from './queue/CommandQueue'\nimport { PersistentCommandQueue } from './queue/PersistentCommandQueue'\nimport { WorkflowApi } from './api/WorkflowApi'\nimport { WorkflowCommandRepository } from './repository/WorkflowCommandRepository'\nimport { AdvanceHandler } from './protocol/handlers/AdvanceHandler'\nimport { CancelHandler } from './protocol/handlers/CancelHandler'\nimport { CompleteHandler } from './protocol/handlers/CompleteHandler'\nimport { DiscoverHandler } from './protocol/handlers/DiscoverHandler'\nimport { FetchTemplateHandler } from './protocol/handlers/FetchTemplateHandler'\nimport { TemplateHandler } from './protocol/handlers/TemplateHandler'\nimport { PauseHandler } from './protocol/handlers/PauseHandler'\nimport { ProblemReportHandler } from './protocol/handlers/ProblemReportHandler'\nimport { PublishTemplateHandler } from './protocol/handlers/PublishTemplateHandler'\nimport { ResumeHandler } from './protocol/handlers/ResumeHandler'\nimport { StartHandler } from './protocol/handlers/StartHandler'\nimport { StatusHandler } from './protocol/handlers/StatusHandler'\nimport { WorkflowInstanceRepository } from './repository/WorkflowInstanceRepository'\nimport { WorkflowTemplateRepository } from './repository/WorkflowTemplateRepository'\nimport { WorkflowService } from './services/WorkflowService'\nimport { DidCommConnectionService } from '@credo-ts/didcomm'\n\nexport const WORKFLOW_PROTOCOL_URI = 'https://didcomm.org/workflow/1.0'\nexport const WORKFLOW_ROLES = ['processor', 'coordinator'] as const\n\nexport class WorkflowModule implements Module {\n public readonly api = WorkflowApi\n public readonly config: WorkflowModuleConfig\n\n public constructor(options?: WorkflowModuleConfigOptions) {\n this.config = new WorkflowModuleConfig(options)\n }\n\n public register(dependencyManager: DependencyManager) {\n dependencyManager.resolve(AgentConfig).logger.info('Registering WorkflowModule')\n dependencyManager.registerInstance(WorkflowModuleConfig, this.config)\n\n dependencyManager.registerSingleton(WorkflowTemplateRepository)\n dependencyManager.registerSingleton(WorkflowInstanceRepository)\n dependencyManager.registerSingleton(WorkflowCommandRepository)\n dependencyManager.registerSingleton(WorkflowService)\n // IMPORTANT: Do not register WorkflowApi as a singleton here.\n // The DependencyManager will register `module.api` (WorkflowApi) as context-scoped\n // via `registerModules`, ensuring a fresh API instance per AgentContext (tenant-safe).\n\n dependencyManager.registerSingleton(PublishTemplateHandler)\n dependencyManager.registerSingleton(StartHandler)\n dependencyManager.registerSingleton(AdvanceHandler)\n dependencyManager.registerSingleton(StatusHandler)\n dependencyManager.registerSingleton(ProblemReportHandler)\n dependencyManager.registerSingleton(PauseHandler)\n dependencyManager.registerSingleton(ResumeHandler)\n dependencyManager.registerSingleton(CancelHandler)\n dependencyManager.registerSingleton(CompleteHandler)\n dependencyManager.registerSingleton(DiscoverHandler)\n dependencyManager.registerSingleton(FetchTemplateHandler)\n dependencyManager.registerSingleton(TemplateHandler)\n }\n\n public async initialize(agentContext: AgentContext): Promise<void> {\n const dm = agentContext.dependencyManager\n const logger = dm.resolve(AgentConfig).logger\n const features = dm.resolve(DidCommFeatureRegistry)\n const handlers = dm.resolve(DidCommMessageHandlerRegistry)\n logger.info('Initializing WorkflowModule - registering workflow/1.0 protocol')\n try {\n features.register(new DidCommProtocol({ id: WORKFLOW_PROTOCOL_URI, roles: [...WORKFLOW_ROLES] }))\n } catch (_e) {\n void 0\n }\n handlers.registerMessageHandler(dm.resolve(PublishTemplateHandler))\n handlers.registerMessageHandler(dm.resolve(StartHandler))\n handlers.registerMessageHandler(dm.resolve(AdvanceHandler))\n handlers.registerMessageHandler(dm.resolve(StatusHandler))\n handlers.registerMessageHandler(dm.resolve(ProblemReportHandler))\n handlers.registerMessageHandler(dm.resolve(PauseHandler))\n handlers.registerMessageHandler(dm.resolve(ResumeHandler))\n handlers.registerMessageHandler(dm.resolve(CancelHandler))\n handlers.registerMessageHandler(dm.resolve(CompleteHandler))\n // discovery/fetch extension\n handlers.registerMessageHandler(dm.resolve(DiscoverHandler))\n handlers.registerMessageHandler(dm.resolve(FetchTemplateHandler))\n handlers.registerMessageHandler(dm.resolve(TemplateHandler))\n // Inbound mapping: credentials/proofs → workflow events\n const events = dm.resolve(EventEmitter)\n const service = dm.resolve(WorkflowService)\n const contextProvider = dm.resolve<AgentContextProvider>(InjectionSymbols.AgentContextProvider)\n const rootContextId = agentContext.contextCorrelationId\n\n const resolveEventContext = async (\n metadata: EventMetadata | undefined\n ): Promise<{ context: AgentContext; release: () => Promise<void> } | null> => {\n const correlationId = metadata?.contextCorrelationId\n if (!correlationId || correlationId === rootContextId) {\n return { context: agentContext, release: async () => {} }\n }\n\n try {\n const scopedContext = await contextProvider.getAgentContextForContextCorrelationId(correlationId)\n return {\n context: scopedContext,\n release: async () => {\n try {\n await contextProvider.endSessionForAgentContext(scopedContext)\n } catch (error) {\n logger.debug('WorkflowModule - failed to end tenant session after event', {\n contextCorrelationId: correlationId,\n error: (error as Error).message,\n })\n }\n },\n }\n } catch (error) {\n logger.warn('WorkflowModule - unable to resolve context for event', {\n contextCorrelationId: correlationId,\n error: (error as Error).message,\n })\n return null\n }\n }\n\n events.on<DidCommCredentialStateChangedEvent>(DidCommCredentialEventTypes.DidCommCredentialStateChanged, async (e) => {\n const rec = e.payload.credentialExchangeRecord\n const connId = rec.connectionId\n logger.info(`[WorkflowModule] Credential state changed: ${rec.state}, connectionId=${connId}, contextCorrelationId=${e.metadata?.contextCorrelationId}`)\n if (!connId) { logger.warn('[WorkflowModule] No connectionId on credential record, skipping auto-advance'); return }\n const scoped = await resolveEventContext(e.metadata)\n if (!scoped) { logger.warn('[WorkflowModule] Failed to resolve event context, skipping auto-advance'); return }\n try {\n if (rec.state === DidCommCredentialState.ProposalReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'proposal_received')\n } else if (rec.state === DidCommCredentialState.OfferReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'offer_received')\n } else if (rec.state === DidCommCredentialState.RequestReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'request_received')\n } else if (rec.state === DidCommCredentialState.Done) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'issued_ack')\n }\n } finally {\n await scoped.release()\n }\n })\n events.on<DidCommProofStateChangedEvent>(DidCommProofEventTypes.ProofStateChanged, async (e) => {\n const rec = e.payload.proofRecord\n const connId = rec.connectionId\n if (!connId) return\n const scoped = await resolveEventContext(e.metadata)\n if (!scoped) return\n try {\n if (rec.state === DidCommProofState.PresentationReceived) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'presentation_received')\n } else if (rec.state === DidCommProofState.Done) {\n await service.autoAdvanceByConnection(scoped.context, connId, 'verified_ack')\n }\n } finally {\n await scoped.release()\n }\n })\n\n // Optional: register payments v1 actions when payments module is available\n try {\n let createPaymentsV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)\n try {\n ;({ createPaymentsV1Actions } = require('@credo-ts/payments'))\n } catch {\n /* optional dependency */\n }\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@credo-ts/payments/workflow/PaymentsV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@credo-ts/payments/workflow/PaymentsV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n // Try @ajna-inc/payments (static require for React Native compatibility)\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@ajna-inc/payments'))\n } catch {\n /* optional dependency */\n }\n }\n if (!createPaymentsV1Actions) {\n try {\n ;({ createPaymentsV1Actions } = require('@ajna-inc/payments/workflow/PaymentsV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n if (createPaymentsV1Actions) {\n const actions = createPaymentsV1Actions()\n try {\n // Prefer explicit API if available\n const svcAny = service as unknown as {\n registerActions?: (actions: unknown[]) => void\n actions?: { register: (h: unknown) => void }\n }\n if (typeof svcAny.registerActions === 'function') {\n svcAny.registerActions(actions)\n } else if (svcAny.actions && typeof svcAny.actions.register === 'function') {\n for (const a of actions) svcAny.actions.register(a)\n } else {\n throw new Error('no action registry available')\n }\n logger.info('WorkflowModule - registered PaymentsV1 actions')\n } catch (_e) {\n // swallow\n }\n }\n } catch {\n /* optional dependency */\n }\n\n // Optional: map payments events → workflow events (guarded if payments not installed)\n if (this.config.enablePaymentsEventMapping)\n try {\n type PaymentEvtKeys =\n | 'IntroResponded'\n | 'HandshakeAccepted'\n | 'ComplianceRequired'\n | 'ComplianceSatisfied'\n | 'ComplianceRejected'\n | 'SettlementUpdated'\n let PaymentsEventTypes: Partial<Record<PaymentEvtKeys, string>> | undefined\n try {\n ;({ PaymentsEventTypes } = require('@credo-ts/payments'))\n } catch {\n /* optional dependency */\n }\n if (!PaymentsEventTypes) {\n try {\n ;({ PaymentsEventTypes } = require('@credo-ts/payments/events/PaymentEvents'))\n } catch {\n /* optional dependency */\n }\n }\n if (!PaymentsEventTypes) {\n try {\n ;({ PaymentsEventTypes } = require('@credo-ts/payments/events/PaymentEvents'))\n } catch {\n /* optional dependency */\n }\n }\n if (!PaymentsEventTypes) throw new Error('payments not available')\n\n const adv = async (threadId: string, event: string, metadata?: EventMetadata) => {\n const scoped = await resolveEventContext(metadata)\n if (!scoped) return\n try {\n await service.advance(scoped.context, {\n instance_id: threadId,\n event,\n idempotency_key: `auto:payments:${event}:${threadId}`,\n })\n } catch (e) {\n logger.debug(`[Workflow] payments event advance error: ${(e as Error).message}`)\n } finally {\n await scoped.release()\n }\n }\n type PaymentListener = (e: {\n payload?: { threadId?: string; status?: string }\n metadata?: EventMetadata\n }) => void\n const on = (evt: string, cb: PaymentListener) =>\n (events as unknown as { on?: (evt: string, cb: PaymentListener) => void }).on?.(evt, cb)\n if (PaymentsEventTypes.IntroResponded)\n on(PaymentsEventTypes.IntroResponded, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.methods_received', e?.metadata)\n })\n if (PaymentsEventTypes.HandshakeAccepted)\n on(PaymentsEventTypes.HandshakeAccepted, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.handshake_accepted', e?.metadata)\n })\n if (PaymentsEventTypes.ComplianceRequired)\n on(PaymentsEventTypes.ComplianceRequired, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.compliance_required', e?.metadata)\n })\n if (PaymentsEventTypes.ComplianceSatisfied)\n on(PaymentsEventTypes.ComplianceSatisfied, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.compliance_satisfied', e?.metadata)\n })\n if (PaymentsEventTypes.ComplianceRejected)\n on(PaymentsEventTypes.ComplianceRejected, async (e) => {\n const th = e?.payload?.threadId\n if (th) await adv(th, 'payments.compliance_rejected', e?.metadata)\n })\n if (PaymentsEventTypes.SettlementUpdated)\n on(PaymentsEventTypes.SettlementUpdated, async (e) => {\n const p = e?.payload\n const th = p?.threadId\n const status = p?.status\n if (!status) return\n const map: Record<string, string> = {\n received: 'payments.receipt_received',\n pending: 'payments.settlement_pending',\n settled: 'payments.settled',\n failed: 'payments.failed',\n }\n const ev = map[status]\n if (ev && th) await adv(th, ev, e?.metadata)\n })\n logger.info('WorkflowModule - registered Payments event listeners')\n } catch {\n /* optional dependency */\n }\n\n // Optional: register POE v1 actions when POE module is available\n try {\n let createPoeV1Actions:\n | undefined\n | (() => Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>)\n try {\n ;({ createPoeV1Actions } = require('@ajna-inc/poe'))\n } catch {\n /* optional dependency */\n }\n if (!createPoeV1Actions) {\n try {\n ;({ createPoeV1Actions } = require('@ajna-inc/poe/workflow/PoeV1Actions'))\n } catch {\n /* optional dependency */\n }\n }\n if (createPoeV1Actions) {\n const actions = createPoeV1Actions()\n try {\n const svcAny = service as unknown as {\n registerActions?: (actions: unknown[]) => void\n actions?: { register: (h: unknown) => void }\n }\n if (typeof svcAny.registerActions === 'function') {\n svcAny.registerActions(actions)\n } else if (svcAny.actions && typeof svcAny.actions.register === 'function') {\n for (const a of actions) svcAny.actions.register(a)\n } else {\n throw new Error('no action registry available')\n }\n logger.info('WorkflowModule - registered PoeV1 actions')\n } catch (_e) {\n // swallow\n }\n }\n } catch {\n /* optional dependency */\n }\n\n // Optional: map POE events → workflow events (guarded if POE not installed)\n if (this.config.enablePoeEventMapping)\n try {\n type PoeEvtKeys = 'PoeStateChanged'\n let PoeEventTypes: Partial<Record<PoeEvtKeys, string>> | undefined\n let PoeState: { [key: string]: string } | undefined\n try {\n ;({ PoeEventTypes, PoeState } = require('@ajna-inc/poe'))\n } catch {\n /* optional dependency */\n }\n if (!PoeEventTypes || !PoeState) throw new Error('poe not available')\n\n type PoeListener = (e: {\n payload?: {\n poeRecord?: {\n id?: string\n connectionId?: string\n sessionId?: string\n state?: string\n programId?: string\n verificationResult?: { verified?: boolean; errors?: string[] }\n finalProof?: { result?: unknown }\n }\n previousState?: string\n }\n metadata?: EventMetadata\n }) => void\n const on = (evt: string, cb: PoeListener) =>\n (events as unknown as { on?: (evt: string, cb: PoeListener) => void }).on?.(evt, cb)\n\n if (PoeEventTypes.PoeStateChanged)\n on(PoeEventTypes.PoeStateChanged, async (e) => {\n const poeRecord = e?.payload?.poeRecord\n const connectionId = poeRecord?.connectionId\n if (!connectionId) return\n\n const scoped = await resolveEventContext(e?.metadata)\n if (!scoped) return\n try {\n let workflowEvent: string | undefined\n\n switch (poeRecord.state) {\n case PoeState?.RequestReceived:\n workflowEvent = 'poe.request_received'\n break\n case PoeState?.SubmitReceived:\n workflowEvent = poeRecord.verificationResult?.verified\n ? 'poe.verified'\n : 'poe.verification_failed'\n break\n case PoeState?.ProposalReceived:\n workflowEvent = 'poe.proposal_received'\n break\n case PoeState?.Accepted:\n workflowEvent = 'poe.accepted'\n break\n case PoeState?.Declined:\n workflowEvent = 'poe.declined'\n break\n case PoeState?.Complete:\n workflowEvent = 'poe.completed'\n break\n case PoeState?.Problem:\n workflowEvent = 'poe.problem'\n break\n case PoeState?.ChallengeReceived:\n workflowEvent = 'poe.challenge_received'\n break\n }\n\n if (workflowEvent) {\n await service.autoAdvanceByConnection(\n scoped.context,\n connectionId,\n workflowEvent\n )\n }\n } catch (err) {\n logger.debug(`[Workflow] POE event advance error: ${(err as Error).message}`)\n } finally {\n await scoped.release()\n }\n })\n logger.info('WorkflowModule - registered POE event listeners')\n } catch {\n /* optional dependency */\n }\n\n // Initialize persistent command queue (always enabled, no Redis needed)\n logger.info('WorkflowModule - initializing persistent command queue')\n const commandRepo = dm.resolve(WorkflowCommandRepository)\n const queue = new PersistentCommandQueue(commandRepo, contextProvider, agentContext, {\n pollIntervalMs: this.config.asyncQueue?.pollIntervalMs,\n concurrency: this.config.asyncQueue?.concurrency,\n processingTimeoutMs: this.config.asyncQueue?.processingTimeoutMs,\n staleCheckIntervalMs: this.config.asyncQueue?.staleCheckIntervalMs,\n cleanupIntervalMs: this.config.asyncQueue?.cleanupIntervalMs,\n commandRetentionMs: this.config.asyncQueue?.commandRetentionMs,\n failedRetentionMs: this.config.asyncQueue?.failedRetentionMs,\n maxAttempts: this.config.asyncQueue?.maxAttempts,\n })\n\n // Test-time helper: register queue instance globally for best-effort shutdown in afterAll\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const g: any = globalThis as unknown\n g.__WF_QUEUES = g.__WF_QUEUES || new Set()\n g.__WF_QUEUES.add(queue)\n } catch {\n /* noop */\n }\n\n // In tests or minimal environments, dependencyManager may not expose registerInstance\n try {\n const anyDm = dm as unknown as { registerInstance?: (ctor: unknown, instance: unknown) => void }\n anyDm.registerInstance?.(CommandQueueService, queue)\n } catch {\n // no-op if DI container doesn't support instance registration in this context\n }\n\n // Start worker: processes commands and sends follow-up status messages\n await queue.startWorker(async (job) => {\n // Context resolution handled inside PersistentCommandQueue\n // Worker receives job with already-resolved context\n\n // This worker callback is called from PersistentCommandQueue.processCommand\n // which already resolves the context, so we need to get it here\n const metadata: EventMetadata = { contextCorrelationId: job.contextCorrelationId }\n const scoped = await (async () => {\n const correlationId = metadata.contextCorrelationId\n if (!correlationId || correlationId === rootContextId) {\n return { context: agentContext, release: async () => {} }\n }\n try {\n const scopedContext = await contextProvider.getAgentContextForContextCorrelationId(correlationId)\n return {\n context: scopedContext,\n release: async () => {\n try {\n await contextProvider.endSessionForAgentContext(scopedContext)\n } catch (error) {\n logger.debug('WorkflowModule - failed to end tenant session after queue job', {\n contextCorrelationId: correlationId,\n error: (error as Error).message,\n })\n }\n },\n }\n } catch (error) {\n logger.debug('WorkflowModule - unable to resolve context for queue job', {\n error: (error as Error).message,\n })\n return null\n }\n })()\n if (!scoped) return\n try {\n const ctx = scoped.context\n try {\n logger.info('[WorkflowWorker] handling job', {\n cmd: (job as { cmd?: string }).cmd,\n thid: (job as { thid?: string }).thid,\n connectionId: (job as { connectionId?: string }).connectionId,\n contextCorrelationId: (job as { contextCorrelationId?: string }).contextCorrelationId,\n })\n } catch {}\n switch (job.cmd) {\n case 'start': {\n // Ensure template exists before starting. If missing, attempt auto-discover and defer.\n try {\n const templateRepo = dm.resolve(WorkflowTemplateRepository)\n const p = (job.payload || {}) as unknown as {\n template_id?: string\n template_version?: string\n template_hash?: string\n allow_discover?: boolean\n }\n const templateRec = p.template_id\n ? await templateRepo.findByTemplateIdAndVersion(ctx, p.template_id, p.template_version)\n : null\n if (!templateRec) {\n const allowDiscover = p.allow_discover ?? true\n if (allowDiscover && this.config.enableAutoDiscoverOnStart && job.connectionId) {\n try {\n const sender = dm.resolve(DidCommMessageSender)\n const connectionSvc = dm.resolve(DidCommConnectionService)\n const connection = await connectionSvc.getById(ctx, job.connectionId)\n const { FetchTemplateMessage } = require('./protocol/messages/FetchTemplateMessage')\n const fetch = new FetchTemplateMessage({\n thid: job.thid,\n body: {\n template_id: p.template_id,\n template_version: p.template_version,\n prefer_hash: p.template_hash,\n },\n })\n try {\n fetch.setReturnRouting(ReturnRouteTypes.thread, job.thid)\n } catch {}\n const outbound = new DidCommOutboundMessageContext(fetch, { agentContext: ctx, connection })\n await sender.sendMessage(outbound)\n try {\n logger.info('[WorkflowWorker] fetch-template sent from worker', {\n thid: job.thid,\n template_id: p.template_id,\n template_version: p.template_version,\n })\n } catch {}\n } catch (e) {\n logger.debug('WorkflowModule - fetch-template send failed in worker', {\n error: (e as Error).message,\n })\n }\n }\n // Defer start by signaling invalid_template so queue will retry later\n const err = new Error('template not found for start') as Error & { code?: string }\n err.code = 'invalid_template'\n throw err\n }\n } catch (precheckErr) {\n // Rethrow to queue-level handler for unified deferral behavior\n throw precheckErr\n }\n await service.start(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] start completed', { thid: job.thid }) } catch {}\n break\n }\n case 'advance':\n await service.advance(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] advance completed', { thid: job.thid }) } catch {}\n break\n case 'pause':\n await service.pause(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] pause completed', { thid: job.thid }) } catch {}\n break\n case 'resume':\n await service.resume(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] resume completed', { thid: job.thid }) } catch {}\n break\n case 'cancel':\n await service.cancel(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] cancel completed', { thid: job.thid }) } catch {}\n break\n case 'complete':\n await service.complete(ctx, job.payload as never)\n try { logger.info('[WorkflowWorker] complete completed', { thid: job.thid }) } catch {}\n break\n }\n\n // Note: Per Workflow 1.0 spec §11.6 and §3.4, status is provided on-demand (pull-based).\n // The spec defines status as a request/response pattern where Coordinators explicitly\n // request status via StatusRequestMessage, and Processors respond with StatusMessage.\n //\n // Unsolicited push notifications are not part of the base protocol and cause issues:\n // - Tenant context mismatches in multi-tenant deployments\n // - Receivers interpret unsolicited StatusMessage as a request (same @type)\n // - HTTP transport timeouts (fire-and-forget over request/response transport)\n //\n // For real-time UI updates, use the existing WebSocket event system which emits\n // WorkflowInstanceStateChanged events to connected clients.\n } finally {\n await scoped.release()\n }\n })\n }\n}\n"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ declare class AdvanceHandler implements DidCommMessageHandler {
|
|
|
9
9
|
private readonly service;
|
|
10
10
|
supportedMessages: (typeof AdvanceMessage)[];
|
|
11
11
|
constructor(service: WorkflowService);
|
|
12
|
-
handle(messageContext: DidCommMessageHandlerInboundMessage<AdvanceHandler>): Promise<DidCommOutboundMessageContext<
|
|
12
|
+
handle(messageContext: DidCommMessageHandlerInboundMessage<AdvanceHandler>): Promise<DidCommOutboundMessageContext<StatusMessage> | DidCommOutboundMessageContext<ProblemReportMessage>>;
|
|
13
13
|
}
|
|
14
14
|
//#endregion
|
|
15
15
|
export { AdvanceHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdvanceHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/AdvanceHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,cAAA,YAA0B;EAA1B,iBAAe,OAAA;EACF,iBAAA,EAAA,CAAA,OAAA,cAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,cAAA,CAAA,CAAA,EAAe,OAAf,CAAe,6BAAf,CAAe,
|
|
1
|
+
{"version":3,"file":"AdvanceHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/AdvanceHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,cAAA,YAA0B;EAA1B,iBAAe,OAAA;EACF,iBAAA,EAAA,CAAA,OAAA,cAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,cAAA,CAAA,CAAA,EAAe,OAAf,CAAe,6BAAf,CAAe,aAAf,CAAA,GAAe,6BAAf,CAAe,oBAAf,CAAA,CAAA"}
|
|
@@ -9,7 +9,7 @@ declare class CancelHandler implements DidCommMessageHandler {
|
|
|
9
9
|
private readonly service;
|
|
10
10
|
supportedMessages: (typeof CancelMessage)[];
|
|
11
11
|
constructor(service: WorkflowService);
|
|
12
|
-
handle(messageContext: DidCommMessageHandlerInboundMessage<CancelHandler>): Promise<DidCommOutboundMessageContext<
|
|
12
|
+
handle(messageContext: DidCommMessageHandlerInboundMessage<CancelHandler>): Promise<DidCommOutboundMessageContext<StatusMessage> | DidCommOutboundMessageContext<ProblemReportMessage> | undefined>;
|
|
13
13
|
}
|
|
14
14
|
//#endregion
|
|
15
15
|
export { CancelHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CancelHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/CancelHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,aAAA,YAAyB;EAAzB,iBAAc,OAAA;EACD,iBAAA,EAAA,CAAA,OAAA,aAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,aAAA,CAAA,CAAA,EAAc,OAAd,CAAc,6BAAd,CAAc,
|
|
1
|
+
{"version":3,"file":"CancelHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/CancelHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,aAAA,YAAyB;EAAzB,iBAAc,OAAA;EACD,iBAAA,EAAA,CAAA,OAAA,aAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,aAAA,CAAA,CAAA,EAAc,OAAd,CAAc,6BAAd,CAAc,aAAd,CAAA,GAAc,6BAAd,CAAc,oBAAd,CAAA,GAAA,SAAA,CAAA"}
|
|
@@ -9,7 +9,7 @@ declare class CompleteHandler implements DidCommMessageHandler {
|
|
|
9
9
|
private readonly service;
|
|
10
10
|
supportedMessages: (typeof CompleteMessage)[];
|
|
11
11
|
constructor(service: WorkflowService);
|
|
12
|
-
handle(messageContext: DidCommMessageHandlerInboundMessage<CompleteHandler>): Promise<DidCommOutboundMessageContext<
|
|
12
|
+
handle(messageContext: DidCommMessageHandlerInboundMessage<CompleteHandler>): Promise<DidCommOutboundMessageContext<StatusMessage> | DidCommOutboundMessageContext<ProblemReportMessage> | undefined>;
|
|
13
13
|
}
|
|
14
14
|
//#endregion
|
|
15
15
|
export { CompleteHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompleteHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/CompleteHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,eAAA,YAA2B;EAA3B,iBAAA,OAAgB;EACH,iBAAA,EAAA,CAAA,OAAA,eAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,eAAA,CAAA,CAAA,EAAgB,OAAhB,CAAgB,6BAAhB,CAAgB,
|
|
1
|
+
{"version":3,"file":"CompleteHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/CompleteHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,eAAA,YAA2B;EAA3B,iBAAA,OAAgB;EACH,iBAAA,EAAA,CAAA,OAAA,eAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,eAAA,CAAA,CAAA,EAAgB,OAAhB,CAAgB,6BAAhB,CAAgB,aAAhB,CAAA,GAAgB,6BAAhB,CAAgB,oBAAhB,CAAA,GAAA,SAAA,CAAA"}
|
|
@@ -9,7 +9,7 @@ declare class PauseHandler implements DidCommMessageHandler {
|
|
|
9
9
|
private readonly service;
|
|
10
10
|
supportedMessages: (typeof PauseMessage)[];
|
|
11
11
|
constructor(service: WorkflowService);
|
|
12
|
-
handle(messageContext: DidCommMessageHandlerInboundMessage<PauseHandler>): Promise<DidCommOutboundMessageContext<
|
|
12
|
+
handle(messageContext: DidCommMessageHandlerInboundMessage<PauseHandler>): Promise<DidCommOutboundMessageContext<StatusMessage> | DidCommOutboundMessageContext<ProblemReportMessage> | undefined>;
|
|
13
13
|
}
|
|
14
14
|
//#endregion
|
|
15
15
|
export { PauseHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PauseHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/PauseHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,YAAA,YAAwB;EAAxB,iBAAa,OAAA;EACA,iBAAA,EAAA,CAAA,OAAA,YAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,YAAA,CAAA,CAAA,EAAa,OAAb,CAAa,6BAAb,CAAa,
|
|
1
|
+
{"version":3,"file":"PauseHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/PauseHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,YAAA,YAAwB;EAAxB,iBAAa,OAAA;EACA,iBAAA,EAAA,CAAA,OAAA,YAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,YAAA,CAAA,CAAA,EAAa,OAAb,CAAa,6BAAb,CAAa,aAAb,CAAA,GAAa,6BAAb,CAAa,oBAAb,CAAA,GAAA,SAAA,CAAA"}
|
|
@@ -9,7 +9,7 @@ declare class ResumeHandler implements DidCommMessageHandler {
|
|
|
9
9
|
private readonly service;
|
|
10
10
|
supportedMessages: (typeof ResumeMessage)[];
|
|
11
11
|
constructor(service: WorkflowService);
|
|
12
|
-
handle(messageContext: DidCommMessageHandlerInboundMessage<ResumeHandler>): Promise<DidCommOutboundMessageContext<
|
|
12
|
+
handle(messageContext: DidCommMessageHandlerInboundMessage<ResumeHandler>): Promise<DidCommOutboundMessageContext<StatusMessage> | DidCommOutboundMessageContext<ProblemReportMessage> | undefined>;
|
|
13
13
|
}
|
|
14
14
|
//#endregion
|
|
15
15
|
export { ResumeHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResumeHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/ResumeHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,aAAA,YAAyB;EAAzB,iBAAc,OAAA;EACD,iBAAA,EAAA,CAAA,OAAA,aAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,aAAA,CAAA,CAAA,EAAc,OAAd,CAAc,6BAAd,CAAc,
|
|
1
|
+
{"version":3,"file":"ResumeHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/ResumeHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,aAAA,YAAyB;EAAzB,iBAAc,OAAA;EACD,iBAAA,EAAA,CAAA,OAAA,aAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,aAAA,CAAA,CAAA,EAAc,OAAd,CAAc,6BAAd,CAAc,aAAd,CAAA,GAAc,6BAAd,CAAc,oBAAd,CAAA,GAAA,SAAA,CAAA"}
|
|
@@ -9,7 +9,7 @@ declare class StartHandler implements DidCommMessageHandler {
|
|
|
9
9
|
private readonly service;
|
|
10
10
|
supportedMessages: (typeof StartMessage)[];
|
|
11
11
|
constructor(service: WorkflowService);
|
|
12
|
-
handle(messageContext: DidCommMessageHandlerInboundMessage<StartHandler>): Promise<DidCommOutboundMessageContext<
|
|
12
|
+
handle(messageContext: DidCommMessageHandlerInboundMessage<StartHandler>): Promise<DidCommOutboundMessageContext<StatusMessage> | DidCommOutboundMessageContext<ProblemReportMessage>>;
|
|
13
13
|
}
|
|
14
14
|
//#endregion
|
|
15
15
|
export { StartHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/StartHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAkBa,YAAA,YAAwB;EAAxB,iBAAa,OAAA;EACA,iBAAA,EAAA,CAAA,OAAA,YAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,YAAA,CAAA,CAAA,EAAa,OAAb,CAAa,6BAAb,CAAa,
|
|
1
|
+
{"version":3,"file":"StartHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/StartHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAkBa,YAAA,YAAwB;EAAxB,iBAAa,OAAA;EACA,iBAAA,EAAA,CAAA,OAAA,YAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,YAAA,CAAA,CAAA,EAAa,OAAb,CAAa,6BAAb,CAAa,aAAb,CAAA,GAAa,6BAAb,CAAa,oBAAb,CAAA,CAAA"}
|
|
@@ -9,7 +9,7 @@ declare class StatusHandler implements DidCommMessageHandler {
|
|
|
9
9
|
private readonly service;
|
|
10
10
|
supportedMessages: (typeof StatusRequestMessage)[];
|
|
11
11
|
constructor(service: WorkflowService);
|
|
12
|
-
handle(messageContext: DidCommMessageHandlerInboundMessage<StatusHandler>): Promise<DidCommOutboundMessageContext<
|
|
12
|
+
handle(messageContext: DidCommMessageHandlerInboundMessage<StatusHandler>): Promise<DidCommOutboundMessageContext<StatusMessage> | DidCommOutboundMessageContext<ProblemReportMessage> | undefined>;
|
|
13
13
|
}
|
|
14
14
|
//#endregion
|
|
15
15
|
export { StatusHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/StatusHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,aAAA,YAAyB;EAAzB,iBAAc,OAAA;EACD,iBAAA,EAAA,CAAA,OAAA,oBAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,aAAA,CAAA,CAAA,EAAc,OAAd,CAAc,6BAAd,CAAc,
|
|
1
|
+
{"version":3,"file":"StatusHandler.d.mts","names":[],"sources":["../../../src/protocol/handlers/StatusHandler.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,aAAA,YAAyB;EAAzB,iBAAc,OAAA;EACD,iBAAA,EAAA,CAAA,OAAA,oBAAA,CAAA,EAAA;EACqB,WAAA,CAAA,OAAA,EAAA,eAAA;EAC2B,MAAA,CAAA,cAAA,EAApC,mCAAoC,CAAA,aAAA,CAAA,CAAA,EAAc,OAAd,CAAc,6BAAd,CAAc,aAAd,CAAA,GAAc,6BAAd,CAAc,oBAAd,CAAA,GAAA,SAAA,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _credo_ts_didcomm0 from "@credo-ts/didcomm";
|
|
2
2
|
import { DidCommMessage } from "@credo-ts/didcomm";
|
|
3
3
|
|
|
4
4
|
//#region src/protocol/messages/AdvanceMessage.d.ts
|
|
5
5
|
declare class AdvanceMessage extends DidCommMessage {
|
|
6
|
-
static readonly type:
|
|
6
|
+
static readonly type: _credo_ts_didcomm0.ParsedMessageType;
|
|
7
7
|
type: string;
|
|
8
8
|
body: {
|
|
9
9
|
instance_id: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _credo_ts_didcomm8 from "@credo-ts/didcomm";
|
|
2
2
|
import { DidCommMessage } from "@credo-ts/didcomm";
|
|
3
3
|
|
|
4
4
|
//#region src/protocol/messages/CompleteMessage.d.ts
|
|
5
5
|
declare class CompleteMessage extends DidCommMessage {
|
|
6
|
-
static readonly type:
|
|
6
|
+
static readonly type: _credo_ts_didcomm8.ParsedMessageType;
|
|
7
7
|
type: string;
|
|
8
8
|
body: {
|
|
9
9
|
instance_id: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _credo_ts_didcomm9 from "@credo-ts/didcomm";
|
|
2
2
|
import { DidCommMessage } from "@credo-ts/didcomm";
|
|
3
3
|
|
|
4
4
|
//#region src/protocol/messages/DiscoverMessage.d.ts
|
|
5
5
|
declare class DiscoverMessage extends DidCommMessage {
|
|
6
|
-
static readonly type:
|
|
6
|
+
static readonly type: _credo_ts_didcomm9.ParsedMessageType;
|
|
7
7
|
type: string;
|
|
8
8
|
body: {
|
|
9
9
|
filters?: {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _credo_ts_didcomm12 from "@credo-ts/didcomm";
|
|
2
2
|
import { DidCommMessage } from "@credo-ts/didcomm";
|
|
3
3
|
|
|
4
4
|
//#region src/protocol/messages/FetchTemplateMessage.d.ts
|
|
5
5
|
declare class FetchTemplateMessage extends DidCommMessage {
|
|
6
|
-
static readonly type:
|
|
6
|
+
static readonly type: _credo_ts_didcomm12.ParsedMessageType;
|
|
7
7
|
type: string;
|
|
8
8
|
body: {
|
|
9
9
|
template_id: string;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Participants } from "../../model/types.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as _credo_ts_didcomm1 from "@credo-ts/didcomm";
|
|
3
3
|
import { DidCommMessage } from "@credo-ts/didcomm";
|
|
4
4
|
|
|
5
5
|
//#region src/protocol/messages/StartMessage.d.ts
|
|
6
6
|
declare class StartMessage extends DidCommMessage {
|
|
7
|
-
static readonly type:
|
|
7
|
+
static readonly type: _credo_ts_didcomm1.ParsedMessageType;
|
|
8
8
|
type: string;
|
|
9
9
|
body: {
|
|
10
10
|
template_id: string;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { WorkflowTemplate } from "../../model/types.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as _credo_ts_didcomm11 from "@credo-ts/didcomm";
|
|
3
3
|
import { DidCommMessage } from "@credo-ts/didcomm";
|
|
4
4
|
|
|
5
5
|
//#region src/protocol/messages/TemplateMessage.d.ts
|
|
6
6
|
declare class TemplateMessage extends DidCommMessage {
|
|
7
|
-
static readonly type:
|
|
7
|
+
static readonly type: _credo_ts_didcomm11.ParsedMessageType;
|
|
8
8
|
type: string;
|
|
9
9
|
body: {
|
|
10
10
|
template: WorkflowTemplate;
|
|
@@ -458,15 +458,20 @@ let WorkflowService = class WorkflowService$1 {
|
|
|
458
458
|
}
|
|
459
459
|
async autoAdvanceByConnection(agentContext, connectionId, event) {
|
|
460
460
|
const inst = await this.instanceRepo.findLatestByConnection(agentContext, connectionId);
|
|
461
|
-
if (!inst)
|
|
461
|
+
if (!inst) {
|
|
462
|
+
this.agentConfig.logger.warn(`[autoAdvance] No workflow instance found for connection ${connectionId}, event=${event}`);
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
this.agentConfig.logger.info(`[autoAdvance] Advancing workflow ${inst.instanceId} with event=${event} (connection=${connectionId})`);
|
|
462
466
|
try {
|
|
463
467
|
await this.advance(agentContext, {
|
|
464
468
|
instance_id: inst.instanceId,
|
|
465
469
|
event,
|
|
466
470
|
idempotency_key: `auto:${event}:${inst.instanceId}`
|
|
467
471
|
});
|
|
472
|
+
this.agentConfig.logger.info(`[autoAdvance] Successfully advanced workflow ${inst.instanceId} with event=${event}`);
|
|
468
473
|
} catch (e) {
|
|
469
|
-
this.agentConfig.logger.
|
|
474
|
+
this.agentConfig.logger.warn(`[autoAdvance] Failed to advance workflow ${inst.instanceId} with event=${event}: ${e.message}`);
|
|
470
475
|
}
|
|
471
476
|
}
|
|
472
477
|
evalMultiplicity(expr, context) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowService.mjs","names":["allKeys: string[]","WorkflowService","templateRepo: WorkflowTemplateRepository","instanceRepo: WorkflowInstanceRepository","config: WorkflowModuleConfig","agentConfig: AgentConfig","eventEmitter?: EventEmitter","multiplicityKeyValue: string | undefined","participants: Participants","inst: WorkflowInstanceRecord","t","artifactsDelta: Record<string, unknown>","messageId: string | undefined","result: {\n artifacts?: Record<string, unknown>\n contextMerge?: Record<string, unknown>\n messageId?: string\n }","derivedProfile: string | undefined","myDid: string | undefined","connection: { id?: string; myDid?: string; theirDid?: string } | undefined"],"sources":["../../src/services/WorkflowService.ts"],"sourcesContent":["import type { Participants, WorkflowInstanceData, WorkflowTemplate, UiItem } from '../model/types'\n\nimport { AgentConfig, AgentContext, EventEmitter, Hasher, TypedArrayEncoder, injectable } from '@credo-ts/core'\n\nimport { DidCommConnectionService, DidCommMessageSender, DidCommOutboundMessageContext, ReturnRouteTypes } from '@credo-ts/didcomm'\n\nimport { WorkflowEventTypes } from '../WorkflowEvents'\nimport { WorkflowModuleConfig } from '../WorkflowModuleConfig'\nimport {\n ActionRegistry,\n IssueCredentialV2Action,\n IssueCredentialMessageV2Action,\n LocalStateSetAction,\n PresentProofV2Action,\n ProposeCredentialV2Action,\n RequestCredentialV2Action,\n} from '../actions/ActionRegistry'\nimport { GuardEvaluator } from '../engine/GuardEvaluator'\nimport { validateTemplateJson, validateTemplateRefs } from '../model/TemplateValidation'\nimport { ensureArray, findSectionForState, transitionsFromState } from '../model/types'\nimport { CompleteMessage } from '../protocol/messages/CompleteMessage'\nimport { WorkflowInstanceRecord } from '../repository/WorkflowInstanceRecord'\nimport { WorkflowInstanceRepository } from '../repository/WorkflowInstanceRepository'\nimport { WorkflowTemplateRecord } from '../repository/WorkflowTemplateRecord'\nimport { WorkflowTemplateRepository } from '../repository/WorkflowTemplateRepository'\n\nconst stableStringify = (obj: unknown): string => {\n const allKeys: string[] = []\n JSON.stringify(obj, (k, v) => {\n allKeys.push(k)\n return v\n })\n allKeys.sort()\n return JSON.stringify(obj, allKeys)\n}\n\nconst sha256 = (input: string): string => {\n const hash = Hasher.hash(TypedArrayEncoder.fromString(input), 'sha-256')\n return TypedArrayEncoder.toHex(hash)\n}\n\n@injectable()\nexport class WorkflowService {\n private readonly actions: ActionRegistry\n\n public constructor(\n private readonly templateRepo: WorkflowTemplateRepository,\n private readonly instanceRepo: WorkflowInstanceRepository,\n private readonly config: WorkflowModuleConfig,\n private readonly agentConfig: AgentConfig,\n private readonly eventEmitter?: EventEmitter\n ) {\n this.actions = new ActionRegistry()\n this.actions.register(new LocalStateSetAction())\n // Register DIDComm action handlers used by workflows\n // Credential issuance flow handlers\n this.actions.register(new ProposeCredentialV2Action()) // Holder proposes credential\n this.actions.register(new IssueCredentialV2Action()) // Issuer sends offer\n this.actions.register(new RequestCredentialV2Action()) // Holder accepts offer\n this.actions.register(new IssueCredentialMessageV2Action()) // Issuer issues credential\n // Proof presentation handler\n this.actions.register(new PresentProofV2Action())\n }\n\n // Allow external modules (e.g., payments) to register additional action handlers\n public registerActions(actions: Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>) {\n for (const a of actions) {\n // ActionRegistry expects objects with shape { typeUri, execute }\n // We don't import the exact type here to avoid cross-package coupling\n this.actions.register(a as unknown as never)\n }\n }\n\n public async publishTemplate(\n agentContext: AgentContext,\n template: WorkflowTemplate\n ): Promise<WorkflowTemplateRecord> {\n // JSON schema validation + structural checks\n validateTemplateJson(template)\n validateTemplateRefs(template)\n const hash = sha256(stableStringify(template))\n const existing = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n template.template_id,\n template.version\n )\n if (existing) {\n existing.template = template\n existing.hash = hash\n await this.templateRepo.update(agentContext, existing)\n return existing\n }\n const record = new WorkflowTemplateRecord({ template, hash })\n await this.templateRepo.save(agentContext, record)\n return record\n }\n\n public async start(\n agentContext: AgentContext,\n opts: {\n template_id: string\n template_version?: string\n instance_id?: string\n connection_id?: string\n participants?: Participants\n context?: Record<string, unknown>\n }\n ): Promise<WorkflowInstanceRecord> {\n // Idempotency by instance_id: if an instance with the same instance_id already exists, return it\n if (opts.instance_id) {\n try {\n const existingByInstance = await this.instanceRepo.getByInstanceId(agentContext, opts.instance_id)\n if (existingByInstance) return existingByInstance\n } catch {\n /* not found */\n }\n }\n\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n opts.template_id,\n opts.template_version\n )\n if (!tplRec)\n throw this.problem(\n 'invalid_template',\n `template not found: ${opts.template_id}@${opts.template_version || 'latest'}`\n )\n const tpl = tplRec.template\n const startState = tpl.states.find((s) => s.type === 'start')?.name || tpl.states[0]?.name\n if (!startState) throw this.problem('invalid_template', 'no start state')\n\n const policy = tpl.instance_policy\n const connectionId = opts.connection_id\n if (policy.mode === 'singleton_per_connection') {\n const existing = ensureArray(\n await this.instanceRepo.findByTemplateAndConnection(agentContext, tpl.template_id, connectionId)\n ).shift()\n if (existing) {\n if (this.config.autoReturnExistingOnSingleton) return existing\n throw this.problem('already_exists', 'instance already exists for template/connection')\n }\n }\n\n let multiplicityKeyValue: string | undefined\n if (policy.mode === 'multi_per_connection' && policy.multiplicity_key) {\n multiplicityKeyValue = this.evalMultiplicity(policy.multiplicity_key, opts.context || {})\n const dup = ensureArray(\n await this.instanceRepo.findByTemplateConnAndMultiplicity(\n agentContext,\n tpl.template_id,\n connectionId,\n multiplicityKeyValue\n )\n ).shift()\n if (dup) return dup\n }\n\n // Derive participants from connection when not provided\n let participants: Participants = (opts.participants as Participants) || ({} as Participants)\n try {\n if (connectionId) {\n const connSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const conn = await connSvc.getById(agentContext, connectionId)\n const theirDid = (conn as any)?.theirDid as string | undefined\n const myDid = ((conn as any)?.did as string | undefined) || ((conn as any)?.myDid as string | undefined)\n if (theirDid) {\n const holder = (participants as any).holder || {}\n if (!holder.did) holder.did = theirDid\n ;(participants as any).holder = holder\n }\n if (myDid) {\n const issuer = (participants as any).issuer || {}\n if (!issuer.did) issuer.did = myDid\n ;(participants as any).issuer = issuer\n }\n }\n } catch {\n // best effort only\n }\n\n const instanceId = opts.instance_id || this.uuid()\n const section = findSectionForState(tpl, startState)\n const rec = new WorkflowInstanceRecord({\n instanceId,\n templateId: tpl.template_id,\n templateVersion: tpl.version,\n connectionId,\n participants,\n state: startState,\n section,\n context: { ...(opts.context || {}) },\n artifacts: {},\n status: 'active',\n history: [],\n multiplicityKeyValue,\n idempotencyKeys: [],\n })\n await this.instanceRepo.save(agentContext, rec)\n // Emit state changed event for initial creation\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStateChanged,\n payload: {\n instanceRecord: rec,\n previousState: null,\n newState: rec.state,\n event: 'start',\n actionKey: undefined,\n msgId: undefined,\n },\n })\n } catch (_e) {\n void 0\n }\n return rec\n }\n\n public async advance(\n agentContext: AgentContext,\n opts: {\n instance_id: string\n event: string\n idempotency_key?: string\n input?: Record<string, unknown>\n },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n let inst: WorkflowInstanceRecord\n if (instanceRecord) {\n inst = instanceRecord\n } else {\n try {\n inst = await this.instanceRepo.getById(agentContext, opts.instance_id)\n } catch {\n const found = await this.instanceRepo.getByInstanceId(agentContext, opts.instance_id)\n if (!found) throw this.problem('invalid_event', 'instance not found')\n inst = found\n }\n }\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n inst.templateId,\n inst.templateVersion\n )\n if (!tplRec) throw this.problem('invalid_template', 'template not found for instance')\n const tpl = tplRec.template\n\n // lifecycle status gating\n if (inst.status === 'paused') throw this.problem('forbidden', 'instance is paused')\n if (inst.status === 'canceled') throw this.problem('forbidden', 'instance is canceled')\n if (inst.status === 'completed') throw this.problem('invalid_event', 'instance already completed')\n\n // idempotency\n if (opts.idempotency_key && inst.idempotencyKeys?.includes(opts.idempotency_key)) {\n const prior = inst.idempotency?.find?.((i) => i.key === opts.idempotency_key)\n if (prior && prior.event !== opts.event) throw this.problem('idempotency_conflict', 'same key, different event')\n return inst\n }\n\n const candidates = transitionsFromState(tpl, inst.state).filter((t) => t.on === opts.event)\n if (!candidates.length)\n throw this.problem('invalid_event', `no transition for event ${opts.event} from ${inst.state}`)\n const env = GuardEvaluator.envFromInstance(this.toInstanceData(inst))\n const enabled = candidates.filter((t) => GuardEvaluator.evalGuard(t.guard, env))\n if (!enabled.length) throw this.problem('guard_failed', 'guard evaluated false')\n const t = enabled[0]\n\n let artifactsDelta: Record<string, unknown> = {}\n let messageId: string | undefined\n if (t.action) {\n const def = tpl.actions.find((a) => a.key === t.action)\n if (!def) throw this.problem('invalid_template', `action not defined: ${t.action}`)\n const handler = this.actions.get(def.typeURI)\n if (!handler) throw this.problem('action_error', `no handler for type ${def.typeURI}`)\n const exec = async () =>\n handler.execute({\n agentContext,\n template: tpl,\n instance: this.toInstanceData(inst),\n action: def,\n input: opts.input,\n })\n const timeoutMs = this.config.actionTimeoutMs ?? 15000\n const race = Promise.race([\n exec(),\n new Promise<never>((_, rej) => setTimeout(() => rej(new Error('action timeout')), timeoutMs)),\n ])\n let result: {\n artifacts?: Record<string, unknown>\n contextMerge?: Record<string, unknown>\n messageId?: string\n }\n try {\n result = (await race) as typeof result\n } catch (e) {\n throw Object.assign(new Error((e as Error).message || 'action timeout'), { code: 'action_error' })\n }\n artifactsDelta = result?.artifacts || {}\n // local state:set may be applied directly by handler, but ensure we persist\n if (result?.contextMerge) inst.context = result.contextMerge\n if (result?.messageId) messageId = result.messageId\n }\n\n // Concurrency check: re-read and ensure state didn't change\n const fromState = inst.state\n try {\n const fresh = await this.instanceRepo.getById(agentContext, inst.id)\n if (fresh.state !== fromState) throw this.problem('state_conflict', 'state changed concurrently')\n } catch (_e) {\n // ignore if repository throws\n void 0\n }\n\n // persist atomically (optimistic)\n const prevState = inst.state\n inst.history.push({\n ts: new Date().toISOString(),\n event: opts.event,\n from: inst.state,\n to: t.to,\n actionKey: t.action,\n msg_id: messageId,\n })\n inst.state = t.to\n inst.section = findSectionForState(tpl, t.to)\n inst.artifacts = { ...inst.artifacts, ...artifactsDelta }\n if (opts.idempotency_key) {\n inst.idempotencyKeys = [...(inst.idempotencyKeys || []), opts.idempotency_key]\n inst.idempotency = [\n ...(inst.idempotency || []),\n { key: opts.idempotency_key, event: opts.event, to: t.to, actionKey: t.action },\n ]\n // Trim idempotency history to configured limit\n const limit = Math.max(1, this.config.idempotencyHistoryLimit ?? 100)\n if ((inst.idempotencyKeys?.length || 0) > limit) {\n inst.idempotencyKeys = inst.idempotencyKeys.slice(-limit)\n }\n if ((inst.idempotency?.length || 0) > limit) {\n inst.idempotency = inst.idempotency.slice(-limit)\n }\n }\n let reachedFinal = false\n try {\n const toDef = tpl.states.find((s) => s.name === t.to)\n if (toDef?.type === 'final') {\n inst.status = 'completed'\n reachedFinal = true\n }\n } catch (_e) {\n void 0\n }\n await this.instanceRepo.update(agentContext, inst)\n\n // Emit state-changed event\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStateChanged,\n payload: {\n instanceRecord: inst,\n previousState: prevState,\n newState: inst.state,\n event: opts.event,\n actionKey: t.action,\n msgId: messageId,\n },\n })\n } catch (_e) {\n void 0\n }\n\n // Emit status-changed & completed, and send Complete message if final\n if (reachedFinal) {\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: 'active', newStatus: 'completed' },\n })\n } catch (_e) {\n void 0\n }\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceCompleted,\n payload: { instanceRecord: inst, state: inst.state, section: inst.section },\n })\n } catch (_e) {\n void 0\n }\n await this.sendCompleteMessage(agentContext, inst)\n }\n return inst\n }\n\n public async status(\n agentContext: AgentContext,\n opts: {\n instance_id: string\n include_actions?: boolean\n include_ui?: boolean\n ui_profile?: string\n viewer?: { role?: string; connection_id?: string; did?: string; participantKey?: string }\n capabilities?: string[]\n },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<{\n instance_id: string\n template_id: string\n template_version: string\n connection_id?: string\n connection?: { id?: string; myDid?: string; theirDid?: string }\n participants?: Participants\n context?: Record<string, unknown>\n status?: string\n createdAt?: Date\n updatedAt?: Date\n state: string\n section?: string\n allowed_events: string[]\n action_menu: Array<{ label?: string; event: string }>\n artifacts: Record<string, unknown>\n ui?: UiItem[]\n ui_profile?: string\n assets?: Record<string, { mediaType: string; uri?: string; attachmentId?: string }>\n }> {\n let inst: WorkflowInstanceRecord\n if (instanceRecord) {\n inst = instanceRecord\n } else {\n try {\n inst = await this.instanceRepo.getById(agentContext, opts.instance_id)\n } catch {\n const found = await this.instanceRepo.getByInstanceId(agentContext, opts.instance_id)\n if (!found) throw this.problem('invalid_event', 'instance not found')\n inst = found\n }\n }\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n inst.templateId,\n inst.templateVersion\n )\n if (!tplRec) throw this.problem('invalid_template', 'template not found for instance')\n const tpl = tplRec.template\n const instData = this.toInstanceData(inst)\n const env = GuardEvaluator.envFromInstance(instData)\n const allowed = transitionsFromState(tpl, inst.state)\n .filter((t) => GuardEvaluator.evalGuard(t.guard, env))\n .map((t) => t.on)\n const includeActions = opts.include_actions ?? true\n const includeUi = opts.include_ui ?? true\n\n // Build full env with viewer info for UI filtering\n const uiEnv = {\n context: instData.context || {},\n participants: instData.participants || {},\n artifacts: instData.artifacts || {},\n viewer: opts.viewer,\n }\n\n // Select + filter UI items\n // Defer import to avoid cycle risk\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const Ui = require('../ui/UiFilter') as unknown as {\n selectUi: (h: unknown, s: string, p?: string) => unknown[]\n filterAndBindUi: (items: unknown[], env: unknown, viewer?: unknown, p?: string) => unknown[]\n collectAssets: (\n items: unknown[],\n assets?: Record<string, { mediaType: string; uri?: string; attachmentId?: string }>\n ) => Record<string, { mediaType: string; uri?: string; attachmentId?: string }> | undefined\n }\n // Derive viewer profile from instance participants per spec\n let derivedProfile: string | undefined = opts.ui_profile\n try {\n // 1) If viewer role/participantKey provided, honor it\n const viewerRole = opts.viewer?.role as string | undefined\n const viewerKey = opts.viewer?.participantKey as string | undefined\n const viewerDid = opts.viewer?.did as string | undefined\n const mapKeyToProfile = (k?: string): string | undefined => {\n if (!k) return undefined\n const key = k.toLowerCase()\n if (key === 'sender' || key === 'issuer') return 'sender'\n if (key === 'receiver' || key === 'holder') return 'receiver'\n return undefined\n }\n if (!derivedProfile) derivedProfile = mapKeyToProfile(viewerRole) || mapKeyToProfile(viewerKey)\n\n // 1b) If viewer DID provided, map to participant key by DID equality\n if (!derivedProfile && viewerDid && instData?.participants && typeof instData.participants === 'object') {\n for (const [pKey, pVal] of Object.entries(instData.participants as Record<string, any>)) {\n const did = (pVal as any)?.did as string | undefined\n if (did && did === viewerDid) {\n derivedProfile = mapKeyToProfile(pKey)\n if (derivedProfile) break\n }\n }\n }\n\n // 2) If still not set, try to match current tenant's DID against instance participants\n if (!derivedProfile) {\n // Obtain my DID for the instance's connection, if available\n let myDid: string | undefined\n if (instData?.connection_id) {\n try {\n const connSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const conn = await connSvc.getById(agentContext, instData.connection_id)\n myDid = ((conn as any)?.did as string | undefined) || ((conn as any)?.myDid as string | undefined)\n } catch {}\n }\n if (myDid && instData?.participants && typeof instData.participants === 'object') {\n for (const [pKey, pVal] of Object.entries(instData.participants as Record<string, any>)) {\n const did = (pVal as any)?.did as string | undefined\n if (did && did === myDid) {\n derivedProfile = mapKeyToProfile(pKey)\n if (derivedProfile) break\n }\n }\n }\n }\n } catch {}\n\n const selected = Ui.selectUi((tpl as unknown as { display_hints?: unknown })?.display_hints, inst.state, derivedProfile)\n const filtered = Ui.filterAndBindUi(selected, uiEnv, opts.viewer, derivedProfile) as UiItem[]\n const menu = includeActions\n ? filtered\n .filter((i) => i?.type === 'button' || i?.type === 'submit-button')\n .map((i) => ({ label: i?.label, event: i?.event as string }))\n : []\n const assets = Ui.collectAssets(filtered, (tpl as unknown as { display_hints?: { assets?: unknown } })?.display_hints?.assets as never)\n const ui = includeUi ? filtered : undefined\n let connection: { id?: string; myDid?: string; theirDid?: string } | undefined\n if (inst.connectionId) {\n try {\n const connSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const conn = await connSvc.getById(agentContext, inst.connectionId)\n connection = {\n id: (conn as any)?.id,\n myDid: ((conn as any)?.did as string | undefined) || ((conn as any)?.myDid as string | undefined),\n theirDid: (conn as any)?.theirDid,\n }\n } catch {\n // ignore if not found\n }\n }\n return {\n instance_id: inst.instanceId,\n template_id: inst.templateId,\n template_version: inst.templateVersion,\n connection_id: inst.connectionId,\n connection,\n participants: inst.participants,\n context: inst.context,\n status: inst.status,\n createdAt: inst.createdAt,\n updatedAt: (inst as any)?.updatedAt,\n state: inst.state,\n section: inst.section,\n allowed_events: allowed,\n action_menu: menu,\n artifacts: inst.artifacts,\n ...(includeUi ? { ui } : {}),\n ...(derivedProfile ? { ui_profile: derivedProfile } : {}),\n ...(assets ? { assets } : {}),\n }\n }\n\n public async pause(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n const prev = inst.status\n inst.status = 'paused'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async resume(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n const prev = inst.status\n inst.status = 'active'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async cancel(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n const prev = inst.status\n inst.status = 'canceled'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async complete(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n // Only allow completion when FSM is in a final state\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n inst.templateId,\n inst.templateVersion\n )\n if (!tplRec) throw this.problem('invalid_template', 'template not found for instance')\n const toDef = tplRec.template.states.find((s) => s.name === inst.state)\n if (toDef?.type !== 'final') throw this.problem('forbidden', 'cannot complete: state is not final')\n const prev = inst.status\n inst.status = 'completed'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceCompleted,\n payload: { instanceRecord: inst, state: inst.state, section: inst.section },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async autoAdvanceByConnection(agentContext: AgentContext, connectionId: string, event: string) {\n const inst = await this.instanceRepo.findLatestByConnection(agentContext, connectionId)\n if (!inst) return\n try {\n await this.advance(agentContext, {\n instance_id: inst.instanceId,\n event,\n idempotency_key: `auto:${event}:${inst.instanceId}`,\n })\n } catch (e) {\n // swallow, log at debug\n this.agentConfig.logger.debug(`Workflow autoAdvance error: ${(e as Error).message}`)\n }\n }\n\n private evalMultiplicity(expr: string, context: Record<string, unknown>): string {\n try {\n const env = { context, participants: {}, artifacts: {} }\n const val = GuardEvaluator.evalValue(expr, env)\n return val != null ? String(val) : ''\n } catch {\n return ''\n }\n }\n\n private toInstanceData(rec: WorkflowInstanceRecord): WorkflowInstanceData {\n return {\n instance_id: rec.instanceId,\n template_id: rec.templateId,\n template_version: rec.templateVersion,\n connection_id: rec.connectionId,\n participants: rec.participants,\n state: rec.state,\n section: rec.section,\n context: rec.context,\n artifacts: rec.artifacts,\n status: rec.status,\n history: rec.history,\n multiplicityKeyValue: rec.multiplicityKeyValue,\n idempotencyKeys: rec.idempotencyKeys,\n }\n }\n\n private problem(code: string, comment: string) {\n const err = new Error(comment) as Error & { code: string }\n err.code = code\n return err\n }\n\n private async getInstanceByIdOrTag(agentContext: AgentContext, instanceId: string) {\n try {\n return await this.instanceRepo.getById(agentContext, instanceId)\n } catch {\n const found = await this.instanceRepo.getByInstanceId(agentContext, instanceId)\n if (!found) throw this.problem('invalid_event', 'instance not found')\n return found\n }\n }\n\n private uuid(): string {\n // light uuid\n return `wf_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`\n }\n\n private validateTemplate(t: WorkflowTemplate) {\n const fail = (msg: string) => {\n throw this.problem('invalid_template', msg)\n }\n if (!t.template_id || !t.version || !t.title) fail('missing required fields')\n if (!Array.isArray(t.states) || !t.states.length) fail('states required')\n if (!Array.isArray(t.transitions)) fail('transitions required')\n if (!Array.isArray(t.actions)) fail('actions required')\n const stateNames = new Set(t.states.map((s) => s.name))\n if (![...t.states].some((s) => s.type === 'start')) fail('start state required')\n for (const s of t.states) {\n if (s.section && !t.sections?.some((sec) => sec.name === s.section)) fail(`state.section not found: ${s.section}`)\n }\n for (const tr of t.transitions) {\n if (!stateNames.has(tr.from)) fail(`transition.from unknown: ${tr.from}`)\n if (!stateNames.has(tr.to)) fail(`transition.to unknown: ${tr.to}`)\n if (tr.action && !t.actions.some((a) => a.key === tr.action)) fail(`transition.action unknown: ${tr.action}`)\n }\n // profile_ref resolution\n for (const a of t.actions) {\n if ('profile_ref' in a && (a as { profile_ref: string }).profile_ref) {\n const pr = (a as { profile_ref: string }).profile_ref\n if (pr.startsWith('cp.')) {\n const key = pr.slice(3)\n if (!t.catalog?.credential_profiles || !t.catalog.credential_profiles[key]) fail(`catalog.cp missing: ${key}`)\n } else if (pr.startsWith('pp.')) {\n const key = pr.slice(3)\n if (!t.catalog?.proof_profiles || !t.catalog.proof_profiles[key]) fail(`catalog.pp missing: ${key}`)\n } else fail(`invalid profile_ref: ${pr}`)\n }\n }\n }\n\n private async sendCompleteMessage(agentContext: AgentContext, inst: WorkflowInstanceRecord) {\n try {\n if (!inst.connectionId) return\n const connectionSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const messageSender = agentContext.dependencyManager.resolve(DidCommMessageSender)\n const connection = await connectionSvc.getById(agentContext, inst.connectionId)\n const msg = new CompleteMessage({\n thid: inst.instanceId,\n body: { instance_id: inst.instanceId, reason: 'state_final' },\n })\n try {\n // Request return-route so HTTP outbound doesn't throw on 15s timeout\n msg.setReturnRouting(ReturnRouteTypes.thread, inst.instanceId)\n } catch (_e) {\n void 0\n }\n const outbound = new DidCommOutboundMessageContext(msg, { agentContext, connection })\n await messageSender.sendMessage(outbound)\n } catch (e) {\n this.agentConfig.logger.debug(`Workflow complete notify error: ${(e as Error).message}`)\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowService.mjs","names":["allKeys: string[]","WorkflowService","templateRepo: WorkflowTemplateRepository","instanceRepo: WorkflowInstanceRepository","config: WorkflowModuleConfig","agentConfig: AgentConfig","eventEmitter?: EventEmitter","multiplicityKeyValue: string | undefined","participants: Participants","inst: WorkflowInstanceRecord","t","artifactsDelta: Record<string, unknown>","messageId: string | undefined","result: {\n artifacts?: Record<string, unknown>\n contextMerge?: Record<string, unknown>\n messageId?: string\n }","derivedProfile: string | undefined","myDid: string | undefined","connection: { id?: string; myDid?: string; theirDid?: string } | undefined"],"sources":["../../src/services/WorkflowService.ts"],"sourcesContent":["import type { Participants, WorkflowInstanceData, WorkflowTemplate, UiItem } from '../model/types'\n\nimport { AgentConfig, AgentContext, EventEmitter, Hasher, TypedArrayEncoder, injectable } from '@credo-ts/core'\n\nimport { DidCommConnectionService, DidCommMessageSender, DidCommOutboundMessageContext, ReturnRouteTypes } from '@credo-ts/didcomm'\n\nimport { WorkflowEventTypes } from '../WorkflowEvents'\nimport { WorkflowModuleConfig } from '../WorkflowModuleConfig'\nimport {\n ActionRegistry,\n IssueCredentialV2Action,\n IssueCredentialMessageV2Action,\n LocalStateSetAction,\n PresentProofV2Action,\n ProposeCredentialV2Action,\n RequestCredentialV2Action,\n} from '../actions/ActionRegistry'\nimport { GuardEvaluator } from '../engine/GuardEvaluator'\nimport { validateTemplateJson, validateTemplateRefs } from '../model/TemplateValidation'\nimport { ensureArray, findSectionForState, transitionsFromState } from '../model/types'\nimport { CompleteMessage } from '../protocol/messages/CompleteMessage'\nimport { WorkflowInstanceRecord } from '../repository/WorkflowInstanceRecord'\nimport { WorkflowInstanceRepository } from '../repository/WorkflowInstanceRepository'\nimport { WorkflowTemplateRecord } from '../repository/WorkflowTemplateRecord'\nimport { WorkflowTemplateRepository } from '../repository/WorkflowTemplateRepository'\n\nconst stableStringify = (obj: unknown): string => {\n const allKeys: string[] = []\n JSON.stringify(obj, (k, v) => {\n allKeys.push(k)\n return v\n })\n allKeys.sort()\n return JSON.stringify(obj, allKeys)\n}\n\nconst sha256 = (input: string): string => {\n const hash = Hasher.hash(TypedArrayEncoder.fromString(input), 'sha-256')\n return TypedArrayEncoder.toHex(hash)\n}\n\n@injectable()\nexport class WorkflowService {\n private readonly actions: ActionRegistry\n\n public constructor(\n private readonly templateRepo: WorkflowTemplateRepository,\n private readonly instanceRepo: WorkflowInstanceRepository,\n private readonly config: WorkflowModuleConfig,\n private readonly agentConfig: AgentConfig,\n private readonly eventEmitter?: EventEmitter\n ) {\n this.actions = new ActionRegistry()\n this.actions.register(new LocalStateSetAction())\n // Register DIDComm action handlers used by workflows\n // Credential issuance flow handlers\n this.actions.register(new ProposeCredentialV2Action()) // Holder proposes credential\n this.actions.register(new IssueCredentialV2Action()) // Issuer sends offer\n this.actions.register(new RequestCredentialV2Action()) // Holder accepts offer\n this.actions.register(new IssueCredentialMessageV2Action()) // Issuer issues credential\n // Proof presentation handler\n this.actions.register(new PresentProofV2Action())\n }\n\n // Allow external modules (e.g., payments) to register additional action handlers\n public registerActions(actions: Array<{ typeUri: string; execute: (...args: unknown[]) => Promise<unknown> }>) {\n for (const a of actions) {\n // ActionRegistry expects objects with shape { typeUri, execute }\n // We don't import the exact type here to avoid cross-package coupling\n this.actions.register(a as unknown as never)\n }\n }\n\n public async publishTemplate(\n agentContext: AgentContext,\n template: WorkflowTemplate\n ): Promise<WorkflowTemplateRecord> {\n // JSON schema validation + structural checks\n validateTemplateJson(template)\n validateTemplateRefs(template)\n const hash = sha256(stableStringify(template))\n const existing = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n template.template_id,\n template.version\n )\n if (existing) {\n existing.template = template\n existing.hash = hash\n await this.templateRepo.update(agentContext, existing)\n return existing\n }\n const record = new WorkflowTemplateRecord({ template, hash })\n await this.templateRepo.save(agentContext, record)\n return record\n }\n\n public async start(\n agentContext: AgentContext,\n opts: {\n template_id: string\n template_version?: string\n instance_id?: string\n connection_id?: string\n participants?: Participants\n context?: Record<string, unknown>\n }\n ): Promise<WorkflowInstanceRecord> {\n // Idempotency by instance_id: if an instance with the same instance_id already exists, return it\n if (opts.instance_id) {\n try {\n const existingByInstance = await this.instanceRepo.getByInstanceId(agentContext, opts.instance_id)\n if (existingByInstance) return existingByInstance\n } catch {\n /* not found */\n }\n }\n\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n opts.template_id,\n opts.template_version\n )\n if (!tplRec)\n throw this.problem(\n 'invalid_template',\n `template not found: ${opts.template_id}@${opts.template_version || 'latest'}`\n )\n const tpl = tplRec.template\n const startState = tpl.states.find((s) => s.type === 'start')?.name || tpl.states[0]?.name\n if (!startState) throw this.problem('invalid_template', 'no start state')\n\n const policy = tpl.instance_policy\n const connectionId = opts.connection_id\n if (policy.mode === 'singleton_per_connection') {\n const existing = ensureArray(\n await this.instanceRepo.findByTemplateAndConnection(agentContext, tpl.template_id, connectionId)\n ).shift()\n if (existing) {\n if (this.config.autoReturnExistingOnSingleton) return existing\n throw this.problem('already_exists', 'instance already exists for template/connection')\n }\n }\n\n let multiplicityKeyValue: string | undefined\n if (policy.mode === 'multi_per_connection' && policy.multiplicity_key) {\n multiplicityKeyValue = this.evalMultiplicity(policy.multiplicity_key, opts.context || {})\n const dup = ensureArray(\n await this.instanceRepo.findByTemplateConnAndMultiplicity(\n agentContext,\n tpl.template_id,\n connectionId,\n multiplicityKeyValue\n )\n ).shift()\n if (dup) return dup\n }\n\n // Derive participants from connection when not provided\n let participants: Participants = (opts.participants as Participants) || ({} as Participants)\n try {\n if (connectionId) {\n const connSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const conn = await connSvc.getById(agentContext, connectionId)\n const theirDid = (conn as any)?.theirDid as string | undefined\n const myDid = ((conn as any)?.did as string | undefined) || ((conn as any)?.myDid as string | undefined)\n if (theirDid) {\n const holder = (participants as any).holder || {}\n if (!holder.did) holder.did = theirDid\n ;(participants as any).holder = holder\n }\n if (myDid) {\n const issuer = (participants as any).issuer || {}\n if (!issuer.did) issuer.did = myDid\n ;(participants as any).issuer = issuer\n }\n }\n } catch {\n // best effort only\n }\n\n const instanceId = opts.instance_id || this.uuid()\n const section = findSectionForState(tpl, startState)\n const rec = new WorkflowInstanceRecord({\n instanceId,\n templateId: tpl.template_id,\n templateVersion: tpl.version,\n connectionId,\n participants,\n state: startState,\n section,\n context: { ...(opts.context || {}) },\n artifacts: {},\n status: 'active',\n history: [],\n multiplicityKeyValue,\n idempotencyKeys: [],\n })\n await this.instanceRepo.save(agentContext, rec)\n // Emit state changed event for initial creation\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStateChanged,\n payload: {\n instanceRecord: rec,\n previousState: null,\n newState: rec.state,\n event: 'start',\n actionKey: undefined,\n msgId: undefined,\n },\n })\n } catch (_e) {\n void 0\n }\n return rec\n }\n\n public async advance(\n agentContext: AgentContext,\n opts: {\n instance_id: string\n event: string\n idempotency_key?: string\n input?: Record<string, unknown>\n },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n let inst: WorkflowInstanceRecord\n if (instanceRecord) {\n inst = instanceRecord\n } else {\n try {\n inst = await this.instanceRepo.getById(agentContext, opts.instance_id)\n } catch {\n const found = await this.instanceRepo.getByInstanceId(agentContext, opts.instance_id)\n if (!found) throw this.problem('invalid_event', 'instance not found')\n inst = found\n }\n }\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n inst.templateId,\n inst.templateVersion\n )\n if (!tplRec) throw this.problem('invalid_template', 'template not found for instance')\n const tpl = tplRec.template\n\n // lifecycle status gating\n if (inst.status === 'paused') throw this.problem('forbidden', 'instance is paused')\n if (inst.status === 'canceled') throw this.problem('forbidden', 'instance is canceled')\n if (inst.status === 'completed') throw this.problem('invalid_event', 'instance already completed')\n\n // idempotency\n if (opts.idempotency_key && inst.idempotencyKeys?.includes(opts.idempotency_key)) {\n const prior = inst.idempotency?.find?.((i) => i.key === opts.idempotency_key)\n if (prior && prior.event !== opts.event) throw this.problem('idempotency_conflict', 'same key, different event')\n return inst\n }\n\n const candidates = transitionsFromState(tpl, inst.state).filter((t) => t.on === opts.event)\n if (!candidates.length)\n throw this.problem('invalid_event', `no transition for event ${opts.event} from ${inst.state}`)\n const env = GuardEvaluator.envFromInstance(this.toInstanceData(inst))\n const enabled = candidates.filter((t) => GuardEvaluator.evalGuard(t.guard, env))\n if (!enabled.length) throw this.problem('guard_failed', 'guard evaluated false')\n const t = enabled[0]\n\n let artifactsDelta: Record<string, unknown> = {}\n let messageId: string | undefined\n if (t.action) {\n const def = tpl.actions.find((a) => a.key === t.action)\n if (!def) throw this.problem('invalid_template', `action not defined: ${t.action}`)\n const handler = this.actions.get(def.typeURI)\n if (!handler) throw this.problem('action_error', `no handler for type ${def.typeURI}`)\n const exec = async () =>\n handler.execute({\n agentContext,\n template: tpl,\n instance: this.toInstanceData(inst),\n action: def,\n input: opts.input,\n })\n const timeoutMs = this.config.actionTimeoutMs ?? 15000\n const race = Promise.race([\n exec(),\n new Promise<never>((_, rej) => setTimeout(() => rej(new Error('action timeout')), timeoutMs)),\n ])\n let result: {\n artifacts?: Record<string, unknown>\n contextMerge?: Record<string, unknown>\n messageId?: string\n }\n try {\n result = (await race) as typeof result\n } catch (e) {\n throw Object.assign(new Error((e as Error).message || 'action timeout'), { code: 'action_error' })\n }\n artifactsDelta = result?.artifacts || {}\n // local state:set may be applied directly by handler, but ensure we persist\n if (result?.contextMerge) inst.context = result.contextMerge\n if (result?.messageId) messageId = result.messageId\n }\n\n // Concurrency check: re-read and ensure state didn't change\n const fromState = inst.state\n try {\n const fresh = await this.instanceRepo.getById(agentContext, inst.id)\n if (fresh.state !== fromState) throw this.problem('state_conflict', 'state changed concurrently')\n } catch (_e) {\n // ignore if repository throws\n void 0\n }\n\n // persist atomically (optimistic)\n const prevState = inst.state\n inst.history.push({\n ts: new Date().toISOString(),\n event: opts.event,\n from: inst.state,\n to: t.to,\n actionKey: t.action,\n msg_id: messageId,\n })\n inst.state = t.to\n inst.section = findSectionForState(tpl, t.to)\n inst.artifacts = { ...inst.artifacts, ...artifactsDelta }\n if (opts.idempotency_key) {\n inst.idempotencyKeys = [...(inst.idempotencyKeys || []), opts.idempotency_key]\n inst.idempotency = [\n ...(inst.idempotency || []),\n { key: opts.idempotency_key, event: opts.event, to: t.to, actionKey: t.action },\n ]\n // Trim idempotency history to configured limit\n const limit = Math.max(1, this.config.idempotencyHistoryLimit ?? 100)\n if ((inst.idempotencyKeys?.length || 0) > limit) {\n inst.idempotencyKeys = inst.idempotencyKeys.slice(-limit)\n }\n if ((inst.idempotency?.length || 0) > limit) {\n inst.idempotency = inst.idempotency.slice(-limit)\n }\n }\n let reachedFinal = false\n try {\n const toDef = tpl.states.find((s) => s.name === t.to)\n if (toDef?.type === 'final') {\n inst.status = 'completed'\n reachedFinal = true\n }\n } catch (_e) {\n void 0\n }\n await this.instanceRepo.update(agentContext, inst)\n\n // Emit state-changed event\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStateChanged,\n payload: {\n instanceRecord: inst,\n previousState: prevState,\n newState: inst.state,\n event: opts.event,\n actionKey: t.action,\n msgId: messageId,\n },\n })\n } catch (_e) {\n void 0\n }\n\n // Emit status-changed & completed, and send Complete message if final\n if (reachedFinal) {\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: 'active', newStatus: 'completed' },\n })\n } catch (_e) {\n void 0\n }\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceCompleted,\n payload: { instanceRecord: inst, state: inst.state, section: inst.section },\n })\n } catch (_e) {\n void 0\n }\n await this.sendCompleteMessage(agentContext, inst)\n }\n return inst\n }\n\n public async status(\n agentContext: AgentContext,\n opts: {\n instance_id: string\n include_actions?: boolean\n include_ui?: boolean\n ui_profile?: string\n viewer?: { role?: string; connection_id?: string; did?: string; participantKey?: string }\n capabilities?: string[]\n },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<{\n instance_id: string\n template_id: string\n template_version: string\n connection_id?: string\n connection?: { id?: string; myDid?: string; theirDid?: string }\n participants?: Participants\n context?: Record<string, unknown>\n status?: string\n createdAt?: Date\n updatedAt?: Date\n state: string\n section?: string\n allowed_events: string[]\n action_menu: Array<{ label?: string; event: string }>\n artifacts: Record<string, unknown>\n ui?: UiItem[]\n ui_profile?: string\n assets?: Record<string, { mediaType: string; uri?: string; attachmentId?: string }>\n }> {\n let inst: WorkflowInstanceRecord\n if (instanceRecord) {\n inst = instanceRecord\n } else {\n try {\n inst = await this.instanceRepo.getById(agentContext, opts.instance_id)\n } catch {\n const found = await this.instanceRepo.getByInstanceId(agentContext, opts.instance_id)\n if (!found) throw this.problem('invalid_event', 'instance not found')\n inst = found\n }\n }\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n inst.templateId,\n inst.templateVersion\n )\n if (!tplRec) throw this.problem('invalid_template', 'template not found for instance')\n const tpl = tplRec.template\n const instData = this.toInstanceData(inst)\n const env = GuardEvaluator.envFromInstance(instData)\n const allowed = transitionsFromState(tpl, inst.state)\n .filter((t) => GuardEvaluator.evalGuard(t.guard, env))\n .map((t) => t.on)\n const includeActions = opts.include_actions ?? true\n const includeUi = opts.include_ui ?? true\n\n // Build full env with viewer info for UI filtering\n const uiEnv = {\n context: instData.context || {},\n participants: instData.participants || {},\n artifacts: instData.artifacts || {},\n viewer: opts.viewer,\n }\n\n // Select + filter UI items\n // Defer import to avoid cycle risk\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const Ui = require('../ui/UiFilter') as unknown as {\n selectUi: (h: unknown, s: string, p?: string) => unknown[]\n filterAndBindUi: (items: unknown[], env: unknown, viewer?: unknown, p?: string) => unknown[]\n collectAssets: (\n items: unknown[],\n assets?: Record<string, { mediaType: string; uri?: string; attachmentId?: string }>\n ) => Record<string, { mediaType: string; uri?: string; attachmentId?: string }> | undefined\n }\n // Derive viewer profile from instance participants per spec\n let derivedProfile: string | undefined = opts.ui_profile\n try {\n // 1) If viewer role/participantKey provided, honor it\n const viewerRole = opts.viewer?.role as string | undefined\n const viewerKey = opts.viewer?.participantKey as string | undefined\n const viewerDid = opts.viewer?.did as string | undefined\n const mapKeyToProfile = (k?: string): string | undefined => {\n if (!k) return undefined\n const key = k.toLowerCase()\n if (key === 'sender' || key === 'issuer') return 'sender'\n if (key === 'receiver' || key === 'holder') return 'receiver'\n return undefined\n }\n if (!derivedProfile) derivedProfile = mapKeyToProfile(viewerRole) || mapKeyToProfile(viewerKey)\n\n // 1b) If viewer DID provided, map to participant key by DID equality\n if (!derivedProfile && viewerDid && instData?.participants && typeof instData.participants === 'object') {\n for (const [pKey, pVal] of Object.entries(instData.participants as Record<string, any>)) {\n const did = (pVal as any)?.did as string | undefined\n if (did && did === viewerDid) {\n derivedProfile = mapKeyToProfile(pKey)\n if (derivedProfile) break\n }\n }\n }\n\n // 2) If still not set, try to match current tenant's DID against instance participants\n if (!derivedProfile) {\n // Obtain my DID for the instance's connection, if available\n let myDid: string | undefined\n if (instData?.connection_id) {\n try {\n const connSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const conn = await connSvc.getById(agentContext, instData.connection_id)\n myDid = ((conn as any)?.did as string | undefined) || ((conn as any)?.myDid as string | undefined)\n } catch {}\n }\n if (myDid && instData?.participants && typeof instData.participants === 'object') {\n for (const [pKey, pVal] of Object.entries(instData.participants as Record<string, any>)) {\n const did = (pVal as any)?.did as string | undefined\n if (did && did === myDid) {\n derivedProfile = mapKeyToProfile(pKey)\n if (derivedProfile) break\n }\n }\n }\n }\n } catch {}\n\n const selected = Ui.selectUi((tpl as unknown as { display_hints?: unknown })?.display_hints, inst.state, derivedProfile)\n const filtered = Ui.filterAndBindUi(selected, uiEnv, opts.viewer, derivedProfile) as UiItem[]\n const menu = includeActions\n ? filtered\n .filter((i) => i?.type === 'button' || i?.type === 'submit-button')\n .map((i) => ({ label: i?.label, event: i?.event as string }))\n : []\n const assets = Ui.collectAssets(filtered, (tpl as unknown as { display_hints?: { assets?: unknown } })?.display_hints?.assets as never)\n const ui = includeUi ? filtered : undefined\n let connection: { id?: string; myDid?: string; theirDid?: string } | undefined\n if (inst.connectionId) {\n try {\n const connSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const conn = await connSvc.getById(agentContext, inst.connectionId)\n connection = {\n id: (conn as any)?.id,\n myDid: ((conn as any)?.did as string | undefined) || ((conn as any)?.myDid as string | undefined),\n theirDid: (conn as any)?.theirDid,\n }\n } catch {\n // ignore if not found\n }\n }\n return {\n instance_id: inst.instanceId,\n template_id: inst.templateId,\n template_version: inst.templateVersion,\n connection_id: inst.connectionId,\n connection,\n participants: inst.participants,\n context: inst.context,\n status: inst.status,\n createdAt: inst.createdAt,\n updatedAt: (inst as any)?.updatedAt,\n state: inst.state,\n section: inst.section,\n allowed_events: allowed,\n action_menu: menu,\n artifacts: inst.artifacts,\n ...(includeUi ? { ui } : {}),\n ...(derivedProfile ? { ui_profile: derivedProfile } : {}),\n ...(assets ? { assets } : {}),\n }\n }\n\n public async pause(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n const prev = inst.status\n inst.status = 'paused'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async resume(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n const prev = inst.status\n inst.status = 'active'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async cancel(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n const prev = inst.status\n inst.status = 'canceled'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async complete(\n agentContext: AgentContext,\n opts: { instance_id: string; reason?: string },\n instanceRecord?: WorkflowInstanceRecord\n ): Promise<WorkflowInstanceRecord> {\n const inst = instanceRecord || (await this.getInstanceByIdOrTag(agentContext, opts.instance_id))\n // Only allow completion when FSM is in a final state\n const tplRec = await this.templateRepo.findByTemplateIdAndVersion(\n agentContext,\n inst.templateId,\n inst.templateVersion\n )\n if (!tplRec) throw this.problem('invalid_template', 'template not found for instance')\n const toDef = tplRec.template.states.find((s) => s.name === inst.state)\n if (toDef?.type !== 'final') throw this.problem('forbidden', 'cannot complete: state is not final')\n const prev = inst.status\n inst.status = 'completed'\n await this.instanceRepo.update(agentContext, inst)\n try {\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceStatusChanged,\n payload: { instanceRecord: inst, previousStatus: prev, newStatus: inst.status, reason: opts.reason },\n })\n this.eventEmitter?.emit(agentContext, {\n type: WorkflowEventTypes.WorkflowInstanceCompleted,\n payload: { instanceRecord: inst, state: inst.state, section: inst.section },\n })\n } catch (_e) {\n void 0\n }\n return inst\n }\n\n public async autoAdvanceByConnection(agentContext: AgentContext, connectionId: string, event: string) {\n const inst = await this.instanceRepo.findLatestByConnection(agentContext, connectionId)\n if (!inst) {\n this.agentConfig.logger.warn(`[autoAdvance] No workflow instance found for connection ${connectionId}, event=${event}`)\n return\n }\n this.agentConfig.logger.info(`[autoAdvance] Advancing workflow ${inst.instanceId} with event=${event} (connection=${connectionId})`)\n try {\n await this.advance(agentContext, {\n instance_id: inst.instanceId,\n event,\n idempotency_key: `auto:${event}:${inst.instanceId}`,\n })\n this.agentConfig.logger.info(`[autoAdvance] Successfully advanced workflow ${inst.instanceId} with event=${event}`)\n } catch (e) {\n this.agentConfig.logger.warn(`[autoAdvance] Failed to advance workflow ${inst.instanceId} with event=${event}: ${(e as Error).message}`)\n }\n }\n\n private evalMultiplicity(expr: string, context: Record<string, unknown>): string {\n try {\n const env = { context, participants: {}, artifacts: {} }\n const val = GuardEvaluator.evalValue(expr, env)\n return val != null ? String(val) : ''\n } catch {\n return ''\n }\n }\n\n private toInstanceData(rec: WorkflowInstanceRecord): WorkflowInstanceData {\n return {\n instance_id: rec.instanceId,\n template_id: rec.templateId,\n template_version: rec.templateVersion,\n connection_id: rec.connectionId,\n participants: rec.participants,\n state: rec.state,\n section: rec.section,\n context: rec.context,\n artifacts: rec.artifacts,\n status: rec.status,\n history: rec.history,\n multiplicityKeyValue: rec.multiplicityKeyValue,\n idempotencyKeys: rec.idempotencyKeys,\n }\n }\n\n private problem(code: string, comment: string) {\n const err = new Error(comment) as Error & { code: string }\n err.code = code\n return err\n }\n\n private async getInstanceByIdOrTag(agentContext: AgentContext, instanceId: string) {\n try {\n return await this.instanceRepo.getById(agentContext, instanceId)\n } catch {\n const found = await this.instanceRepo.getByInstanceId(agentContext, instanceId)\n if (!found) throw this.problem('invalid_event', 'instance not found')\n return found\n }\n }\n\n private uuid(): string {\n // light uuid\n return `wf_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`\n }\n\n private validateTemplate(t: WorkflowTemplate) {\n const fail = (msg: string) => {\n throw this.problem('invalid_template', msg)\n }\n if (!t.template_id || !t.version || !t.title) fail('missing required fields')\n if (!Array.isArray(t.states) || !t.states.length) fail('states required')\n if (!Array.isArray(t.transitions)) fail('transitions required')\n if (!Array.isArray(t.actions)) fail('actions required')\n const stateNames = new Set(t.states.map((s) => s.name))\n if (![...t.states].some((s) => s.type === 'start')) fail('start state required')\n for (const s of t.states) {\n if (s.section && !t.sections?.some((sec) => sec.name === s.section)) fail(`state.section not found: ${s.section}`)\n }\n for (const tr of t.transitions) {\n if (!stateNames.has(tr.from)) fail(`transition.from unknown: ${tr.from}`)\n if (!stateNames.has(tr.to)) fail(`transition.to unknown: ${tr.to}`)\n if (tr.action && !t.actions.some((a) => a.key === tr.action)) fail(`transition.action unknown: ${tr.action}`)\n }\n // profile_ref resolution\n for (const a of t.actions) {\n if ('profile_ref' in a && (a as { profile_ref: string }).profile_ref) {\n const pr = (a as { profile_ref: string }).profile_ref\n if (pr.startsWith('cp.')) {\n const key = pr.slice(3)\n if (!t.catalog?.credential_profiles || !t.catalog.credential_profiles[key]) fail(`catalog.cp missing: ${key}`)\n } else if (pr.startsWith('pp.')) {\n const key = pr.slice(3)\n if (!t.catalog?.proof_profiles || !t.catalog.proof_profiles[key]) fail(`catalog.pp missing: ${key}`)\n } else fail(`invalid profile_ref: ${pr}`)\n }\n }\n }\n\n private async sendCompleteMessage(agentContext: AgentContext, inst: WorkflowInstanceRecord) {\n try {\n if (!inst.connectionId) return\n const connectionSvc = agentContext.dependencyManager.resolve(DidCommConnectionService)\n const messageSender = agentContext.dependencyManager.resolve(DidCommMessageSender)\n const connection = await connectionSvc.getById(agentContext, inst.connectionId)\n const msg = new CompleteMessage({\n thid: inst.instanceId,\n body: { instance_id: inst.instanceId, reason: 'state_final' },\n })\n try {\n // Request return-route so HTTP outbound doesn't throw on 15s timeout\n msg.setReturnRouting(ReturnRouteTypes.thread, inst.instanceId)\n } catch (_e) {\n void 0\n }\n const outbound = new DidCommOutboundMessageContext(msg, { agentContext, connection })\n await messageSender.sendMessage(outbound)\n } catch (e) {\n this.agentConfig.logger.debug(`Workflow complete notify error: ${(e as Error).message}`)\n }\n }\n}\n"],"mappings":"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"}
|