@contractspec/example.workflow-system 3.8.11 → 3.8.14
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/dist/browser/example.js +1 -1
- package/dist/browser/index.js +9 -9
- package/dist/example.d.ts +3 -2
- package/dist/example.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +9 -9
- package/package.json +7 -7
package/dist/browser/example.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"workflow-system",version:"1.0.0",title:"Workflow
|
|
1
|
+
import{defineExample as g}from"@contractspec/lib.contracts-spec/examples";var h=g({meta:{key:"workflow-system",version:"1.0.0",title:"Workflow System",description:"Workflow and approval system example for ContractSpec - State machine with role-based transitions",kind:"template",visibility:"public",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","workflow-system"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.workflow-system"}}),u=h;export{u as default,h as ExamplesWorkflowSystemExample};
|
package/dist/browser/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import{defineEnum as r0}from"@contractspec/lib.schema";var y=r0("ApprovalStatus",["PENDING","APPROVED","REJECTED","DELEGATED","ESCALATED","WITHDRAWN","EXPIRED"]),m=r0("ApprovalDecision",["APPROVE","REJECT","REQUEST_CHANGES","DELEGATE","ABSTAIN"]);import{defineEvent as A0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as g0,ScalarTypeEnum as J}from"@contractspec/lib.schema";var gA=g0({name:"ApprovalRequestedEventPayload",description:"Payload when approval is requested",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},workflowKey:{type:J.String_unsecure(),isOptional:!1},approverId:{type:J.String_unsecure(),isOptional:!1},approverRole:{type:J.String_unsecure(),isOptional:!0},title:{type:J.String_unsecure(),isOptional:!1},dueAt:{type:J.DateTime(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),_A=g0({name:"ApprovalDecidedEventPayload",description:"Payload when approval decision is made",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},decision:{type:J.String_unsecure(),isOptional:!1},decidedBy:{type:J.String_unsecure(),isOptional:!1},comment:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),DA=g0({name:"ApprovalDelegatedEventPayload",description:"Payload when approval is delegated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},fromUserId:{type:J.String_unsecure(),isOptional:!1},toUserId:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),RA=g0({name:"ApprovalEscalatedEventPayload",description:"Payload when approval is escalated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},escalationLevel:{type:J.Int_unsecure(),isOptional:!1},escalatedTo:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!1},timestamp:{type:J.DateTime(),isOptional:!1}}}),LA=A0({meta:{key:"workflow.approval.requested",version:"1.0.0",description:"An approval has been requested.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","requested"]},payload:gA}),ZA=A0({meta:{key:"workflow.approval.decided",version:"1.0.0",description:"An approval decision has been made.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","decided"]},payload:_A}),OA=A0({meta:{key:"workflow.approval.delegated",version:"1.0.0",description:"An approval has been delegated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","delegated"]},payload:DA}),IA=A0({meta:{key:"workflow.approval.escalated",version:"1.0.0",description:"An approval has been escalated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","escalated"]},payload:RA});var zg={workflows:new Map,steps:new Map,instances:new Map,approvals:new Map,stepExecutions:new Map};class w0{canTransition(A,_,g,R){if(_.status!=="RUNNING"&&_.status!=="WAITING")return{allowed:!1,reason:`Workflow is ${_.status}, cannot transition`};let O=A.steps[_.currentStepKey];if(!O)return{allowed:!1,reason:`Step ${_.currentStepKey} not found`};let P=O.transitions[g];if(!P)return{allowed:!1,reason:`Action ${g} not available in step ${_.currentStepKey}`};if(O.allowedRoles&&O.allowedRoles.length>0){if(!O.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:"User lacks required role for this action"}}if(typeof P==="object"&&P.allowedRoles&&P.allowedRoles.length>0){if(!P.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:`User lacks required role for action ${g}`}}return{allowed:!0}}getAvailableActions(A,_,g){if(_.status!=="RUNNING"&&_.status!=="WAITING")return[];let R=A.steps[_.currentStepKey];if(!R)return[];return Object.keys(R.transitions).filter((O)=>{return this.canTransition(A,_,O,g).allowed})}transition(A,_,g,R){let O=this.canTransition(A,_,g,R);if(!O.allowed)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:O.reason};let P=A.steps[_.currentStepKey];if(!P)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Current step ${_.currentStepKey} not found`};let Z=P.transitions[g];if(!Z)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Transition for action ${g} not found`};let D=typeof Z==="string"?Z:Z.targetStepKey,H=A.steps[D];if(!H)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Target step ${D} not found`};let G="RUNNING";if(H.type==="END")G="COMPLETED";else if(H.type==="APPROVAL"||H.type==="WAIT")G="WAITING";return{success:!0,previousStepKey:_.currentStepKey,currentStepKey:D,status:G}}evaluateCondition(A,_){try{let g=A.match(/^(\w+)\s*(>=|<=|>|<|===|!==|==|!=)\s*(.+)$/);if(g){let[,R,O,P]=g;if(!R||!O||P===void 0)return!1;let Z=_[R],D=JSON.parse(P);switch(O){case">":return Number(Z)>Number(D);case"<":return Number(Z)<Number(D);case">=":return Number(Z)>=Number(D);case"<=":return Number(Z)<=Number(D);case"===":case"==":return Z===D;case"!==":case"!=":return Z!==D}}if(A in _)return Boolean(_[A]);return!1}catch{return!1}}}function Wg(){return new w0}function dg(A,_){let g={};for(let P of _)g[P.key]={key:P.key,name:P.name,type:P.type,transitions:P.transitions,approvalMode:P.approvalMode,allowedRoles:P.approverRoles,timeoutSeconds:P.timeoutSeconds,conditionExpression:P.conditionExpression};let O=_.find((P)=>P.type==="START")?.key??_[0]?.key??"";return{key:A.key,name:A.name,version:A.version,initialStepKey:O,steps:g}}function bg(A,_={}){return{currentStepKey:A.initialStepKey,status:"RUNNING",contextData:_,history:[]}}import{defineSchemaModel as T0,ScalarTypeEnum as k}from"@contractspec/lib.schema";var b=T0({name:"ApprovalRequestModel",description:"An approval request",fields:{id:{type:k.String_unsecure(),isOptional:!1},workflowInstanceId:{type:k.String_unsecure(),isOptional:!1},stepExecutionId:{type:k.String_unsecure(),isOptional:!1},approverId:{type:k.String_unsecure(),isOptional:!1},approverRole:{type:k.String_unsecure(),isOptional:!0},title:{type:k.String_unsecure(),isOptional:!1},description:{type:k.String_unsecure(),isOptional:!0},status:{type:y,isOptional:!1},decision:{type:m,isOptional:!0},decisionComment:{type:k.String_unsecure(),isOptional:!0},decidedAt:{type:k.DateTime(),isOptional:!0},dueAt:{type:k.DateTime(),isOptional:!0},contextSnapshot:{type:k.JSON(),isOptional:!0},sequenceOrder:{type:k.Int_unsecure(),isOptional:!1},createdAt:{type:k.DateTime(),isOptional:!1}}}),_0=T0({name:"ApprovalCommentModel",description:"A comment on an approval",fields:{id:{type:k.String_unsecure(),isOptional:!1},approvalRequestId:{type:k.String_unsecure(),isOptional:!1},authorId:{type:k.String_unsecure(),isOptional:!1},content:{type:k.String_unsecure(),isOptional:!1},isInternal:{type:k.Boolean(),isOptional:!1},createdAt:{type:k.DateTime(),isOptional:!1}}});import{defineCommand as K0,defineQuery as E0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as r,ScalarTypeEnum as $}from"@contractspec/lib.schema";var o=["@example.workflow-system"],PA=K0({meta:{key:"workflow.approval.decide",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","decision"],description:"Submit an approval decision (approve/reject).",goal:"Allow approvers to make decisions on requests.",context:"Approval inbox, workflow detail."},io:{input:r({name:"ApproveRejectInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1},decision:{type:m,isOptional:!1},comment:{type:$.String_unsecure(),isOptional:!0},data:{type:$.JSON(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.decided",version:"1.0.0",when:"Decision is made",payload:b}],audit:["workflow.approval.decided"]},acceptance:{scenarios:[{key:"approve-request-happy-path",given:["Approval request is pending","User is assignee"],when:["User approves request"],then:["Request is approved","ApprovalDecided event is emitted"]}],examples:[{key:"approve-basic",input:{requestId:"req-123",decision:"approve",comment:"Looks good"},output:{id:"req-123",status:"approved"}}]}}),CA=K0({meta:{key:"workflow.approval.delegate",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","delegate"],description:"Delegate an approval request to another user.",goal:"Allow approvers to pass approval to others.",context:"Approval inbox."},io:{input:r({name:"DelegateInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1},delegateTo:{type:$.String_unsecure(),isOptional:!1},reason:{type:$.String_unsecure(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.delegated",version:"1.0.0",when:"Approval is delegated",payload:b}],audit:["workflow.approval.delegated"]},acceptance:{scenarios:[{key:"delegate-approval-happy-path",given:["Approval request is pending","User is assignee"],when:["User delegates to another user"],then:["Assignee is updated","ApprovalDelegated event is emitted"]}],examples:[{key:"delegate-to-manager",input:{requestId:"req-123",delegateTo:"user-456",reason:"Out of office"},output:{id:"req-123",assigneeId:"user-456"}}]}}),NA=K0({meta:{key:"workflow.approval.comment.add",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","comment"],description:"Add a comment to an approval request.",goal:"Allow discussion on approval requests.",context:"Approval detail view."},io:{input:r({name:"AddCommentInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1},content:{type:$.NonEmptyString(),isOptional:!1},isInternal:{type:$.Boolean(),isOptional:!0}}}),output:_0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.comment.added",version:"1.0.0",when:"Comment is added",payload:_0}]},acceptance:{scenarios:[{key:"add-comment-happy-path",given:["Approval request exists"],when:["User adds a comment"],then:["Comment is added","CommentAdded event is emitted"]}],examples:[{key:"add-question",input:{requestId:"req-123",content:"Can you clarify budget?",isInternal:!1},output:{id:"com-789",content:"Can you clarify budget?"}}]}}),GA=E0({meta:{key:"workflow.approval.list.mine",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","list","inbox"],description:"List approval requests assigned to current user.",goal:"Show pending approvals in user inbox.",context:"Approval inbox, dashboard widget."},io:{input:r({name:"ListMyApprovalsInput",fields:{status:{type:y,isOptional:!0},limit:{type:$.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:$.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:r({name:"ListMyApprovalsOutput",fields:{requests:{type:b,isArray:!0,isOptional:!1},total:{type:$.Int_unsecure(),isOptional:!1},pendingCount:{type:$.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-approvals-happy-path",given:["User has assigned approvals"],when:["User lists approvals"],then:["List of requests is returned"]}],examples:[{key:"list-pending",input:{status:"pending",limit:10},output:{requests:[],total:2,pendingCount:2}}]}}),UA=E0({meta:{key:"workflow.approval.get",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","get"],description:"Get an approval request with details.",goal:"View approval request details.",context:"Approval detail view."},io:{input:r({name:"GetApprovalInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1}}}),output:b},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-approval-happy-path",given:["Approval request exists"],when:["User requests approval details"],then:["Approval details are returned"]}],examples:[{key:"get-basic",input:{requestId:"req-123"},output:{id:"req-123",status:"pending"}}]}});import{web as FA}from"@contractspec/lib.runtime-sandbox";var{generateId:S}=FA;function p0(A){return{id:A.id,projectId:A.projectId,organizationId:A.organizationId,name:A.name,description:A.description??void 0,type:A.type,status:A.status,createdAt:new Date(A.createdAt),updatedAt:new Date(A.updatedAt)}}function y0(A){return{id:A.id,definitionId:A.definitionId,name:A.name,description:A.description??void 0,stepOrder:A.stepOrder,type:A.type,requiredRoles:A.requiredRoles?JSON.parse(A.requiredRoles):[],autoApproveCondition:A.autoApproveCondition??void 0,timeoutHours:A.timeoutHours??void 0,createdAt:new Date(A.createdAt)}}function D0(A){return{id:A.id,projectId:A.projectId,definitionId:A.definitionId,status:A.status,currentStepId:A.currentStepId??void 0,data:A.data?JSON.parse(A.data):void 0,requestedBy:A.requestedBy,startedAt:new Date(A.startedAt),completedAt:A.completedAt?new Date(A.completedAt):void 0}}function JA(A){return{id:A.id,instanceId:A.instanceId,stepId:A.stepId,status:A.status,actorId:A.actorId??void 0,comment:A.comment??void 0,decidedAt:A.decidedAt?new Date(A.decidedAt):void 0,createdAt:new Date(A.createdAt)}}function sg(A){function _(L){let F=0;return L.replace(/\?/g,()=>`$${++F}`)}async function g(L,F=[]){return(await A.query(_(L),F)).rows}async function R(L,F=[]){await A.execute(_(L),F)}async function O(L){let{projectId:F,status:N,search:Y,limit:X=20,offset:q=0}=L,W='WHERE "projectId" = ?',d=[F];if(N&&N!=="all")W+=" AND status = ?",d.push(N);if(Y)W+=" AND name LIKE ?",d.push(`%${Y}%`);let j0=(await g(`SELECT COUNT(*) as count FROM workflow_definition ${W}`,d))[0]?.count??0;return{definitions:(await g(`SELECT * FROM workflow_definition ${W} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`,[...d,X,q])).map(p0),total:j0}}async function P(L,F){let N=S("wfdef"),Y=new Date().toISOString();await R(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
2
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N,F.projectId,F.organizationId,L.name,L.description??null,L.type??"APPROVAL","DRAFT",Y,Y]);let
|
|
3
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[F,L.definitionId,L.name,L.description??null
|
|
1
|
+
import{defineEnum as r0}from"@contractspec/lib.schema";var y=r0("ApprovalStatus",["PENDING","APPROVED","REJECTED","DELEGATED","ESCALATED","WITHDRAWN","EXPIRED"]),o=r0("ApprovalDecision",["APPROVE","REJECT","REQUEST_CHANGES","DELEGATE","ABSTAIN"]);import{defineEvent as A0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as g0,ScalarTypeEnum as J}from"@contractspec/lib.schema";var gA=g0({name:"ApprovalRequestedEventPayload",description:"Payload when approval is requested",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},workflowKey:{type:J.String_unsecure(),isOptional:!1},approverId:{type:J.String_unsecure(),isOptional:!1},approverRole:{type:J.String_unsecure(),isOptional:!0},title:{type:J.String_unsecure(),isOptional:!1},dueAt:{type:J.DateTime(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),_A=g0({name:"ApprovalDecidedEventPayload",description:"Payload when approval decision is made",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},decision:{type:J.String_unsecure(),isOptional:!1},decidedBy:{type:J.String_unsecure(),isOptional:!1},comment:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),DA=g0({name:"ApprovalDelegatedEventPayload",description:"Payload when approval is delegated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},fromUserId:{type:J.String_unsecure(),isOptional:!1},toUserId:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),RA=g0({name:"ApprovalEscalatedEventPayload",description:"Payload when approval is escalated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},escalationLevel:{type:J.Int_unsecure(),isOptional:!1},escalatedTo:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!1},timestamp:{type:J.DateTime(),isOptional:!1}}}),LA=A0({meta:{key:"workflow.approval.requested",version:"1.0.0",description:"An approval has been requested.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","requested"]},payload:gA}),ZA=A0({meta:{key:"workflow.approval.decided",version:"1.0.0",description:"An approval decision has been made.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","decided"]},payload:_A}),OA=A0({meta:{key:"workflow.approval.delegated",version:"1.0.0",description:"An approval has been delegated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","delegated"]},payload:DA}),IA=A0({meta:{key:"workflow.approval.escalated",version:"1.0.0",description:"An approval has been escalated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","escalated"]},payload:RA});var Wg={workflows:new Map,steps:new Map,instances:new Map,approvals:new Map,stepExecutions:new Map};class w0{canTransition(A,_,g,R){if(_.status!=="RUNNING"&&_.status!=="WAITING")return{allowed:!1,reason:`Workflow is ${_.status}, cannot transition`};let O=A.steps[_.currentStepKey];if(!O)return{allowed:!1,reason:`Step ${_.currentStepKey} not found`};let P=O.transitions[g];if(!P)return{allowed:!1,reason:`Action ${g} not available in step ${_.currentStepKey}`};if(O.allowedRoles&&O.allowedRoles.length>0){if(!O.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:"User lacks required role for this action"}}if(typeof P==="object"&&P.allowedRoles&&P.allowedRoles.length>0){if(!P.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:`User lacks required role for action ${g}`}}return{allowed:!0}}getAvailableActions(A,_,g){if(_.status!=="RUNNING"&&_.status!=="WAITING")return[];let R=A.steps[_.currentStepKey];if(!R)return[];return Object.keys(R.transitions).filter((O)=>{return this.canTransition(A,_,O,g).allowed})}transition(A,_,g,R){let O=this.canTransition(A,_,g,R);if(!O.allowed)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:O.reason};let P=A.steps[_.currentStepKey];if(!P)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Current step ${_.currentStepKey} not found`};let Z=P.transitions[g];if(!Z)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Transition for action ${g} not found`};let D=typeof Z==="string"?Z:Z.targetStepKey,H=A.steps[D];if(!H)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Target step ${D} not found`};let G="RUNNING";if(H.type==="END")G="COMPLETED";else if(H.type==="APPROVAL"||H.type==="WAIT")G="WAITING";return{success:!0,previousStepKey:_.currentStepKey,currentStepKey:D,status:G}}evaluateCondition(A,_){try{let g=A.match(/^(\w+)\s*(>=|<=|>|<|===|!==|==|!=)\s*(.+)$/);if(g){let[,R,O,P]=g;if(!R||!O||P===void 0)return!1;let Z=_[R],D=JSON.parse(P);switch(O){case">":return Number(Z)>Number(D);case"<":return Number(Z)<Number(D);case">=":return Number(Z)>=Number(D);case"<=":return Number(Z)<=Number(D);case"===":case"==":return Z===D;case"!==":case"!=":return Z!==D}}if(A in _)return Boolean(_[A]);return!1}catch{return!1}}}function bg(){return new w0}function xg(A,_){let g={};for(let P of _)g[P.key]={key:P.key,name:P.name,type:P.type,transitions:P.transitions,approvalMode:P.approvalMode,allowedRoles:P.approverRoles,timeoutSeconds:P.timeoutSeconds,conditionExpression:P.conditionExpression};let O=_.find((P)=>P.type==="START")?.key??_[0]?.key??"";return{key:A.key,name:A.name,version:A.version,initialStepKey:O,steps:g}}function Mg(A,_={}){return{currentStepKey:A.initialStepKey,status:"RUNNING",contextData:_,history:[]}}import{defineSchemaModel as T0,ScalarTypeEnum as X}from"@contractspec/lib.schema";var b=T0({name:"ApprovalRequestModel",description:"An approval request",fields:{id:{type:X.String_unsecure(),isOptional:!1},workflowInstanceId:{type:X.String_unsecure(),isOptional:!1},stepExecutionId:{type:X.String_unsecure(),isOptional:!1},approverId:{type:X.String_unsecure(),isOptional:!1},approverRole:{type:X.String_unsecure(),isOptional:!0},title:{type:X.String_unsecure(),isOptional:!1},description:{type:X.String_unsecure(),isOptional:!0},status:{type:y,isOptional:!1},decision:{type:o,isOptional:!0},decisionComment:{type:X.String_unsecure(),isOptional:!0},decidedAt:{type:X.DateTime(),isOptional:!0},dueAt:{type:X.DateTime(),isOptional:!0},contextSnapshot:{type:X.JSON(),isOptional:!0},sequenceOrder:{type:X.Int_unsecure(),isOptional:!1},createdAt:{type:X.DateTime(),isOptional:!1}}}),_0=T0({name:"ApprovalCommentModel",description:"A comment on an approval",fields:{id:{type:X.String_unsecure(),isOptional:!1},approvalRequestId:{type:X.String_unsecure(),isOptional:!1},authorId:{type:X.String_unsecure(),isOptional:!1},content:{type:X.String_unsecure(),isOptional:!1},isInternal:{type:X.Boolean(),isOptional:!1},createdAt:{type:X.DateTime(),isOptional:!1}}});import{defineCommand as K0,defineQuery as E0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as r,ScalarTypeEnum as k}from"@contractspec/lib.schema";var m=["@example.workflow-system"],PA=K0({meta:{key:"workflow.approval.decide",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","decision"],description:"Submit an approval decision (approve/reject).",goal:"Allow approvers to make decisions on requests.",context:"Approval inbox, workflow detail."},io:{input:r({name:"ApproveRejectInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1},decision:{type:o,isOptional:!1},comment:{type:k.String_unsecure(),isOptional:!0},data:{type:k.JSON(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.decided",version:"1.0.0",when:"Decision is made",payload:b}],audit:["workflow.approval.decided"]},acceptance:{scenarios:[{key:"approve-request-happy-path",given:["Approval request is pending","User is assignee"],when:["User approves request"],then:["Request is approved","ApprovalDecided event is emitted"]}],examples:[{key:"approve-basic",input:{requestId:"req-123",decision:"approve",comment:"Looks good"},output:{id:"req-123",status:"approved"}}]}}),CA=K0({meta:{key:"workflow.approval.delegate",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","delegate"],description:"Delegate an approval request to another user.",goal:"Allow approvers to pass approval to others.",context:"Approval inbox."},io:{input:r({name:"DelegateInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1},delegateTo:{type:k.String_unsecure(),isOptional:!1},reason:{type:k.String_unsecure(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.delegated",version:"1.0.0",when:"Approval is delegated",payload:b}],audit:["workflow.approval.delegated"]},acceptance:{scenarios:[{key:"delegate-approval-happy-path",given:["Approval request is pending","User is assignee"],when:["User delegates to another user"],then:["Assignee is updated","ApprovalDelegated event is emitted"]}],examples:[{key:"delegate-to-manager",input:{requestId:"req-123",delegateTo:"user-456",reason:"Out of office"},output:{id:"req-123",assigneeId:"user-456"}}]}}),NA=K0({meta:{key:"workflow.approval.comment.add",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","comment"],description:"Add a comment to an approval request.",goal:"Allow discussion on approval requests.",context:"Approval detail view."},io:{input:r({name:"AddCommentInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1},content:{type:k.NonEmptyString(),isOptional:!1},isInternal:{type:k.Boolean(),isOptional:!0}}}),output:_0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.comment.added",version:"1.0.0",when:"Comment is added",payload:_0}]},acceptance:{scenarios:[{key:"add-comment-happy-path",given:["Approval request exists"],when:["User adds a comment"],then:["Comment is added","CommentAdded event is emitted"]}],examples:[{key:"add-question",input:{requestId:"req-123",content:"Can you clarify budget?",isInternal:!1},output:{id:"com-789",content:"Can you clarify budget?"}}]}}),GA=E0({meta:{key:"workflow.approval.list.mine",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","list","inbox"],description:"List approval requests assigned to current user.",goal:"Show pending approvals in user inbox.",context:"Approval inbox, dashboard widget."},io:{input:r({name:"ListMyApprovalsInput",fields:{status:{type:y,isOptional:!0},limit:{type:k.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:k.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:r({name:"ListMyApprovalsOutput",fields:{requests:{type:b,isArray:!0,isOptional:!1},total:{type:k.Int_unsecure(),isOptional:!1},pendingCount:{type:k.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-approvals-happy-path",given:["User has assigned approvals"],when:["User lists approvals"],then:["List of requests is returned"]}],examples:[{key:"list-pending",input:{status:"pending",limit:10},output:{requests:[],total:2,pendingCount:2}}]}}),UA=E0({meta:{key:"workflow.approval.get",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","get"],description:"Get an approval request with details.",goal:"View approval request details.",context:"Approval detail view."},io:{input:r({name:"GetApprovalInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1}}}),output:b},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-approval-happy-path",given:["Approval request exists"],when:["User requests approval details"],then:["Approval details are returned"]}],examples:[{key:"get-basic",input:{requestId:"req-123"},output:{id:"req-123",status:"pending"}}]}});import{defineExample as FA}from"@contractspec/lib.contracts-spec/examples";var JA=FA({meta:{key:"workflow-system",version:"1.0.0",title:"Workflow System",description:"Workflow and approval system example for ContractSpec - State machine with role-based transitions",kind:"template",visibility:"public",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","workflow-system"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.workflow-system"}}),ig=JA;import{web as VA}from"@contractspec/lib.runtime-sandbox";var{generateId:S}=VA;function p0(A){return{id:A.id,projectId:A.projectId,organizationId:A.organizationId,name:A.name,description:A.description??void 0,type:A.type,status:A.status,createdAt:new Date(A.createdAt),updatedAt:new Date(A.updatedAt)}}function y0(A){return{id:A.id,definitionId:A.definitionId,name:A.name,description:A.description??void 0,stepOrder:A.stepOrder,type:A.type,requiredRoles:A.requiredRoles?JSON.parse(A.requiredRoles):[],autoApproveCondition:A.autoApproveCondition??void 0,timeoutHours:A.timeoutHours??void 0,createdAt:new Date(A.createdAt)}}function D0(A){return{id:A.id,projectId:A.projectId,definitionId:A.definitionId,status:A.status,currentStepId:A.currentStepId??void 0,data:A.data?JSON.parse(A.data):void 0,requestedBy:A.requestedBy,startedAt:new Date(A.startedAt),completedAt:A.completedAt?new Date(A.completedAt):void 0}}function HA(A){return{id:A.id,instanceId:A.instanceId,stepId:A.stepId,status:A.status,actorId:A.actorId??void 0,comment:A.comment??void 0,decidedAt:A.decidedAt?new Date(A.decidedAt):void 0,createdAt:new Date(A.createdAt)}}function eg(A){function _(L){let F=0;return L.replace(/\?/g,()=>`$${++F}`)}async function g(L,F=[]){return(await A.query(_(L),F)).rows}async function R(L,F=[]){await A.execute(_(L),F)}async function O(L){let{projectId:F,status:N,search:Y,limit:$=20,offset:q=0}=L,W='WHERE "projectId" = ?',d=[F];if(N&&N!=="all")W+=" AND status = ?",d.push(N);if(Y)W+=" AND name LIKE ?",d.push(`%${Y}%`);let j0=(await g(`SELECT COUNT(*) as count FROM workflow_definition ${W}`,d))[0]?.count??0;return{definitions:(await g(`SELECT * FROM workflow_definition ${W} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`,[...d,$,q])).map(p0),total:j0}}async function P(L,F){let N=S("wfdef"),Y=new Date().toISOString();await R(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
2
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N,F.projectId,F.organizationId,L.name,L.description??null,L.type??"APPROVAL","DRAFT",Y,Y]);let $=await g("SELECT * FROM workflow_definition WHERE id = ?",[N]);return p0($[0])}async function Z(L){let F=S("wfstep"),N=new Date().toISOString(),$=((await g('SELECT MAX("stepOrder") as maxOrder FROM workflow_step WHERE "definitionId" = ?',[L.definitionId]))[0]?.maxOrder??0)+1;await R(`INSERT INTO workflow_step (id, "definitionId", name, description, "stepOrder", type, "requiredRoles", "autoApproveCondition", "timeoutHours", "createdAt")
|
|
3
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[F,L.definitionId,L.name,L.description??null,$,L.type??"APPROVAL",JSON.stringify(L.requiredRoles),L.autoApproveCondition??null,L.timeoutHours??null,N]);let q=await g("SELECT * FROM workflow_step WHERE id = ?",[F]);return y0(q[0])}async function D(L){return(await g('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder"',[L])).map(y0)}async function H(L){let{projectId:F,definitionId:N,status:Y,requestedBy:$,limit:q=20,offset:W=0}=L,d='WHERE "projectId" = ?',f=[F];if(N)d+=' AND "definitionId" = ?',f.push(N);if(Y&&Y!=="all")d+=" AND status = ?",f.push(Y);if($)d+=' AND "requestedBy" = ?',f.push($);let f0=(await g(`SELECT COUNT(*) as count FROM workflow_instance ${d}`,f))[0]?.count??0;return{instances:(await g(`SELECT * FROM workflow_instance ${d} ORDER BY "startedAt" DESC LIMIT ? OFFSET ?`,[...f,q,W])).map(D0),total:f0}}async function G(L,F){let N=S("wfinst"),Y=new Date().toISOString(),q=(await g('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder" LIMIT 1',[L.definitionId]))[0]?.id??null;if(await R(`INSERT INTO workflow_instance (id, "projectId", "definitionId", status, "currentStepId", data, "requestedBy", "startedAt")
|
|
4
4
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[N,F.projectId,L.definitionId,q?"IN_PROGRESS":"PENDING",q,L.data?JSON.stringify(L.data):null,F.requestedBy,Y]),q)await R(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
5
|
-
VALUES (?, ?, ?, ?, ?)`,[S("wfappr"),N,q,"PENDING",Y]);let W=await g("SELECT * FROM workflow_instance WHERE id = ?",[N]);return D0(W[0])}async function n(L,F){let N=new Date().toISOString(),Y=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);if(!Y[0])throw Error("NOT_FOUND");let
|
|
6
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.comment??null,N,L.instanceId
|
|
5
|
+
VALUES (?, ?, ?, ?, ?)`,[S("wfappr"),N,q,"PENDING",Y]);let W=await g("SELECT * FROM workflow_instance WHERE id = ?",[N]);return D0(W[0])}async function n(L,F){let N=new Date().toISOString(),Y=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);if(!Y[0])throw Error("NOT_FOUND");let $=Y[0];await R(`UPDATE workflow_approval SET status = 'APPROVED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
6
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.comment??null,N,L.instanceId,$.currentStepId]);let q=await g("SELECT * FROM workflow_step WHERE id = ?",[$.currentStepId]),W=await g('SELECT * FROM workflow_step WHERE "definitionId" = ? AND "stepOrder" > ? ORDER BY "stepOrder" LIMIT 1',[$.definitionId,q[0]?.stepOrder??0]);if(W[0])await R('UPDATE workflow_instance SET "currentStepId" = ? WHERE id = ?',[W[0].id,L.instanceId]),await R(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
7
7
|
VALUES (?, ?, ?, ?, ?)`,[S("wfappr"),L.instanceId,W[0].id,"PENDING",N]);else await R(`UPDATE workflow_instance SET status = 'COMPLETED', "currentStepId" = NULL, "completedAt" = ? WHERE id = ?`,[N,L.instanceId]);let d=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);return D0(d[0])}async function Y0(L,F){let N=new Date().toISOString(),Y=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);if(!Y[0])throw Error("NOT_FOUND");await R(`UPDATE workflow_approval SET status = 'REJECTED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
8
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.reason,N,L.instanceId,Y[0].currentStepId]),await R(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`,[N,L.instanceId]);let X=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);return D0(X[0])}async function a(L){return(await g('SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"',[L])).map(JA)}return{listDefinitions:O,createDefinition:P,addStep:Z,getSteps:D,listInstances:H,startInstance:G,approveStep:n,rejectStep:Y0,getApprovals:a}}import{defineEnum as VA}from"@contractspec/lib.schema";var t=VA("InstanceStatus",["PENDING","RUNNING","WAITING","PAUSED","COMPLETED","CANCELLED","FAILED","TIMEOUT"]);import{defineEvent as h}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as k0,ScalarTypeEnum as V}from"@contractspec/lib.schema";var w=k0({name:"InstanceEventPayload",description:"Base payload for instance events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},status:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},triggeredBy:{type:V.String_unsecure(),isOptional:!1},organizationId:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),m0=k0({name:"StepTransitionEventPayload",description:"Payload for step transition events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},fromStepKey:{type:V.String_unsecure(),isOptional:!0},toStepKey:{type:V.String_unsecure(),isOptional:!1},action:{type:V.String_unsecure(),isOptional:!0},executedBy:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),HA=k0({name:"InstanceCompletedEventPayload",description:"Payload when instance completes",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},outcome:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},duration:{type:V.Int_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),YA=h({meta:{key:"workflow.instance.started",version:"1.0.0",description:"A new workflow instance has been started.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","started"]},payload:w}),KA=h({meta:{key:"workflow.step.entered",version:"1.0.0",description:"A workflow instance has entered a new step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","entered"]},payload:m0}),kA=h({meta:{key:"workflow.step.exited",version:"1.0.0",description:"A workflow instance has exited a step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","exited"]},payload:m0}),XA=h({meta:{key:"workflow.instance.completed",version:"1.0.0",description:"A workflow instance has completed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","completed"]},payload:HA}),$A=h({meta:{key:"workflow.instance.cancelled",version:"1.0.0",description:"A workflow instance has been cancelled.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","cancelled"]},payload:w}),QA=h({meta:{key:"workflow.instance.paused",version:"1.0.0",description:"A workflow instance has been paused.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","paused"]},payload:w}),BA=h({meta:{key:"workflow.instance.resumed",version:"1.0.0",description:"A workflow instance has been resumed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","resumed"]},payload:w}),vA=h({meta:{key:"workflow.instance.failed",version:"1.0.0",description:"A workflow instance has failed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","failed"]},payload:w}),zA=h({meta:{key:"workflow.instance.timedOut",version:"1.0.0",description:"A workflow instance has timed out.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","timeout"]},payload:w});import{defineSchemaModel as R0,ScalarTypeEnum as U}from"@contractspec/lib.schema";var K=R0({name:"WorkflowInstanceModel",description:"A running workflow instance",fields:{id:{type:U.String_unsecure(),isOptional:!1},workflowDefinitionId:{type:U.String_unsecure(),isOptional:!1},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!1},currentStepId:{type:U.String_unsecure(),isOptional:!0},contextData:{type:U.JSON(),isOptional:!0},triggeredBy:{type:U.String_unsecure(),isOptional:!1},organizationId:{type:U.String_unsecure(),isOptional:!1},priority:{type:U.Int_unsecure(),isOptional:!1},dueAt:{type:U.DateTime(),isOptional:!0},outcome:{type:U.String_unsecure(),isOptional:!0},resultData:{type:U.JSON(),isOptional:!0},errorMessage:{type:U.String_unsecure(),isOptional:!0},createdAt:{type:U.DateTime(),isOptional:!1},startedAt:{type:U.DateTime(),isOptional:!0},completedAt:{type:U.DateTime(),isOptional:!0}}}),X0=R0({name:"StartWorkflowInput",description:"Input for starting a workflow",fields:{workflowKey:{type:U.NonEmptyString(),isOptional:!1},contextData:{type:U.JSON(),isOptional:!0},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},priority:{type:U.Int_unsecure(),isOptional:!0},dueAt:{type:U.DateTime(),isOptional:!0}}}),$0=R0({name:"TransitionInput",description:"Input for transitioning a workflow",fields:{instanceId:{type:U.String_unsecure(),isOptional:!1},action:{type:U.NonEmptyString(),isOptional:!1},data:{type:U.JSON(),isOptional:!0},comment:{type:U.String_unsecure(),isOptional:!0}}}),Q0=R0({name:"TransitionResult",description:"Result of a workflow transition",fields:{success:{type:U.Boolean(),isOptional:!1},instance:{type:K,isOptional:!1},previousStepKey:{type:U.String_unsecure(),isOptional:!0},currentStepKey:{type:U.String_unsecure(),isOptional:!0},message:{type:U.String_unsecure(),isOptional:!0}}});import{defineCommand as s,defineQuery as o0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as T,ScalarTypeEnum as Q}from"@contractspec/lib.schema";var j=["@example.workflow-system"],qA=s({meta:{key:"workflow.instance.start",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","start"],description:"Start a new workflow instance.",goal:"Initiate a workflow for a business process.",context:"Order creation, request submission, etc."},io:{input:X0,output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.started",version:"1.0.0",when:"Workflow starts",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"First step entered",payload:K}],audit:["workflow.instance.started"]},acceptance:{scenarios:[{key:"start-workflow-happy-path",given:["Workflow definition exists"],when:["User starts workflow"],then:["Instance is created and started"]}],examples:[{key:"start-onboarding",input:{workflowKey:"onboarding-v1",context:{employeeId:"emp-123"}},output:{id:"inst-456",status:"running"}}]}}),WA=s({meta:{key:"workflow.instance.transition",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","transition","state-machine"],description:"Transition a workflow instance to the next step.",goal:"Move workflow forward based on action.",context:"Task completion, approval decisions."},io:{input:$0,output:Q0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.exited",version:"1.0.0",when:"Step is exited",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"New step is entered",payload:K},{key:"workflow.instance.completed",version:"1.0.0",when:"Workflow reaches end",payload:K}],audit:["workflow.instance.transitioned"]},acceptance:{scenarios:[{key:"transition-workflow-happy-path",given:["Workflow instance is waiting at step"],when:["User provides input"],then:["Instance moves to next step"]}],examples:[{key:"complete-task",input:{instanceId:"inst-456",action:"complete",data:{approved:!0}},output:{success:!0,nextStep:"notify-hr"}}]}}),dA=s({meta:{key:"workflow.instance.pause",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","pause"],description:"Pause a running workflow instance.",goal:"Temporarily halt workflow execution.",context:"Administrative action, emergency stop."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.paused",version:"1.0.0",when:"Workflow is paused",payload:K}],audit:["workflow.instance.paused"]},acceptance:{scenarios:[{key:"pause-workflow-happy-path",given:["Workflow is running"],when:["Admin pauses workflow"],then:["Instance status becomes PAUSED"]}],examples:[{key:"pause-maintenance",input:{instanceId:"inst-456",reason:"System maintenance"},output:{id:"inst-456",status:"paused"}}]}}),bA=s({meta:{key:"workflow.instance.resume",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","resume"],description:"Resume a paused workflow instance.",goal:"Continue workflow execution.",context:"Administrative action."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.resumed",version:"1.0.0",when:"Workflow is resumed",payload:K}],audit:["workflow.instance.resumed"]},acceptance:{scenarios:[{key:"resume-workflow-happy-path",given:["Workflow is paused"],when:["Admin resumes workflow"],then:["Instance status becomes RUNNING"]}],examples:[{key:"resume-normal",input:{instanceId:"inst-456",reason:"Issue resolved"},output:{id:"inst-456",status:"running"}}]}}),xA=s({meta:{key:"workflow.instance.cancel",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","cancel"],description:"Cancel a workflow instance.",goal:"Terminate workflow without completion.",context:"User request, system cancellation."},io:{input:T({name:"CancelWorkflowInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.cancelled",version:"1.0.0",when:"Workflow is cancelled",payload:K}],audit:["workflow.instance.cancelled"]},acceptance:{scenarios:[{key:"cancel-workflow-happy-path",given:["Workflow is running"],when:["User cancels workflow"],then:["Instance status becomes CANCELLED"]}],examples:[{key:"cancel-mistake",input:{instanceId:"inst-456",reason:"Created by mistake"},output:{id:"inst-456",status:"cancelled"}}]}}),MA=o0({meta:{key:"workflow.instance.list",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","list"],description:"List workflow instances with filtering.",goal:"Browse and search running workflows.",context:"Dashboard, monitoring."},io:{input:T({name:"ListInstancesInput",fields:{workflowKey:{type:Q.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!0},referenceType:{type:Q.String_unsecure(),isOptional:!0},referenceId:{type:Q.String_unsecure(),isOptional:!0},triggeredBy:{type:Q.String_unsecure(),isOptional:!0},limit:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:T({name:"ListInstancesOutput",fields:{instances:{type:K,isArray:!0,isOptional:!1},total:{type:Q.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-instances-happy-path",given:["Workflow instances exist"],when:["User lists instances"],then:["List of instances is returned"]}],examples:[{key:"list-running",input:{status:"running",limit:10},output:{instances:[],total:5}}]}}),hA=o0({meta:{key:"workflow.instance.get",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","get"],description:"Get a workflow instance with details.",goal:"View workflow instance details.",context:"Instance detail view."},io:{input:T({name:"GetInstanceInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-instance-happy-path",given:["Instance exists"],when:["User requests instance details"],then:["Instance details are returned"]}],examples:[{key:"get-details",input:{instanceId:"inst-456"},output:{id:"inst-456",workflowKey:"onboarding-v1"}}]}});import{defineEnum as L0}from"@contractspec/lib.schema";var c=L0("WorkflowStatus",["DRAFT","ACTIVE","DEPRECATED","ARCHIVED"]),u=L0("WorkflowTriggerType",["MANUAL","EVENT","SCHEDULED","API"]),Z0=L0("StepType",["START","APPROVAL","TASK","CONDITION","PARALLEL","WAIT","ACTION","END"]),O0=L0("ApprovalMode",["ANY","ALL","MAJORITY","SEQUENTIAL"]);import{defineSchemaModel as i,ScalarTypeEnum as I}from"@contractspec/lib.schema";var l=i({name:"WorkflowStepModel",description:"A step in a workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!1},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0}}}),B=i({name:"WorkflowDefinitionModel",description:"A workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},version:{type:I.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1},triggerType:{type:u,isOptional:!1},initialStepId:{type:I.String_unsecure(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},organizationId:{type:I.String_unsecure(),isOptional:!1},createdAt:{type:I.DateTime(),isOptional:!1},updatedAt:{type:I.DateTime(),isOptional:!1},steps:{type:l,isArray:!0,isOptional:!0}}}),B0=i({name:"CreateWorkflowInput",description:"Input for creating a workflow definition",fields:{name:{type:I.NonEmptyString(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),v0=i({name:"UpdateWorkflowInput",description:"Input for updating a workflow definition",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!0},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),z0=i({name:"AddStepInput",description:"Input for adding a step to a workflow",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!0},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0},approverUserIds:{type:I.String_unsecure(),isArray:!0,isOptional:!0},timeoutSeconds:{type:I.Int_unsecure(),isOptional:!0},slaSeconds:{type:I.Int_unsecure(),isOptional:!0}}});import{definePresentation as x,StabilityEnum as M}from"@contractspec/lib.contracts-spec";var jA=x({meta:{key:"workflow.designer",version:"1.0.0",title:"Workflow Designer",description:"Visual workflow designer with drag-and-drop steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","designer","admin"],stability:M.Experimental,goal:"Building and modifying workflow definitions",context:"Workflow administration and setup"},source:{type:"component",framework:"react",componentKey:"WorkflowDesigner",props:B},targets:["react"],policy:{flags:["workflow.designer.enabled"]}}),fA=x({meta:{key:"workflow.definition.viewList",version:"1.0.0",title:"Workflow List",description:"List of workflow definitions with status and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","list","admin"],stability:M.Experimental,goal:"Overview of all defined workflows",context:"Workflow management dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionList",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),rA=x({meta:{key:"workflow.definition.detail",version:"1.0.0",title:"Workflow Details",description:"Detailed view of a workflow definition with steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","detail"],stability:M.Experimental,goal:"Viewing technical details of a workflow definition",context:"Workflow inspection and debugging"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionDetail",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),wA=x({meta:{key:"workflow.instance.viewList",version:"1.0.0",title:"Instance List",description:"List of workflow instances with status and progress",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","list"],stability:M.Experimental,goal:"Monitoring active and past workflow executions",context:"Operations monitoring"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceList",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),TA=x({meta:{key:"workflow.instance.detail",version:"1.0.0",title:"Instance Details",description:"Detailed view of a workflow instance with step timeline",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","detail","timeline"],stability:M.Experimental,goal:"Detailed inspection of a specific workflow instance",context:"Case management and troubleshooting"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceDetail",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),EA=x({meta:{key:"workflow.instance.progress",version:"1.0.0",title:"Progress Tracker",description:"Visual progress tracker showing current step in workflow",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","progress","widget"],stability:M.Experimental,goal:"Quick view of current progress for a workflow",context:"Embedded progress indicator in entity views"},source:{type:"component",framework:"react",componentKey:"WorkflowProgressTracker",props:K},targets:["react"],policy:{flags:["workflow.enabled"]}}),pA=x({meta:{key:"workflow.approval.inbox",version:"1.0.0",title:"Approval Inbox",description:"Inbox showing pending approval requests for current user",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","inbox"],stability:M.Experimental,goal:"Managing personal workload of approval requests",context:"Personal task management"},source:{type:"component",framework:"react",componentKey:"ApprovalInbox",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),yA=x({meta:{key:"workflow.approval.detail",version:"1.0.0",title:"Approval Details",description:"Detailed approval request view with context and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","detail"],stability:M.Experimental,goal:"Decision support for an approval request",context:"Specific approval action"},source:{type:"component",framework:"react",componentKey:"ApprovalRequestDetail",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),mA=x({meta:{key:"workflow.approval.form",version:"1.0.0",title:"Approval Form",description:"Form for submitting approval decisions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","form"],stability:M.Experimental,goal:"Submitting a decision on an approval request",context:"Approval decision dialog"},source:{type:"component",framework:"react",componentKey:"ApprovalDecisionForm"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),oA=x({meta:{key:"workflow.approval.badge",version:"1.0.0",title:"Pending Approvals Badge",description:"Badge showing count of pending approvals",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","badge","widget"],stability:M.Experimental,goal:"Visual notification of pending approvals",context:"Global navigation or sidebar"},source:{type:"component",framework:"react",componentKey:"PendingApprovalsBadge"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),SA=x({meta:{key:"workflow.metrics",version:"1.0.0",title:"Workflow Metrics",description:"Dashboard widget showing workflow metrics and statistics",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","metrics","dashboard"],stability:M.Experimental,goal:"Monitoring throughput and bottlenecks",context:"System performance dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowMetricsDashboard"},targets:["react","markdown"],policy:{flags:["workflow.metrics.enabled"]}}),X2={WorkflowDesignerPresentation:jA,WorkflowListPresentation:fA,WorkflowDetailPresentation:rA,InstanceListPresentation:wA,InstanceDetailPresentation:TA,ProgressTrackerPresentation:EA,ApprovalInboxPresentation:pA,ApprovalDetailPresentation:yA,ApprovalFormPresentation:mA,PendingApprovalsBadgePresentation:oA,WorkflowMetricsPresentation:SA};import{useTemplateRuntime as tA}from"@contractspec/lib.example-shared-ui";import{useCallback as sA,useEffect as cA,useState as I0}from"react";function q0(A){let{handlers:_,projectId:g}=tA(),R=A??g,O=_.workflow,[P,Z]=I0([]),[D,H]=I0([]),[G,n]=I0(!0),[Y0,a]=I0(null),L=sA(async()=>{try{n(!0),a(null);let[N,Y]=await Promise.all([O.listDefinitions({projectId:R,limit:100}),O.listInstances({projectId:R,limit:100})]);Z(N.definitions),H(Y.instances)}catch(N){a(N instanceof Error?N:Error("Failed to load workflows"))}finally{n(!1)}},[R,O]);cA(()=>{L()},[L]);let F={totalDefinitions:P.length,activeDefinitions:P.filter((N)=>N.status==="ACTIVE").length,totalInstances:D.length,pendingInstances:D.filter((N)=>N.status==="PENDING").length,inProgressInstances:D.filter((N)=>N.status==="IN_PROGRESS").length,completedInstances:D.filter((N)=>N.status==="COMPLETED").length,rejectedInstances:D.filter((N)=>N.status==="REJECTED").length};return{definitions:P,instances:D,loading:G,error:Y0,stats:F,refetch:L}}var x2="workflow-system-demo",M2="org_demo",S0=[{id:"wf_expense",name:"Expense Approval",description:"Approve non-trivial spend before finance releases budget.",type:"APPROVAL",status:"ACTIVE",createdAt:"2026-03-10T09:00:00.000Z",updatedAt:"2026-03-20T08:15:00.000Z",steps:[{id:"wfstep_expense_manager",name:"Manager Review",description:"Validate business value and team budget.",stepOrder:1,type:"APPROVAL",requiredRoles:["manager"],createdAt:"2026-03-10T09:00:00.000Z"},{id:"wfstep_expense_finance",name:"Finance Review",description:"Confirm ledger coding and spending threshold.",stepOrder:2,type:"APPROVAL",requiredRoles:["finance"],createdAt:"2026-03-10T09:10:00.000Z"}]},{id:"wf_vendor",name:"Vendor Onboarding",description:"Sequence security, procurement, and legal before activation.",type:"SEQUENTIAL",status:"ACTIVE",createdAt:"2026-03-08T11:00:00.000Z",updatedAt:"2026-03-19T13:10:00.000Z",steps:[{id:"wfstep_vendor_security",name:"Security Check",description:"Review data access and integration scope.",stepOrder:1,type:"APPROVAL",requiredRoles:["security"],createdAt:"2026-03-08T11:00:00.000Z"},{id:"wfstep_vendor_procurement",name:"Procurement Check",description:"Validate pricing, procurement policy, and owner.",stepOrder:2,type:"APPROVAL",requiredRoles:["procurement"],createdAt:"2026-03-08T11:05:00.000Z"},{id:"wfstep_vendor_legal",name:"Legal Sign-off",description:"Approve terms before the vendor goes live.",stepOrder:3,type:"APPROVAL",requiredRoles:["legal"],createdAt:"2026-03-08T11:10:00.000Z"}]},{id:"wf_policy_exception",name:"Policy Exception",description:"Escalate a temporary exception through team lead and compliance.",type:"APPROVAL",status:"DRAFT",createdAt:"2026-03-15T07:30:00.000Z",updatedAt:"2026-03-18T11:20:00.000Z",steps:[{id:"wfstep_policy_lead",name:"Team Lead Review",description:"Check urgency and expected blast radius.",stepOrder:1,type:"APPROVAL",requiredRoles:["team-lead"],createdAt:"2026-03-15T07:30:00.000Z"},{id:"wfstep_policy_compliance",name:"Compliance Review",description:"Accept or reject the exception request.",stepOrder:2,type:"APPROVAL",requiredRoles:["compliance"],createdAt:"2026-03-15T07:40:00.000Z"}]}],t0=[{id:"wfinst_expense_open",definitionId:"wf_expense",status:"IN_PROGRESS",currentStepId:"wfstep_expense_finance",data:{amount:4200,currency:"EUR",vendor:"Nimbus AI"},requestedBy:"sarah@contractspec.io",startedAt:"2026-03-20T08:00:00.000Z",approvals:[{id:"wfappr_expense_manager",stepId:"wfstep_expense_manager",status:"APPROVED",actorId:"manager.demo",comment:"Approved for the Q2 automation budget.",decidedAt:"2026-03-20T08:15:00.000Z",createdAt:"2026-03-20T08:05:00.000Z"},{id:"wfappr_expense_finance",stepId:"wfstep_expense_finance",status:"PENDING",createdAt:"2026-03-20T08:15:00.000Z"}]},{id:"wfinst_vendor_done",definitionId:"wf_vendor",status:"COMPLETED",data:{vendor:"Acme Cloud",riskTier:"medium"},requestedBy:"leo@contractspec.io",startedAt:"2026-03-19T09:30:00.000Z",completedAt:"2026-03-19T13:10:00.000Z",approvals:[{id:"wfappr_vendor_security",stepId:"wfstep_vendor_security",status:"APPROVED",actorId:"security.demo",comment:"SOC2 scope is acceptable.",decidedAt:"2026-03-19T10:10:00.000Z",createdAt:"2026-03-19T09:35:00.000Z"},{id:"wfappr_vendor_procurement",stepId:"wfstep_vendor_procurement",status:"APPROVED",actorId:"procurement.demo",comment:"Commercial terms match the preferred vendor tier.",decidedAt:"2026-03-19T11:25:00.000Z",createdAt:"2026-03-19T10:15:00.000Z"},{id:"wfappr_vendor_legal",stepId:"wfstep_vendor_legal",status:"APPROVED",actorId:"legal.demo",comment:"MSA redlines are complete.",decidedAt:"2026-03-19T13:05:00.000Z",createdAt:"2026-03-19T11:30:00.000Z"}]},{id:"wfinst_policy_rejected",definitionId:"wf_policy_exception",status:"REJECTED",currentStepId:"wfstep_policy_compliance",data:{policy:"Model rollout freeze",durationDays:14},requestedBy:"maya@contractspec.io",startedAt:"2026-03-18T10:00:00.000Z",completedAt:"2026-03-18T11:20:00.000Z",approvals:[{id:"wfappr_policy_lead",stepId:"wfstep_policy_lead",status:"APPROVED",actorId:"lead.demo",comment:"Escalation justified for the release train.",decidedAt:"2026-03-18T10:30:00.000Z",createdAt:"2026-03-18T10:05:00.000Z"},{id:"wfappr_policy_compliance",stepId:"wfstep_policy_compliance",status:"REJECTED",actorId:"compliance.demo",comment:"Exception exceeds the allowed blast radius.",decidedAt:"2026-03-18T11:15:00.000Z",createdAt:"2026-03-18T10:35:00.000Z"}]}];import{defineVisualization as P0,VisualizationRegistry as uA}from"@contractspec/lib.contracts-spec/visualizations";var C0={key:"workflow.instance.list",version:"1.0.0"},N0={version:"1.0.0",domain:"workflow",stability:"experimental",owners:["@example.workflow-system"],tags:["workflow","visualization","operations"]},W0=P0({meta:{...N0,key:"workflow-system.visualization.instance-status",title:"Instance Status Breakdown",description:"Distribution of workflow instance states.",goal:"Surface the current workload mix.",context:"Workflow operations overview."},source:{primary:C0,resultPath:"data"},visualization:{kind:"pie",nameDimension:"status",valueMeasure:"instances",dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number"}],table:{caption:"Workflow instance counts by status."}}}),d0=P0({meta:{...N0,key:"workflow-system.visualization.throughput",title:"Run Throughput",description:"Daily workflow instance starts.",goal:"Show operational throughput over time.",context:"Workflow trend monitoring."},source:{primary:C0,resultPath:"data"},visualization:{kind:"cartesian",variant:"line",xDimension:"day",yMeasures:["instances"],dimensions:[{key:"day",label:"Day",dataPath:"day",type:"time"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number",color:"#0f766e"}],table:{caption:"Daily workflow instance starts."}}}),b0=P0({meta:{...N0,key:"workflow-system.visualization.active-work",title:"Active Work",description:"Current in-flight or pending workflow instances.",goal:"Expose active operational workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Active workflow count."}}}),x0=P0({meta:{...N0,key:"workflow-system.visualization.completed-work",title:"Completed Work",description:"Completed workflow instances in the current sample.",goal:"Show output against active workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Completed workflow count."}}}),s0=[W0,d0,b0,x0],f2=new uA([...s0]),c0=s0.map((A)=>({key:A.meta.key,version:A.meta.version}));function iA(A){return(A instanceof Date?A:new Date(A)).toISOString().slice(0,10)}function G0(A){let _=new Map,g=new Map,R=0,O=0;for(let D of A){_.set(D.status,(_.get(D.status)??0)+1);let H=iA(D.startedAt);if(g.set(H,(g.get(H)??0)+1),D.status==="PENDING"||D.status==="IN_PROGRESS")R+=1;if(D.status==="COMPLETED")O+=1}return{primaryItems:[{key:"workflow-status",spec:W0,data:{data:Array.from(_.entries()).map(([D,H])=>({status:D,instances:H}))},title:"Instance Status Breakdown",description:"Status mix across workflow instances.",height:260},{key:"workflow-throughput",spec:d0,data:{data:Array.from(g.entries()).sort(([D],[H])=>D.localeCompare(H)).map(([D,H])=>({day:D,instances:H}))},title:"Run Throughput",description:"Daily workflow starts from current instances."}],comparisonItems:[{key:"workflow-active",spec:b0,data:{data:[{value:R}]},title:"Active Work",description:"Pending and in-progress workflows.",height:200},{key:"workflow-completed",spec:x0,data:{data:[{value:O}]},title:"Completed Work",description:"Completed workflows in the current sample.",height:200}]}}var U0=S0,M0=t0,lA=new Map(U0.map((A)=>[A.id,A]));function u0(A){return new Date(A).toISOString().slice(0,10)}var eA={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowDashboard")throw Error("workflowDashboardMarkdownRenderer: not WorkflowDashboard");let _=U0,g=M0,R=G0(g),O=_.filter((D)=>D.status==="ACTIVE"),P=g.filter((D)=>D.status==="PENDING"||D.status==="IN_PROGRESS"),Z=["# Workflow Dashboard","","> Seeded workflow and approval overview for the sandbox demo.","","## Summary","","| Metric | Value |","|--------|-------|",`| Active Workflows | ${O.length} |`,`| Awaiting Action | ${P.length} |`,`| Completed | ${g.filter((D)=>D.status==="COMPLETED").length} |`,`| Rejected | ${g.filter((D)=>D.status==="REJECTED").length} |`,""];Z.push("## Visualization Overview"),Z.push("");for(let D of[...R.primaryItems,...R.comparisonItems])Z.push(`- **${D.title}** via \`${D.spec.meta.key}\``);if(Z.push(""),Z.push("## Active Workflow Definitions"),Z.push(""),O.length===0)Z.push("_No active workflow definitions._");else{Z.push("| Name | Type | Steps | Status |"),Z.push("|------|------|-------|--------|");for(let D of O)Z.push(`| ${D.name} | ${D.type} | ${D.steps.length} | ${D.status} |`)}if(Z.push(""),Z.push("## Recent Instances"),Z.push(""),g.length===0)Z.push("_No workflow instances._");else{Z.push("| Workflow | Requested By | Status | Started |"),Z.push("|----------|--------------|--------|---------|");for(let D of g.slice(0,10)){let H=u0(D.startedAt),G=lA.get(D.definitionId)?.name??D.definitionId;Z.push(`| ${G} | ${D.requestedBy} | ${D.status} | ${H} |`)}}return{mimeType:"text/markdown",body:Z.join(`
|
|
9
|
-
`)}}},
|
|
10
|
-
`)}}},
|
|
8
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.reason,N,L.instanceId,Y[0].currentStepId]),await R(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`,[N,L.instanceId]);let $=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);return D0($[0])}async function a(L){return(await g('SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"',[L])).map(HA)}return{listDefinitions:O,createDefinition:P,addStep:Z,getSteps:D,listInstances:H,startInstance:G,approveStep:n,rejectStep:Y0,getApprovals:a}}import{defineEnum as YA}from"@contractspec/lib.schema";var t=YA("InstanceStatus",["PENDING","RUNNING","WAITING","PAUSED","COMPLETED","CANCELLED","FAILED","TIMEOUT"]);import{defineEvent as h}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as X0,ScalarTypeEnum as V}from"@contractspec/lib.schema";var w=X0({name:"InstanceEventPayload",description:"Base payload for instance events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},status:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},triggeredBy:{type:V.String_unsecure(),isOptional:!1},organizationId:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),o0=X0({name:"StepTransitionEventPayload",description:"Payload for step transition events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},fromStepKey:{type:V.String_unsecure(),isOptional:!0},toStepKey:{type:V.String_unsecure(),isOptional:!1},action:{type:V.String_unsecure(),isOptional:!0},executedBy:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),KA=X0({name:"InstanceCompletedEventPayload",description:"Payload when instance completes",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},outcome:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},duration:{type:V.Int_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),XA=h({meta:{key:"workflow.instance.started",version:"1.0.0",description:"A new workflow instance has been started.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","started"]},payload:w}),$A=h({meta:{key:"workflow.step.entered",version:"1.0.0",description:"A workflow instance has entered a new step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","entered"]},payload:o0}),kA=h({meta:{key:"workflow.step.exited",version:"1.0.0",description:"A workflow instance has exited a step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","exited"]},payload:o0}),QA=h({meta:{key:"workflow.instance.completed",version:"1.0.0",description:"A workflow instance has completed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","completed"]},payload:KA}),BA=h({meta:{key:"workflow.instance.cancelled",version:"1.0.0",description:"A workflow instance has been cancelled.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","cancelled"]},payload:w}),vA=h({meta:{key:"workflow.instance.paused",version:"1.0.0",description:"A workflow instance has been paused.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","paused"]},payload:w}),zA=h({meta:{key:"workflow.instance.resumed",version:"1.0.0",description:"A workflow instance has been resumed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","resumed"]},payload:w}),qA=h({meta:{key:"workflow.instance.failed",version:"1.0.0",description:"A workflow instance has failed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","failed"]},payload:w}),WA=h({meta:{key:"workflow.instance.timedOut",version:"1.0.0",description:"A workflow instance has timed out.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","timeout"]},payload:w});import{defineSchemaModel as R0,ScalarTypeEnum as U}from"@contractspec/lib.schema";var K=R0({name:"WorkflowInstanceModel",description:"A running workflow instance",fields:{id:{type:U.String_unsecure(),isOptional:!1},workflowDefinitionId:{type:U.String_unsecure(),isOptional:!1},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!1},currentStepId:{type:U.String_unsecure(),isOptional:!0},contextData:{type:U.JSON(),isOptional:!0},triggeredBy:{type:U.String_unsecure(),isOptional:!1},organizationId:{type:U.String_unsecure(),isOptional:!1},priority:{type:U.Int_unsecure(),isOptional:!1},dueAt:{type:U.DateTime(),isOptional:!0},outcome:{type:U.String_unsecure(),isOptional:!0},resultData:{type:U.JSON(),isOptional:!0},errorMessage:{type:U.String_unsecure(),isOptional:!0},createdAt:{type:U.DateTime(),isOptional:!1},startedAt:{type:U.DateTime(),isOptional:!0},completedAt:{type:U.DateTime(),isOptional:!0}}}),$0=R0({name:"StartWorkflowInput",description:"Input for starting a workflow",fields:{workflowKey:{type:U.NonEmptyString(),isOptional:!1},contextData:{type:U.JSON(),isOptional:!0},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},priority:{type:U.Int_unsecure(),isOptional:!0},dueAt:{type:U.DateTime(),isOptional:!0}}}),k0=R0({name:"TransitionInput",description:"Input for transitioning a workflow",fields:{instanceId:{type:U.String_unsecure(),isOptional:!1},action:{type:U.NonEmptyString(),isOptional:!1},data:{type:U.JSON(),isOptional:!0},comment:{type:U.String_unsecure(),isOptional:!0}}}),Q0=R0({name:"TransitionResult",description:"Result of a workflow transition",fields:{success:{type:U.Boolean(),isOptional:!1},instance:{type:K,isOptional:!1},previousStepKey:{type:U.String_unsecure(),isOptional:!0},currentStepKey:{type:U.String_unsecure(),isOptional:!0},message:{type:U.String_unsecure(),isOptional:!0}}});import{defineCommand as s,defineQuery as m0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as T,ScalarTypeEnum as Q}from"@contractspec/lib.schema";var j=["@example.workflow-system"],dA=s({meta:{key:"workflow.instance.start",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","start"],description:"Start a new workflow instance.",goal:"Initiate a workflow for a business process.",context:"Order creation, request submission, etc."},io:{input:$0,output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.started",version:"1.0.0",when:"Workflow starts",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"First step entered",payload:K}],audit:["workflow.instance.started"]},acceptance:{scenarios:[{key:"start-workflow-happy-path",given:["Workflow definition exists"],when:["User starts workflow"],then:["Instance is created and started"]}],examples:[{key:"start-onboarding",input:{workflowKey:"onboarding-v1",context:{employeeId:"emp-123"}},output:{id:"inst-456",status:"running"}}]}}),bA=s({meta:{key:"workflow.instance.transition",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","transition","state-machine"],description:"Transition a workflow instance to the next step.",goal:"Move workflow forward based on action.",context:"Task completion, approval decisions."},io:{input:k0,output:Q0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.exited",version:"1.0.0",when:"Step is exited",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"New step is entered",payload:K},{key:"workflow.instance.completed",version:"1.0.0",when:"Workflow reaches end",payload:K}],audit:["workflow.instance.transitioned"]},acceptance:{scenarios:[{key:"transition-workflow-happy-path",given:["Workflow instance is waiting at step"],when:["User provides input"],then:["Instance moves to next step"]}],examples:[{key:"complete-task",input:{instanceId:"inst-456",action:"complete",data:{approved:!0}},output:{success:!0,nextStep:"notify-hr"}}]}}),xA=s({meta:{key:"workflow.instance.pause",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","pause"],description:"Pause a running workflow instance.",goal:"Temporarily halt workflow execution.",context:"Administrative action, emergency stop."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.paused",version:"1.0.0",when:"Workflow is paused",payload:K}],audit:["workflow.instance.paused"]},acceptance:{scenarios:[{key:"pause-workflow-happy-path",given:["Workflow is running"],when:["Admin pauses workflow"],then:["Instance status becomes PAUSED"]}],examples:[{key:"pause-maintenance",input:{instanceId:"inst-456",reason:"System maintenance"},output:{id:"inst-456",status:"paused"}}]}}),MA=s({meta:{key:"workflow.instance.resume",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","resume"],description:"Resume a paused workflow instance.",goal:"Continue workflow execution.",context:"Administrative action."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.resumed",version:"1.0.0",when:"Workflow is resumed",payload:K}],audit:["workflow.instance.resumed"]},acceptance:{scenarios:[{key:"resume-workflow-happy-path",given:["Workflow is paused"],when:["Admin resumes workflow"],then:["Instance status becomes RUNNING"]}],examples:[{key:"resume-normal",input:{instanceId:"inst-456",reason:"Issue resolved"},output:{id:"inst-456",status:"running"}}]}}),hA=s({meta:{key:"workflow.instance.cancel",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","cancel"],description:"Cancel a workflow instance.",goal:"Terminate workflow without completion.",context:"User request, system cancellation."},io:{input:T({name:"CancelWorkflowInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.cancelled",version:"1.0.0",when:"Workflow is cancelled",payload:K}],audit:["workflow.instance.cancelled"]},acceptance:{scenarios:[{key:"cancel-workflow-happy-path",given:["Workflow is running"],when:["User cancels workflow"],then:["Instance status becomes CANCELLED"]}],examples:[{key:"cancel-mistake",input:{instanceId:"inst-456",reason:"Created by mistake"},output:{id:"inst-456",status:"cancelled"}}]}}),jA=m0({meta:{key:"workflow.instance.list",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","list"],description:"List workflow instances with filtering.",goal:"Browse and search running workflows.",context:"Dashboard, monitoring."},io:{input:T({name:"ListInstancesInput",fields:{workflowKey:{type:Q.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!0},referenceType:{type:Q.String_unsecure(),isOptional:!0},referenceId:{type:Q.String_unsecure(),isOptional:!0},triggeredBy:{type:Q.String_unsecure(),isOptional:!0},limit:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:T({name:"ListInstancesOutput",fields:{instances:{type:K,isArray:!0,isOptional:!1},total:{type:Q.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-instances-happy-path",given:["Workflow instances exist"],when:["User lists instances"],then:["List of instances is returned"]}],examples:[{key:"list-running",input:{status:"running",limit:10},output:{instances:[],total:5}}]}}),fA=m0({meta:{key:"workflow.instance.get",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","get"],description:"Get a workflow instance with details.",goal:"View workflow instance details.",context:"Instance detail view."},io:{input:T({name:"GetInstanceInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-instance-happy-path",given:["Instance exists"],when:["User requests instance details"],then:["Instance details are returned"]}],examples:[{key:"get-details",input:{instanceId:"inst-456"},output:{id:"inst-456",workflowKey:"onboarding-v1"}}]}});import{defineEnum as L0}from"@contractspec/lib.schema";var c=L0("WorkflowStatus",["DRAFT","ACTIVE","DEPRECATED","ARCHIVED"]),u=L0("WorkflowTriggerType",["MANUAL","EVENT","SCHEDULED","API"]),Z0=L0("StepType",["START","APPROVAL","TASK","CONDITION","PARALLEL","WAIT","ACTION","END"]),O0=L0("ApprovalMode",["ANY","ALL","MAJORITY","SEQUENTIAL"]);import{defineSchemaModel as i,ScalarTypeEnum as I}from"@contractspec/lib.schema";var l=i({name:"WorkflowStepModel",description:"A step in a workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!1},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0}}}),B=i({name:"WorkflowDefinitionModel",description:"A workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},version:{type:I.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1},triggerType:{type:u,isOptional:!1},initialStepId:{type:I.String_unsecure(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},organizationId:{type:I.String_unsecure(),isOptional:!1},createdAt:{type:I.DateTime(),isOptional:!1},updatedAt:{type:I.DateTime(),isOptional:!1},steps:{type:l,isArray:!0,isOptional:!0}}}),B0=i({name:"CreateWorkflowInput",description:"Input for creating a workflow definition",fields:{name:{type:I.NonEmptyString(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),v0=i({name:"UpdateWorkflowInput",description:"Input for updating a workflow definition",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!0},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),z0=i({name:"AddStepInput",description:"Input for adding a step to a workflow",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!0},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0},approverUserIds:{type:I.String_unsecure(),isArray:!0,isOptional:!0},timeoutSeconds:{type:I.Int_unsecure(),isOptional:!0},slaSeconds:{type:I.Int_unsecure(),isOptional:!0}}});import{definePresentation as x,StabilityEnum as M}from"@contractspec/lib.contracts-spec";var rA=x({meta:{key:"workflow.designer",version:"1.0.0",title:"Workflow Designer",description:"Visual workflow designer with drag-and-drop steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","designer","admin"],stability:M.Experimental,goal:"Building and modifying workflow definitions",context:"Workflow administration and setup"},source:{type:"component",framework:"react",componentKey:"WorkflowDesigner",props:B},targets:["react"],policy:{flags:["workflow.designer.enabled"]}}),wA=x({meta:{key:"workflow.definition.viewList",version:"1.0.0",title:"Workflow List",description:"List of workflow definitions with status and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","list","admin"],stability:M.Experimental,goal:"Overview of all defined workflows",context:"Workflow management dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionList",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),TA=x({meta:{key:"workflow.definition.detail",version:"1.0.0",title:"Workflow Details",description:"Detailed view of a workflow definition with steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","detail"],stability:M.Experimental,goal:"Viewing technical details of a workflow definition",context:"Workflow inspection and debugging"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionDetail",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),EA=x({meta:{key:"workflow.instance.viewList",version:"1.0.0",title:"Instance List",description:"List of workflow instances with status and progress",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","list"],stability:M.Experimental,goal:"Monitoring active and past workflow executions",context:"Operations monitoring"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceList",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),pA=x({meta:{key:"workflow.instance.detail",version:"1.0.0",title:"Instance Details",description:"Detailed view of a workflow instance with step timeline",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","detail","timeline"],stability:M.Experimental,goal:"Detailed inspection of a specific workflow instance",context:"Case management and troubleshooting"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceDetail",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),yA=x({meta:{key:"workflow.instance.progress",version:"1.0.0",title:"Progress Tracker",description:"Visual progress tracker showing current step in workflow",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","progress","widget"],stability:M.Experimental,goal:"Quick view of current progress for a workflow",context:"Embedded progress indicator in entity views"},source:{type:"component",framework:"react",componentKey:"WorkflowProgressTracker",props:K},targets:["react"],policy:{flags:["workflow.enabled"]}}),oA=x({meta:{key:"workflow.approval.inbox",version:"1.0.0",title:"Approval Inbox",description:"Inbox showing pending approval requests for current user",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","inbox"],stability:M.Experimental,goal:"Managing personal workload of approval requests",context:"Personal task management"},source:{type:"component",framework:"react",componentKey:"ApprovalInbox",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),mA=x({meta:{key:"workflow.approval.detail",version:"1.0.0",title:"Approval Details",description:"Detailed approval request view with context and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","detail"],stability:M.Experimental,goal:"Decision support for an approval request",context:"Specific approval action"},source:{type:"component",framework:"react",componentKey:"ApprovalRequestDetail",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),SA=x({meta:{key:"workflow.approval.form",version:"1.0.0",title:"Approval Form",description:"Form for submitting approval decisions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","form"],stability:M.Experimental,goal:"Submitting a decision on an approval request",context:"Approval decision dialog"},source:{type:"component",framework:"react",componentKey:"ApprovalDecisionForm"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),tA=x({meta:{key:"workflow.approval.badge",version:"1.0.0",title:"Pending Approvals Badge",description:"Badge showing count of pending approvals",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","badge","widget"],stability:M.Experimental,goal:"Visual notification of pending approvals",context:"Global navigation or sidebar"},source:{type:"component",framework:"react",componentKey:"PendingApprovalsBadge"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),sA=x({meta:{key:"workflow.metrics",version:"1.0.0",title:"Workflow Metrics",description:"Dashboard widget showing workflow metrics and statistics",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","metrics","dashboard"],stability:M.Experimental,goal:"Monitoring throughput and bottlenecks",context:"System performance dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowMetricsDashboard"},targets:["react","markdown"],policy:{flags:["workflow.metrics.enabled"]}}),z2={WorkflowDesignerPresentation:rA,WorkflowListPresentation:wA,WorkflowDetailPresentation:TA,InstanceListPresentation:EA,InstanceDetailPresentation:pA,ProgressTrackerPresentation:yA,ApprovalInboxPresentation:oA,ApprovalDetailPresentation:mA,ApprovalFormPresentation:SA,PendingApprovalsBadgePresentation:tA,WorkflowMetricsPresentation:sA};import{useTemplateRuntime as cA}from"@contractspec/lib.example-shared-ui";import{useCallback as uA,useEffect as iA,useState as I0}from"react";function q0(A){let{handlers:_,projectId:g}=cA(),R=A??g,O=_.workflow,[P,Z]=I0([]),[D,H]=I0([]),[G,n]=I0(!0),[Y0,a]=I0(null),L=uA(async()=>{try{n(!0),a(null);let[N,Y]=await Promise.all([O.listDefinitions({projectId:R,limit:100}),O.listInstances({projectId:R,limit:100})]);Z(N.definitions),H(Y.instances)}catch(N){a(N instanceof Error?N:Error("Failed to load workflows"))}finally{n(!1)}},[R,O]);iA(()=>{L()},[L]);let F={totalDefinitions:P.length,activeDefinitions:P.filter((N)=>N.status==="ACTIVE").length,totalInstances:D.length,pendingInstances:D.filter((N)=>N.status==="PENDING").length,inProgressInstances:D.filter((N)=>N.status==="IN_PROGRESS").length,completedInstances:D.filter((N)=>N.status==="COMPLETED").length,rejectedInstances:D.filter((N)=>N.status==="REJECTED").length};return{definitions:P,instances:D,loading:G,error:Y0,stats:F,refetch:L}}var r2="workflow-system-demo",w2="org_demo",S0=[{id:"wf_expense",name:"Expense Approval",description:"Approve non-trivial spend before finance releases budget.",type:"APPROVAL",status:"ACTIVE",createdAt:"2026-03-10T09:00:00.000Z",updatedAt:"2026-03-20T08:15:00.000Z",steps:[{id:"wfstep_expense_manager",name:"Manager Review",description:"Validate business value and team budget.",stepOrder:1,type:"APPROVAL",requiredRoles:["manager"],createdAt:"2026-03-10T09:00:00.000Z"},{id:"wfstep_expense_finance",name:"Finance Review",description:"Confirm ledger coding and spending threshold.",stepOrder:2,type:"APPROVAL",requiredRoles:["finance"],createdAt:"2026-03-10T09:10:00.000Z"}]},{id:"wf_vendor",name:"Vendor Onboarding",description:"Sequence security, procurement, and legal before activation.",type:"SEQUENTIAL",status:"ACTIVE",createdAt:"2026-03-08T11:00:00.000Z",updatedAt:"2026-03-19T13:10:00.000Z",steps:[{id:"wfstep_vendor_security",name:"Security Check",description:"Review data access and integration scope.",stepOrder:1,type:"APPROVAL",requiredRoles:["security"],createdAt:"2026-03-08T11:00:00.000Z"},{id:"wfstep_vendor_procurement",name:"Procurement Check",description:"Validate pricing, procurement policy, and owner.",stepOrder:2,type:"APPROVAL",requiredRoles:["procurement"],createdAt:"2026-03-08T11:05:00.000Z"},{id:"wfstep_vendor_legal",name:"Legal Sign-off",description:"Approve terms before the vendor goes live.",stepOrder:3,type:"APPROVAL",requiredRoles:["legal"],createdAt:"2026-03-08T11:10:00.000Z"}]},{id:"wf_policy_exception",name:"Policy Exception",description:"Escalate a temporary exception through team lead and compliance.",type:"APPROVAL",status:"DRAFT",createdAt:"2026-03-15T07:30:00.000Z",updatedAt:"2026-03-18T11:20:00.000Z",steps:[{id:"wfstep_policy_lead",name:"Team Lead Review",description:"Check urgency and expected blast radius.",stepOrder:1,type:"APPROVAL",requiredRoles:["team-lead"],createdAt:"2026-03-15T07:30:00.000Z"},{id:"wfstep_policy_compliance",name:"Compliance Review",description:"Accept or reject the exception request.",stepOrder:2,type:"APPROVAL",requiredRoles:["compliance"],createdAt:"2026-03-15T07:40:00.000Z"}]}],t0=[{id:"wfinst_expense_open",definitionId:"wf_expense",status:"IN_PROGRESS",currentStepId:"wfstep_expense_finance",data:{amount:4200,currency:"EUR",vendor:"Nimbus AI"},requestedBy:"sarah@contractspec.io",startedAt:"2026-03-20T08:00:00.000Z",approvals:[{id:"wfappr_expense_manager",stepId:"wfstep_expense_manager",status:"APPROVED",actorId:"manager.demo",comment:"Approved for the Q2 automation budget.",decidedAt:"2026-03-20T08:15:00.000Z",createdAt:"2026-03-20T08:05:00.000Z"},{id:"wfappr_expense_finance",stepId:"wfstep_expense_finance",status:"PENDING",createdAt:"2026-03-20T08:15:00.000Z"}]},{id:"wfinst_vendor_done",definitionId:"wf_vendor",status:"COMPLETED",data:{vendor:"Acme Cloud",riskTier:"medium"},requestedBy:"leo@contractspec.io",startedAt:"2026-03-19T09:30:00.000Z",completedAt:"2026-03-19T13:10:00.000Z",approvals:[{id:"wfappr_vendor_security",stepId:"wfstep_vendor_security",status:"APPROVED",actorId:"security.demo",comment:"SOC2 scope is acceptable.",decidedAt:"2026-03-19T10:10:00.000Z",createdAt:"2026-03-19T09:35:00.000Z"},{id:"wfappr_vendor_procurement",stepId:"wfstep_vendor_procurement",status:"APPROVED",actorId:"procurement.demo",comment:"Commercial terms match the preferred vendor tier.",decidedAt:"2026-03-19T11:25:00.000Z",createdAt:"2026-03-19T10:15:00.000Z"},{id:"wfappr_vendor_legal",stepId:"wfstep_vendor_legal",status:"APPROVED",actorId:"legal.demo",comment:"MSA redlines are complete.",decidedAt:"2026-03-19T13:05:00.000Z",createdAt:"2026-03-19T11:30:00.000Z"}]},{id:"wfinst_policy_rejected",definitionId:"wf_policy_exception",status:"REJECTED",currentStepId:"wfstep_policy_compliance",data:{policy:"Model rollout freeze",durationDays:14},requestedBy:"maya@contractspec.io",startedAt:"2026-03-18T10:00:00.000Z",completedAt:"2026-03-18T11:20:00.000Z",approvals:[{id:"wfappr_policy_lead",stepId:"wfstep_policy_lead",status:"APPROVED",actorId:"lead.demo",comment:"Escalation justified for the release train.",decidedAt:"2026-03-18T10:30:00.000Z",createdAt:"2026-03-18T10:05:00.000Z"},{id:"wfappr_policy_compliance",stepId:"wfstep_policy_compliance",status:"REJECTED",actorId:"compliance.demo",comment:"Exception exceeds the allowed blast radius.",decidedAt:"2026-03-18T11:15:00.000Z",createdAt:"2026-03-18T10:35:00.000Z"}]}];import{defineVisualization as P0,VisualizationRegistry as lA}from"@contractspec/lib.contracts-spec/visualizations";var C0={key:"workflow.instance.list",version:"1.0.0"},N0={version:"1.0.0",domain:"workflow",stability:"experimental",owners:["@example.workflow-system"],tags:["workflow","visualization","operations"]},W0=P0({meta:{...N0,key:"workflow-system.visualization.instance-status",title:"Instance Status Breakdown",description:"Distribution of workflow instance states.",goal:"Surface the current workload mix.",context:"Workflow operations overview."},source:{primary:C0,resultPath:"data"},visualization:{kind:"pie",nameDimension:"status",valueMeasure:"instances",dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number"}],table:{caption:"Workflow instance counts by status."}}}),d0=P0({meta:{...N0,key:"workflow-system.visualization.throughput",title:"Run Throughput",description:"Daily workflow instance starts.",goal:"Show operational throughput over time.",context:"Workflow trend monitoring."},source:{primary:C0,resultPath:"data"},visualization:{kind:"cartesian",variant:"line",xDimension:"day",yMeasures:["instances"],dimensions:[{key:"day",label:"Day",dataPath:"day",type:"time"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number",color:"#0f766e"}],table:{caption:"Daily workflow instance starts."}}}),b0=P0({meta:{...N0,key:"workflow-system.visualization.active-work",title:"Active Work",description:"Current in-flight or pending workflow instances.",goal:"Expose active operational workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Active workflow count."}}}),x0=P0({meta:{...N0,key:"workflow-system.visualization.completed-work",title:"Completed Work",description:"Completed workflow instances in the current sample.",goal:"Show output against active workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Completed workflow count."}}}),s0=[W0,d0,b0,x0],p2=new lA([...s0]),c0=s0.map((A)=>({key:A.meta.key,version:A.meta.version}));function eA(A){return(A instanceof Date?A:new Date(A)).toISOString().slice(0,10)}function G0(A){let _=new Map,g=new Map,R=0,O=0;for(let D of A){_.set(D.status,(_.get(D.status)??0)+1);let H=eA(D.startedAt);if(g.set(H,(g.get(H)??0)+1),D.status==="PENDING"||D.status==="IN_PROGRESS")R+=1;if(D.status==="COMPLETED")O+=1}return{primaryItems:[{key:"workflow-status",spec:W0,data:{data:Array.from(_.entries()).map(([D,H])=>({status:D,instances:H}))},title:"Instance Status Breakdown",description:"Status mix across workflow instances.",height:260},{key:"workflow-throughput",spec:d0,data:{data:Array.from(g.entries()).sort(([D],[H])=>D.localeCompare(H)).map(([D,H])=>({day:D,instances:H}))},title:"Run Throughput",description:"Daily workflow starts from current instances."}],comparisonItems:[{key:"workflow-active",spec:b0,data:{data:[{value:R}]},title:"Active Work",description:"Pending and in-progress workflows.",height:200},{key:"workflow-completed",spec:x0,data:{data:[{value:O}]},title:"Completed Work",description:"Completed workflows in the current sample.",height:200}]}}var U0=S0,M0=t0,nA=new Map(U0.map((A)=>[A.id,A]));function u0(A){return new Date(A).toISOString().slice(0,10)}var aA={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowDashboard")throw Error("workflowDashboardMarkdownRenderer: not WorkflowDashboard");let _=U0,g=M0,R=G0(g),O=_.filter((D)=>D.status==="ACTIVE"),P=g.filter((D)=>D.status==="PENDING"||D.status==="IN_PROGRESS"),Z=["# Workflow Dashboard","","> Seeded workflow and approval overview for the sandbox demo.","","## Summary","","| Metric | Value |","|--------|-------|",`| Active Workflows | ${O.length} |`,`| Awaiting Action | ${P.length} |`,`| Completed | ${g.filter((D)=>D.status==="COMPLETED").length} |`,`| Rejected | ${g.filter((D)=>D.status==="REJECTED").length} |`,""];Z.push("## Visualization Overview"),Z.push("");for(let D of[...R.primaryItems,...R.comparisonItems])Z.push(`- **${D.title}** via \`${D.spec.meta.key}\``);if(Z.push(""),Z.push("## Active Workflow Definitions"),Z.push(""),O.length===0)Z.push("_No active workflow definitions._");else{Z.push("| Name | Type | Steps | Status |"),Z.push("|------|------|-------|--------|");for(let D of O)Z.push(`| ${D.name} | ${D.type} | ${D.steps.length} | ${D.status} |`)}if(Z.push(""),Z.push("## Recent Instances"),Z.push(""),g.length===0)Z.push("_No workflow instances._");else{Z.push("| Workflow | Requested By | Status | Started |"),Z.push("|----------|--------------|--------|---------|");for(let D of g.slice(0,10)){let H=u0(D.startedAt),G=nA.get(D.definitionId)?.name??D.definitionId;Z.push(`| ${G} | ${D.requestedBy} | ${D.status} | ${H} |`)}}return{mimeType:"text/markdown",body:Z.join(`
|
|
9
|
+
`)}}},Ag={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowDefinitionList")throw Error("workflowDefinitionListMarkdownRenderer: not WorkflowDefinitionList");let _=U0,g=["# Workflow Definitions","","> Configure automated approval and process workflows",""];for(let R of _){g.push(`## ${R.name}`),g.push(""),g.push(`**Type:** ${R.type} | **Status:** ${R.status}`),g.push(""),g.push("### Steps"),g.push("");for(let O of R.steps)g.push(`${O.stepOrder}. **${O.name}** - Roles: ${O.requiredRoles.join(", ")}`);g.push("")}return{mimeType:"text/markdown",body:g.join(`
|
|
10
|
+
`)}}},gg={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowInstanceDetail")throw Error("workflowInstanceDetailMarkdownRenderer: not WorkflowInstanceDetail");let _=M0.find((O)=>O.status==="IN_PROGRESS")??M0[0];if(!_)return{mimeType:"text/markdown",body:`# No Workflow Instances
|
|
11
11
|
|
|
12
12
|
No workflow instances available.`};let g=U0.find((O)=>O.id===_.definitionId),R=[`# Workflow: ${g?.name??_.definitionId}`,"",`**Instance ID:** ${_.id}`,`**Status:** ${_.status}`,`**Requested By:** ${_.requestedBy}`,`**Started:** ${u0(_.startedAt)}`,"","## Steps Progress",""];if(g)for(let O of g.steps){let P=O.id===_.currentStepId,Z=g.steps.indexOf(O)<g.steps.findIndex((H)=>H.id===_.currentStepId),D="⬜ Pending";if(Z)D="✅ Completed";if(P)D="\uD83D\uDD04 In Progress";R.push(`- ${D} **${O.name}**`)}return R.push(""),R.push("## Actions"),R.push(""),R.push("- **Approve** - Move to next step"),R.push("- **Reject** - End the workflow with a rejection outcome"),R.push("- **Delegate** - Assign to another approver"),{mimeType:"text/markdown",body:R.join(`
|
|
13
|
-
`)}}};import{ComparisonView as Ag,VisualizationCard as gg,VisualizationGrid as _g}from"@contractspec/lib.design-system";import{jsx as e,jsxs as i0}from"react/jsx-runtime";function l0({instances:A}){let{primaryItems:_,comparisonItems:g}=G0(A);return i0("section",{className:"space-y-4",children:[i0("div",{children:[e("h3",{className:"font-semibold text-lg",children:"Workflow Visualizations"}),e("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for workflow health and throughput."})]}),e(_g,{children:_.map((R)=>e(gg,{data:R.data,description:R.description,height:R.height,spec:R.spec,title:R.title},R.key))}),e(Ag,{description:"Shared comparison surface for active versus completed work.",items:g,title:"Workload Comparison"})]})}import{Button as e0,ErrorState as Dg,LoaderBlock as Rg,StatCard as F0,StatCardGroup as Lg}from"@contractspec/lib.design-system";import{useState as Zg}from"react";import{jsx as C,jsxs as v}from"react/jsx-runtime";var n0={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DRAFT:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",ARCHIVED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",PENDING:"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",IN_PROGRESS:"bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",COMPLETED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",REJECTED:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",CANCELLED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"};function Og(){let[A,_]=Zg("definitions"),{definitions:g,instances:R,loading:O,error:P,stats:Z,refetch:D}=q0(),H=[{id:"definitions",label:"Definitions",icon:"\uD83D\uDCCB"},{id:"instances",label:"Instances",icon:"\uD83D\uDD04"}];if(O)return C(Rg,{label:"Loading Workflows..."});if(P)return C(Dg,{title:"Failed to load Workflows",description:P.message,onRetry:D,retryLabel:"Retry"});return v("div",{className:"space-y-6",children:[v("div",{className:"flex items-center justify-between",children:[C("h2",{className:"font-bold text-2xl",children:"Workflow System"}),C(e0,{onClick:()=>void D(),children:"Refresh"})]}),v(Lg,{children:[C(F0,{label:"Workflows",value:Z.totalDefinitions,hint:`${Z.activeDefinitions} active`}),C(F0,{label:"Instances",value:Z.totalInstances,hint:"total runs"}),C(F0,{label:"Awaiting Action",value:Z.pendingInstances+Z.inProgressInstances,hint:"open approvals"}),C(F0,{label:"Completed",value:Z.completedInstances,hint:"finished"})]}),C(l0,{instances:R}),C("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:H.map((G)=>v(e0,{type:"button",role:"tab","aria-selected":A===G.id,onClick:()=>_(G.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${A===G.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[C("span",{children:G.icon}),G.label]},G.id))}),v("div",{className:"min-h-[400px]",role:"tabpanel",children:[A==="definitions"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Name"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Type"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Created"})]})}),v("tbody",{className:"divide-y divide-border",children:[g.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[v("td",{className:"px-4 py-3",children:[C("div",{className:"font-medium",children:G.name}),C("div",{className:"text-muted-foreground text-sm",children:G.description})]}),C("td",{className:"px-4 py-3 font-mono text-sm",children:G.type}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.createdAt.toLocaleDateString()})]},G.id)),g.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow definitions found"})})]})]})}),A==="instances"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Instance ID"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Requested By"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Started"})]})}),v("tbody",{className:"divide-y divide-border",children:[R.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[C("td",{className:"px-4 py-3 font-mono text-sm",children:G.id}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-sm",children:G.requestedBy}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.startedAt.toLocaleDateString()})]},G.id)),R.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow instances found"})})]})]})})]})]})}import{defineEvent as J0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as a0,ScalarTypeEnum as z}from"@contractspec/lib.schema";var h0=a0({name:"WorkflowDefinitionEventPayload",description:"Payload for workflow definition events",fields:{workflowId:{type:z.String_unsecure(),isOptional:!1},key:{type:z.String_unsecure(),isOptional:!1},name:{type:z.String_unsecure(),isOptional:!1},version:{type:z.String_unsecure(),isOptional:!1},organizationId:{type:z.String_unsecure(),isOptional:!1},createdBy:{type:z.String_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Ig=a0({name:"StepAddedEventPayload",description:"Payload when a step is added",fields:{stepId:{type:z.String_unsecure(),isOptional:!1},workflowId:{type:z.String_unsecure(),isOptional:!1},stepKey:{type:z.String_unsecure(),isOptional:!1},stepType:{type:z.String_unsecure(),isOptional:!1},position:{type:z.Int_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Pg=J0({meta:{key:"workflow.definition.created",version:"1.0.0",description:"A new workflow definition has been created.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","created"]},payload:h0}),Cg=J0({meta:{key:"workflow.definition.updated",version:"1.0.0",description:"A workflow definition has been updated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","updated"]},payload:h0}),Ng=J0({meta:{key:"workflow.definition.published",version:"1.0.0",description:"A workflow definition has been published and is now active.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","published"]},payload:h0}),Gg=J0({meta:{key:"workflow.step.added",version:"1.0.0",description:"A step has been added to a workflow definition.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","added"]},payload:Ig});import{defineCommand as H0,defineQuery as AA}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as V0,ScalarTypeEnum as E}from"@contractspec/lib.schema";var p=["@example.workflow-system"],Ug=H0({meta:{key:"workflow.definition.create",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","create"],description:"Create a new workflow definition.",goal:"Allow users to define new workflow blueprints.",context:"Workflow designer, admin panel."},io:{input:B0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.created",version:"1.0.0",when:"Workflow is created",payload:B}],audit:["workflow.definition.created"]},acceptance:{scenarios:[{key:"create-workflow-happy-path",given:["User is admin"],when:["User creates new workflow definition"],then:["Definition is created","WorkflowDefinitionCreated event is emitted"]}],examples:[{key:"create-onboarding",input:{key:"onboarding-v1",name:"Employee Onboarding",version:"1.0.0"},output:{id:"def-123",status:"draft"}}]}}),Fg=H0({meta:{key:"workflow.definition.update",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","update"],description:"Update an existing workflow definition.",goal:"Allow users to modify workflow blueprints.",context:"Workflow designer."},io:{input:v0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.updated",version:"1.0.0",when:"Workflow is updated",payload:B}],audit:["workflow.definition.updated"]},acceptance:{scenarios:[{key:"update-workflow-happy-path",given:["Workflow definition exists"],when:["User updates definition"],then:["Definition is updated","WorkflowDefinitionUpdated event is emitted"]}],examples:[{key:"update-name",input:{workflowId:"def-123",name:"New Employee Onboarding"},output:{id:"def-123",name:"New Employee Onboarding"}}]}}),Jg=H0({meta:{key:"workflow.step.add",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","step","add"],description:"Add a step to a workflow definition.",goal:"Build workflow structure step by step.",context:"Workflow designer."},io:{input:z0,output:l},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.added",version:"1.0.0",when:"Step is added",payload:l}],audit:["workflow.step.added"]},acceptance:{scenarios:[{key:"add-step-happy-path",given:["Workflow definition exists"],when:["User adds a step"],then:["Step is added","StepAdded event is emitted"]}],examples:[{key:"add-approval-step",input:{workflowId:"def-123",stepKey:"approve-contract",type:"approval"},output:{id:"step-456",key:"approve-contract"}}]}}),Vg=H0({meta:{key:"workflow.definition.publish",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","publish"],description:"Publish a workflow definition to make it available for use.",goal:"Activate workflow for production use.",context:"Workflow designer, deployment."},io:{input:V0({name:"PublishWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.published",version:"1.0.0",when:"Workflow is published",payload:B}],audit:["workflow.definition.published"]},acceptance:{scenarios:[{key:"publish-workflow-happy-path",given:["Workflow definition is valid"],when:["User publishes workflow"],then:["Workflow becomes active","WorkflowPublished event is emitted"]}],examples:[{key:"publish-onboarding",input:{workflowId:"def-123"},output:{id:"def-123",status:"published"}}]}}),Hg=AA({meta:{key:"workflow.definition.list",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","list"],description:"List workflow definitions with filtering.",goal:"Browse and search available workflows.",context:"Workflow list, search."},io:{input:V0({name:"ListWorkflowsInput",fields:{status:{type:c,isOptional:!0},search:{type:E.String_unsecure(),isOptional:!0},limit:{type:E.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:E.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:V0({name:"ListWorkflowsOutput",fields:{workflows:{type:B,isArray:!0,isOptional:!1},total:{type:E.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-workflows-happy-path",given:["Workflow definitions exist"],when:["User lists workflows"],then:["List of workflows is returned"]}],examples:[{key:"list-all",input:{limit:10},output:{workflows:[],total:5}}]}}),Yg=AA({meta:{key:"workflow.definition.get",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","get"],description:"Get a workflow definition with all steps.",goal:"View workflow details.",context:"Workflow designer, detail view."},io:{input:V0({name:"GetWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-workflow-happy-path",given:["Workflow definition exists"],when:["User requests workflow details"],then:["Workflow details are returned"]}],examples:[{key:"get-details",input:{workflowId:"def-123"},output:{id:"def-123",name:"Employee Onboarding"}}]}});import{defineFeature as Kg}from"@contractspec/lib.contracts-spec";var $_=Kg({meta:{key:"workflow-system",title:"Workflow & Approval System",description:"State machine-based workflow engine with role-based approvals, delegation, and escalation",domain:"workflow",owners:["@workflow-team"],tags:["workflow","approval","state-machine","automation"],stability:"experimental",version:"1.0.0"},operations:[{key:"workflow.definition.create",version:"1.0.0"},{key:"workflow.definition.update",version:"1.0.0"},{key:"workflow.step.add",version:"1.0.0"},{key:"workflow.definition.publish",version:"1.0.0"},{key:"workflow.definition.list",version:"1.0.0"},{key:"workflow.definition.get",version:"1.0.0"},{key:"workflow.instance.start",version:"1.0.0"},{key:"workflow.instance.transition",version:"1.0.0"},{key:"workflow.instance.pause",version:"1.0.0"},{key:"workflow.instance.resume",version:"1.0.0"},{key:"workflow.instance.cancel",version:"1.0.0"},{key:"workflow.instance.list",version:"1.0.0"},{key:"workflow.instance.get",version:"1.0.0"},{key:"workflow.approval.decide",version:"1.0.0"},{key:"workflow.approval.delegate",version:"1.0.0"},{key:"workflow.approval.comment.add",version:"1.0.0"},{key:"workflow.approval.list.mine",version:"1.0.0"},{key:"workflow.approval.get",version:"1.0.0"}],events:[{key:"workflow.definition.created",version:"1.0.0"},{key:"workflow.definition.updated",version:"1.0.0"},{key:"workflow.definition.published",version:"1.0.0"},{key:"workflow.step.added",version:"1.0.0"},{key:"workflow.instance.started",version:"1.0.0"},{key:"workflow.step.entered",version:"1.0.0"},{key:"workflow.step.exited",version:"1.0.0"},{key:"workflow.instance.completed",version:"1.0.0"},{key:"workflow.instance.cancelled",version:"1.0.0"},{key:"workflow.instance.paused",version:"1.0.0"},{key:"workflow.instance.resumed",version:"1.0.0"},{key:"workflow.instance.failed",version:"1.0.0"},{key:"workflow.instance.timedOut",version:"1.0.0"},{key:"workflow.approval.requested",version:"1.0.0"},{key:"workflow.approval.decided",version:"1.0.0"},{key:"workflow.approval.delegated",version:"1.0.0"},{key:"workflow.approval.escalated",version:"1.0.0"}],presentations:[{key:"workflow.designer",version:"1.0.0"},{key:"workflow.definition.viewList",version:"1.0.0"},{key:"workflow.definition.detail",version:"1.0.0"},{key:"workflow.instance.viewList",version:"1.0.0"},{key:"workflow.instance.detail",version:"1.0.0"},{key:"workflow.instance.progress",version:"1.0.0"},{key:"workflow.approval.inbox",version:"1.0.0"},{key:"workflow.approval.detail",version:"1.0.0"},{key:"workflow.approval.form",version:"1.0.0"},{key:"workflow.approval.badge",version:"1.0.0"},{key:"workflow.metrics",version:"1.0.0"}],opToPresentation:[{op:{key:"workflow.definition.list",version:"1.0.0"},pres:{key:"workflow.definition.viewList",version:"1.0.0"}},{op:{key:"workflow.instance.list",version:"1.0.0"},pres:{key:"workflow.instance.viewList",version:"1.0.0"}},{op:{key:"workflow.approval.list.mine",version:"1.0.0"},pres:{key:"workflow.approval.inbox",version:"1.0.0"}},{op:{key:"workflow.approval.decide",version:"1.0.0"},pres:{key:"workflow.approval.form",version:"1.0.0"}}],presentationsTargets:[{key:"workflow.designer",version:"1.0.0",targets:["react"]},{key:"workflow.definition.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.definition.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.progress",version:"1.0.0",targets:["react"]},{key:"workflow.approval.inbox",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.approval.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.metrics",version:"1.0.0",targets:["react","markdown"]}],visualizations:c0,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"notifications",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"}],provides:[{key:"workflow",version:"1.0.0"},{key:"approval",version:"1.0.0"},{key:"state-machine",version:"1.0.0"}]},workflows:[{key:"workflow-system.workflow.approval-chain",version:"1.0.0"}],telemetry:[{key:"workflow-system.telemetry",version:"1.0.0"}],jobs:[{key:"workflow-system.job.instance-timeout",version:"1.0.0"},{key:"workflow-system.job.escalation",version:"1.0.0"}],docs:["docs.examples.workflow-system","docs.examples.workflow-system.goal","docs.examples.workflow-system.usage","docs.examples.workflow-system.constraints"]});export{aA as workflowInstanceDetailMarkdownRenderer,nA as workflowDefinitionListMarkdownRenderer,eA as workflowDashboardMarkdownRenderer,q0 as useWorkflowList,zg as mockDataStore,G0 as createWorkflowVisualizationSections,sg as createWorkflowHandlers,Wg as createStateMachineEngine,bg as createInitialState,dg as buildStateMachineDefinition,s0 as WorkflowVisualizationSpecs,f2 as WorkflowVisualizationRegistry,c0 as WorkflowVisualizationRefs,Cg as WorkflowUpdatedEvent,d0 as WorkflowThroughputVisualization,X2 as WorkflowSystemPresentations,$_ as WorkflowSystemFeature,l as WorkflowStepModel,c as WorkflowStatusEnum,Ng as WorkflowPublishedEvent,SA as WorkflowMetricsPresentation,fA as WorkflowListPresentation,W0 as WorkflowInstanceStatusVisualization,K as WorkflowInstanceModel,rA as WorkflowDetailPresentation,jA as WorkflowDesignerPresentation,B as WorkflowDefinitionModel,Og as WorkflowDashboard,Pg as WorkflowCreatedEvent,x0 as WorkflowCompletedMetricVisualization,b0 as WorkflowActiveMetricVisualization,v0 as UpdateWorkflowInputModel,Fg as UpdateWorkflowContract,u as TriggerTypeEnum,WA as TransitionWorkflowContract,Q0 as TransitionResultModel,$0 as TransitionInputModel,PA as SubmitDecisionContract,Z0 as StepTypeEnum,kA as StepExitedEvent,KA as StepEnteredEvent,Gg as StepAddedEvent,X0 as StartWorkflowInputModel,qA as StartWorkflowContract,bA as ResumeWorkflowContract,Vg as PublishWorkflowContract,EA as ProgressTrackerPresentation,oA as PendingApprovalsBadgePresentation,dA as PauseWorkflowContract,Hg as ListWorkflowsContract,GA as ListMyApprovalsContract,MA as ListInstancesContract,zA as InstanceTimedOutEvent,t as InstanceStatusEnum,YA as InstanceStartedEvent,BA as InstanceResumedEvent,QA as InstancePausedEvent,wA as InstanceListPresentation,vA as InstanceFailedEvent,TA as InstanceDetailPresentation,XA as InstanceCompletedEvent,$A as InstanceCancelledEvent,Yg as GetWorkflowContract,hA as GetInstanceContract,UA as GetApprovalContract,CA as DelegateApprovalContract,B0 as CreateWorkflowInputModel,Ug as CreateWorkflowContract,xA as CancelWorkflowContract,w0 as BasicStateMachineEngine,y as ApprovalStatusEnum,LA as ApprovalRequestedEvent,b as ApprovalRequestModel,O0 as ApprovalModeEnum,pA as ApprovalInboxPresentation,mA as ApprovalFormPresentation,IA as ApprovalEscalatedEvent,yA as ApprovalDetailPresentation,OA as ApprovalDelegatedEvent,m as ApprovalDecisionEnum,ZA as ApprovalDecidedEvent,_0 as ApprovalCommentModel,z0 as AddStepInputModel,Jg as AddStepContract,NA as AddApprovalCommentContract};
|
|
13
|
+
`)}}};import{ComparisonView as _g,VisualizationCard as Dg,VisualizationGrid as Rg}from"@contractspec/lib.design-system";import{jsx as e,jsxs as i0}from"react/jsx-runtime";function l0({instances:A}){let{primaryItems:_,comparisonItems:g}=G0(A);return i0("section",{className:"space-y-4",children:[i0("div",{children:[e("h3",{className:"font-semibold text-lg",children:"Workflow Visualizations"}),e("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for workflow health and throughput."})]}),e(Rg,{children:_.map((R)=>e(Dg,{data:R.data,description:R.description,height:R.height,spec:R.spec,title:R.title},R.key))}),e(_g,{description:"Shared comparison surface for active versus completed work.",items:g,title:"Workload Comparison"})]})}import{Button as e0,ErrorState as Lg,LoaderBlock as Zg,StatCard as F0,StatCardGroup as Og}from"@contractspec/lib.design-system";import{useState as Ig}from"react";import{jsx as C,jsxs as v}from"react/jsx-runtime";var n0={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DRAFT:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",ARCHIVED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",PENDING:"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",IN_PROGRESS:"bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",COMPLETED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",REJECTED:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",CANCELLED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"};function Pg(){let[A,_]=Ig("definitions"),{definitions:g,instances:R,loading:O,error:P,stats:Z,refetch:D}=q0(),H=[{id:"definitions",label:"Definitions",icon:"\uD83D\uDCCB"},{id:"instances",label:"Instances",icon:"\uD83D\uDD04"}];if(O)return C(Zg,{label:"Loading Workflows..."});if(P)return C(Lg,{title:"Failed to load Workflows",description:P.message,onRetry:D,retryLabel:"Retry"});return v("div",{className:"space-y-6",children:[v("div",{className:"flex items-center justify-between",children:[C("h2",{className:"font-bold text-2xl",children:"Workflow System"}),C(e0,{onClick:()=>void D(),children:"Refresh"})]}),v(Og,{children:[C(F0,{label:"Workflows",value:Z.totalDefinitions,hint:`${Z.activeDefinitions} active`}),C(F0,{label:"Instances",value:Z.totalInstances,hint:"total runs"}),C(F0,{label:"Awaiting Action",value:Z.pendingInstances+Z.inProgressInstances,hint:"open approvals"}),C(F0,{label:"Completed",value:Z.completedInstances,hint:"finished"})]}),C(l0,{instances:R}),C("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:H.map((G)=>v(e0,{type:"button",role:"tab","aria-selected":A===G.id,onClick:()=>_(G.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${A===G.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[C("span",{children:G.icon}),G.label]},G.id))}),v("div",{className:"min-h-[400px]",role:"tabpanel",children:[A==="definitions"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Name"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Type"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Created"})]})}),v("tbody",{className:"divide-y divide-border",children:[g.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[v("td",{className:"px-4 py-3",children:[C("div",{className:"font-medium",children:G.name}),C("div",{className:"text-muted-foreground text-sm",children:G.description})]}),C("td",{className:"px-4 py-3 font-mono text-sm",children:G.type}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.createdAt.toLocaleDateString()})]},G.id)),g.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow definitions found"})})]})]})}),A==="instances"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Instance ID"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Requested By"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Started"})]})}),v("tbody",{className:"divide-y divide-border",children:[R.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[C("td",{className:"px-4 py-3 font-mono text-sm",children:G.id}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-sm",children:G.requestedBy}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.startedAt.toLocaleDateString()})]},G.id)),R.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow instances found"})})]})]})})]})]})}import{defineEvent as J0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as a0,ScalarTypeEnum as z}from"@contractspec/lib.schema";var h0=a0({name:"WorkflowDefinitionEventPayload",description:"Payload for workflow definition events",fields:{workflowId:{type:z.String_unsecure(),isOptional:!1},key:{type:z.String_unsecure(),isOptional:!1},name:{type:z.String_unsecure(),isOptional:!1},version:{type:z.String_unsecure(),isOptional:!1},organizationId:{type:z.String_unsecure(),isOptional:!1},createdBy:{type:z.String_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Cg=a0({name:"StepAddedEventPayload",description:"Payload when a step is added",fields:{stepId:{type:z.String_unsecure(),isOptional:!1},workflowId:{type:z.String_unsecure(),isOptional:!1},stepKey:{type:z.String_unsecure(),isOptional:!1},stepType:{type:z.String_unsecure(),isOptional:!1},position:{type:z.Int_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Ng=J0({meta:{key:"workflow.definition.created",version:"1.0.0",description:"A new workflow definition has been created.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","created"]},payload:h0}),Gg=J0({meta:{key:"workflow.definition.updated",version:"1.0.0",description:"A workflow definition has been updated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","updated"]},payload:h0}),Ug=J0({meta:{key:"workflow.definition.published",version:"1.0.0",description:"A workflow definition has been published and is now active.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","published"]},payload:h0}),Fg=J0({meta:{key:"workflow.step.added",version:"1.0.0",description:"A step has been added to a workflow definition.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","added"]},payload:Cg});import{defineCommand as H0,defineQuery as AA}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as V0,ScalarTypeEnum as E}from"@contractspec/lib.schema";var p=["@example.workflow-system"],Jg=H0({meta:{key:"workflow.definition.create",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","create"],description:"Create a new workflow definition.",goal:"Allow users to define new workflow blueprints.",context:"Workflow designer, admin panel."},io:{input:B0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.created",version:"1.0.0",when:"Workflow is created",payload:B}],audit:["workflow.definition.created"]},acceptance:{scenarios:[{key:"create-workflow-happy-path",given:["User is admin"],when:["User creates new workflow definition"],then:["Definition is created","WorkflowDefinitionCreated event is emitted"]}],examples:[{key:"create-onboarding",input:{key:"onboarding-v1",name:"Employee Onboarding",version:"1.0.0"},output:{id:"def-123",status:"draft"}}]}}),Vg=H0({meta:{key:"workflow.definition.update",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","update"],description:"Update an existing workflow definition.",goal:"Allow users to modify workflow blueprints.",context:"Workflow designer."},io:{input:v0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.updated",version:"1.0.0",when:"Workflow is updated",payload:B}],audit:["workflow.definition.updated"]},acceptance:{scenarios:[{key:"update-workflow-happy-path",given:["Workflow definition exists"],when:["User updates definition"],then:["Definition is updated","WorkflowDefinitionUpdated event is emitted"]}],examples:[{key:"update-name",input:{workflowId:"def-123",name:"New Employee Onboarding"},output:{id:"def-123",name:"New Employee Onboarding"}}]}}),Hg=H0({meta:{key:"workflow.step.add",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","step","add"],description:"Add a step to a workflow definition.",goal:"Build workflow structure step by step.",context:"Workflow designer."},io:{input:z0,output:l},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.added",version:"1.0.0",when:"Step is added",payload:l}],audit:["workflow.step.added"]},acceptance:{scenarios:[{key:"add-step-happy-path",given:["Workflow definition exists"],when:["User adds a step"],then:["Step is added","StepAdded event is emitted"]}],examples:[{key:"add-approval-step",input:{workflowId:"def-123",stepKey:"approve-contract",type:"approval"},output:{id:"step-456",key:"approve-contract"}}]}}),Yg=H0({meta:{key:"workflow.definition.publish",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","publish"],description:"Publish a workflow definition to make it available for use.",goal:"Activate workflow for production use.",context:"Workflow designer, deployment."},io:{input:V0({name:"PublishWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.published",version:"1.0.0",when:"Workflow is published",payload:B}],audit:["workflow.definition.published"]},acceptance:{scenarios:[{key:"publish-workflow-happy-path",given:["Workflow definition is valid"],when:["User publishes workflow"],then:["Workflow becomes active","WorkflowPublished event is emitted"]}],examples:[{key:"publish-onboarding",input:{workflowId:"def-123"},output:{id:"def-123",status:"published"}}]}}),Kg=AA({meta:{key:"workflow.definition.list",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","list"],description:"List workflow definitions with filtering.",goal:"Browse and search available workflows.",context:"Workflow list, search."},io:{input:V0({name:"ListWorkflowsInput",fields:{status:{type:c,isOptional:!0},search:{type:E.String_unsecure(),isOptional:!0},limit:{type:E.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:E.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:V0({name:"ListWorkflowsOutput",fields:{workflows:{type:B,isArray:!0,isOptional:!1},total:{type:E.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-workflows-happy-path",given:["Workflow definitions exist"],when:["User lists workflows"],then:["List of workflows is returned"]}],examples:[{key:"list-all",input:{limit:10},output:{workflows:[],total:5}}]}}),Xg=AA({meta:{key:"workflow.definition.get",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","get"],description:"Get a workflow definition with all steps.",goal:"View workflow details.",context:"Workflow designer, detail view."},io:{input:V0({name:"GetWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-workflow-happy-path",given:["Workflow definition exists"],when:["User requests workflow details"],then:["Workflow details are returned"]}],examples:[{key:"get-details",input:{workflowId:"def-123"},output:{id:"def-123",name:"Employee Onboarding"}}]}});import{defineFeature as $g}from"@contractspec/lib.contracts-spec/features";var q_=$g({meta:{key:"workflow-system",title:"Workflow & Approval System",description:"State machine-based workflow engine with role-based approvals, delegation, and escalation",domain:"workflow",owners:["@workflow-team"],tags:["workflow","approval","state-machine","automation"],stability:"experimental",version:"1.0.0"},operations:[{key:"workflow.definition.create",version:"1.0.0"},{key:"workflow.definition.update",version:"1.0.0"},{key:"workflow.step.add",version:"1.0.0"},{key:"workflow.definition.publish",version:"1.0.0"},{key:"workflow.definition.list",version:"1.0.0"},{key:"workflow.definition.get",version:"1.0.0"},{key:"workflow.instance.start",version:"1.0.0"},{key:"workflow.instance.transition",version:"1.0.0"},{key:"workflow.instance.pause",version:"1.0.0"},{key:"workflow.instance.resume",version:"1.0.0"},{key:"workflow.instance.cancel",version:"1.0.0"},{key:"workflow.instance.list",version:"1.0.0"},{key:"workflow.instance.get",version:"1.0.0"},{key:"workflow.approval.decide",version:"1.0.0"},{key:"workflow.approval.delegate",version:"1.0.0"},{key:"workflow.approval.comment.add",version:"1.0.0"},{key:"workflow.approval.list.mine",version:"1.0.0"},{key:"workflow.approval.get",version:"1.0.0"}],events:[{key:"workflow.definition.created",version:"1.0.0"},{key:"workflow.definition.updated",version:"1.0.0"},{key:"workflow.definition.published",version:"1.0.0"},{key:"workflow.step.added",version:"1.0.0"},{key:"workflow.instance.started",version:"1.0.0"},{key:"workflow.step.entered",version:"1.0.0"},{key:"workflow.step.exited",version:"1.0.0"},{key:"workflow.instance.completed",version:"1.0.0"},{key:"workflow.instance.cancelled",version:"1.0.0"},{key:"workflow.instance.paused",version:"1.0.0"},{key:"workflow.instance.resumed",version:"1.0.0"},{key:"workflow.instance.failed",version:"1.0.0"},{key:"workflow.instance.timedOut",version:"1.0.0"},{key:"workflow.approval.requested",version:"1.0.0"},{key:"workflow.approval.decided",version:"1.0.0"},{key:"workflow.approval.delegated",version:"1.0.0"},{key:"workflow.approval.escalated",version:"1.0.0"}],presentations:[{key:"workflow.designer",version:"1.0.0"},{key:"workflow.definition.viewList",version:"1.0.0"},{key:"workflow.definition.detail",version:"1.0.0"},{key:"workflow.instance.viewList",version:"1.0.0"},{key:"workflow.instance.detail",version:"1.0.0"},{key:"workflow.instance.progress",version:"1.0.0"},{key:"workflow.approval.inbox",version:"1.0.0"},{key:"workflow.approval.detail",version:"1.0.0"},{key:"workflow.approval.form",version:"1.0.0"},{key:"workflow.approval.badge",version:"1.0.0"},{key:"workflow.metrics",version:"1.0.0"}],opToPresentation:[{op:{key:"workflow.definition.list",version:"1.0.0"},pres:{key:"workflow.definition.viewList",version:"1.0.0"}},{op:{key:"workflow.instance.list",version:"1.0.0"},pres:{key:"workflow.instance.viewList",version:"1.0.0"}},{op:{key:"workflow.approval.list.mine",version:"1.0.0"},pres:{key:"workflow.approval.inbox",version:"1.0.0"}},{op:{key:"workflow.approval.decide",version:"1.0.0"},pres:{key:"workflow.approval.form",version:"1.0.0"}}],presentationsTargets:[{key:"workflow.designer",version:"1.0.0",targets:["react"]},{key:"workflow.definition.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.definition.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.progress",version:"1.0.0",targets:["react"]},{key:"workflow.approval.inbox",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.approval.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.metrics",version:"1.0.0",targets:["react","markdown"]}],visualizations:c0,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"notifications",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"}],provides:[{key:"workflow",version:"1.0.0"},{key:"approval",version:"1.0.0"},{key:"state-machine",version:"1.0.0"}]},workflows:[{key:"workflow-system.workflow.approval-chain",version:"1.0.0"}],telemetry:[{key:"workflow-system.telemetry",version:"1.0.0"}],jobs:[{key:"workflow-system.job.instance-timeout",version:"1.0.0"},{key:"workflow-system.job.escalation",version:"1.0.0"}],docs:["docs.examples.workflow-system","docs.examples.workflow-system.goal","docs.examples.workflow-system.usage","docs.examples.workflow-system.constraints"]});export{gg as workflowInstanceDetailMarkdownRenderer,Ag as workflowDefinitionListMarkdownRenderer,aA as workflowDashboardMarkdownRenderer,q0 as useWorkflowList,Wg as mockDataStore,G0 as createWorkflowVisualizationSections,eg as createWorkflowHandlers,bg as createStateMachineEngine,Mg as createInitialState,xg as buildStateMachineDefinition,s0 as WorkflowVisualizationSpecs,p2 as WorkflowVisualizationRegistry,c0 as WorkflowVisualizationRefs,Gg as WorkflowUpdatedEvent,d0 as WorkflowThroughputVisualization,z2 as WorkflowSystemPresentations,q_ as WorkflowSystemFeature,l as WorkflowStepModel,c as WorkflowStatusEnum,Ug as WorkflowPublishedEvent,sA as WorkflowMetricsPresentation,wA as WorkflowListPresentation,W0 as WorkflowInstanceStatusVisualization,K as WorkflowInstanceModel,TA as WorkflowDetailPresentation,rA as WorkflowDesignerPresentation,B as WorkflowDefinitionModel,Pg as WorkflowDashboard,Ng as WorkflowCreatedEvent,x0 as WorkflowCompletedMetricVisualization,b0 as WorkflowActiveMetricVisualization,v0 as UpdateWorkflowInputModel,Vg as UpdateWorkflowContract,u as TriggerTypeEnum,bA as TransitionWorkflowContract,Q0 as TransitionResultModel,k0 as TransitionInputModel,PA as SubmitDecisionContract,Z0 as StepTypeEnum,kA as StepExitedEvent,$A as StepEnteredEvent,Fg as StepAddedEvent,$0 as StartWorkflowInputModel,dA as StartWorkflowContract,MA as ResumeWorkflowContract,Yg as PublishWorkflowContract,yA as ProgressTrackerPresentation,tA as PendingApprovalsBadgePresentation,xA as PauseWorkflowContract,Kg as ListWorkflowsContract,GA as ListMyApprovalsContract,jA as ListInstancesContract,WA as InstanceTimedOutEvent,t as InstanceStatusEnum,XA as InstanceStartedEvent,zA as InstanceResumedEvent,vA as InstancePausedEvent,EA as InstanceListPresentation,qA as InstanceFailedEvent,pA as InstanceDetailPresentation,QA as InstanceCompletedEvent,BA as InstanceCancelledEvent,Xg as GetWorkflowContract,fA as GetInstanceContract,UA as GetApprovalContract,JA as ExamplesWorkflowSystemExample,CA as DelegateApprovalContract,B0 as CreateWorkflowInputModel,Jg as CreateWorkflowContract,hA as CancelWorkflowContract,w0 as BasicStateMachineEngine,y as ApprovalStatusEnum,LA as ApprovalRequestedEvent,b as ApprovalRequestModel,O0 as ApprovalModeEnum,oA as ApprovalInboxPresentation,SA as ApprovalFormPresentation,IA as ApprovalEscalatedEvent,mA as ApprovalDetailPresentation,OA as ApprovalDelegatedEvent,o as ApprovalDecisionEnum,ZA as ApprovalDecidedEvent,_0 as ApprovalCommentModel,z0 as AddStepInputModel,Hg as AddStepContract,NA as AddApprovalCommentContract};
|
package/dist/example.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
declare const
|
|
2
|
-
export default
|
|
1
|
+
declare const ExamplesWorkflowSystemExample: import("@contractspec/lib.contracts-spec").ExampleSpec;
|
|
2
|
+
export default ExamplesWorkflowSystemExample;
|
|
3
|
+
export { ExamplesWorkflowSystemExample };
|
package/dist/example.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"workflow-system",version:"1.0.0",title:"Workflow
|
|
2
|
+
import{defineExample as g}from"@contractspec/lib.contracts-spec/examples";var h=g({meta:{key:"workflow-system",version:"1.0.0",title:"Workflow System",description:"Workflow and approval system example for ContractSpec - State machine with role-based transitions",kind:"template",visibility:"public",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","workflow-system"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.workflow-system"}}),u=h;export{u as default,h as ExamplesWorkflowSystemExample};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{defineEnum as r0}from"@contractspec/lib.schema";var y=r0("ApprovalStatus",["PENDING","APPROVED","REJECTED","DELEGATED","ESCALATED","WITHDRAWN","EXPIRED"]),m=r0("ApprovalDecision",["APPROVE","REJECT","REQUEST_CHANGES","DELEGATE","ABSTAIN"]);import{defineEvent as A0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as g0,ScalarTypeEnum as J}from"@contractspec/lib.schema";var gA=g0({name:"ApprovalRequestedEventPayload",description:"Payload when approval is requested",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},workflowKey:{type:J.String_unsecure(),isOptional:!1},approverId:{type:J.String_unsecure(),isOptional:!1},approverRole:{type:J.String_unsecure(),isOptional:!0},title:{type:J.String_unsecure(),isOptional:!1},dueAt:{type:J.DateTime(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),_A=g0({name:"ApprovalDecidedEventPayload",description:"Payload when approval decision is made",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},decision:{type:J.String_unsecure(),isOptional:!1},decidedBy:{type:J.String_unsecure(),isOptional:!1},comment:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),DA=g0({name:"ApprovalDelegatedEventPayload",description:"Payload when approval is delegated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},fromUserId:{type:J.String_unsecure(),isOptional:!1},toUserId:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),RA=g0({name:"ApprovalEscalatedEventPayload",description:"Payload when approval is escalated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},escalationLevel:{type:J.Int_unsecure(),isOptional:!1},escalatedTo:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!1},timestamp:{type:J.DateTime(),isOptional:!1}}}),LA=A0({meta:{key:"workflow.approval.requested",version:"1.0.0",description:"An approval has been requested.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","requested"]},payload:gA}),ZA=A0({meta:{key:"workflow.approval.decided",version:"1.0.0",description:"An approval decision has been made.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","decided"]},payload:_A}),OA=A0({meta:{key:"workflow.approval.delegated",version:"1.0.0",description:"An approval has been delegated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","delegated"]},payload:DA}),IA=A0({meta:{key:"workflow.approval.escalated",version:"1.0.0",description:"An approval has been escalated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","escalated"]},payload:RA});var zg={workflows:new Map,steps:new Map,instances:new Map,approvals:new Map,stepExecutions:new Map};class w0{canTransition(A,_,g,R){if(_.status!=="RUNNING"&&_.status!=="WAITING")return{allowed:!1,reason:`Workflow is ${_.status}, cannot transition`};let O=A.steps[_.currentStepKey];if(!O)return{allowed:!1,reason:`Step ${_.currentStepKey} not found`};let P=O.transitions[g];if(!P)return{allowed:!1,reason:`Action ${g} not available in step ${_.currentStepKey}`};if(O.allowedRoles&&O.allowedRoles.length>0){if(!O.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:"User lacks required role for this action"}}if(typeof P==="object"&&P.allowedRoles&&P.allowedRoles.length>0){if(!P.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:`User lacks required role for action ${g}`}}return{allowed:!0}}getAvailableActions(A,_,g){if(_.status!=="RUNNING"&&_.status!=="WAITING")return[];let R=A.steps[_.currentStepKey];if(!R)return[];return Object.keys(R.transitions).filter((O)=>{return this.canTransition(A,_,O,g).allowed})}transition(A,_,g,R){let O=this.canTransition(A,_,g,R);if(!O.allowed)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:O.reason};let P=A.steps[_.currentStepKey];if(!P)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Current step ${_.currentStepKey} not found`};let Z=P.transitions[g];if(!Z)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Transition for action ${g} not found`};let D=typeof Z==="string"?Z:Z.targetStepKey,H=A.steps[D];if(!H)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Target step ${D} not found`};let G="RUNNING";if(H.type==="END")G="COMPLETED";else if(H.type==="APPROVAL"||H.type==="WAIT")G="WAITING";return{success:!0,previousStepKey:_.currentStepKey,currentStepKey:D,status:G}}evaluateCondition(A,_){try{let g=A.match(/^(\w+)\s*(>=|<=|>|<|===|!==|==|!=)\s*(.+)$/);if(g){let[,R,O,P]=g;if(!R||!O||P===void 0)return!1;let Z=_[R],D=JSON.parse(P);switch(O){case">":return Number(Z)>Number(D);case"<":return Number(Z)<Number(D);case">=":return Number(Z)>=Number(D);case"<=":return Number(Z)<=Number(D);case"===":case"==":return Z===D;case"!==":case"!=":return Z!==D}}if(A in _)return Boolean(_[A]);return!1}catch{return!1}}}function Wg(){return new w0}function dg(A,_){let g={};for(let P of _)g[P.key]={key:P.key,name:P.name,type:P.type,transitions:P.transitions,approvalMode:P.approvalMode,allowedRoles:P.approverRoles,timeoutSeconds:P.timeoutSeconds,conditionExpression:P.conditionExpression};let O=_.find((P)=>P.type==="START")?.key??_[0]?.key??"";return{key:A.key,name:A.name,version:A.version,initialStepKey:O,steps:g}}function bg(A,_={}){return{currentStepKey:A.initialStepKey,status:"RUNNING",contextData:_,history:[]}}import{defineSchemaModel as T0,ScalarTypeEnum as k}from"@contractspec/lib.schema";var b=T0({name:"ApprovalRequestModel",description:"An approval request",fields:{id:{type:k.String_unsecure(),isOptional:!1},workflowInstanceId:{type:k.String_unsecure(),isOptional:!1},stepExecutionId:{type:k.String_unsecure(),isOptional:!1},approverId:{type:k.String_unsecure(),isOptional:!1},approverRole:{type:k.String_unsecure(),isOptional:!0},title:{type:k.String_unsecure(),isOptional:!1},description:{type:k.String_unsecure(),isOptional:!0},status:{type:y,isOptional:!1},decision:{type:m,isOptional:!0},decisionComment:{type:k.String_unsecure(),isOptional:!0},decidedAt:{type:k.DateTime(),isOptional:!0},dueAt:{type:k.DateTime(),isOptional:!0},contextSnapshot:{type:k.JSON(),isOptional:!0},sequenceOrder:{type:k.Int_unsecure(),isOptional:!1},createdAt:{type:k.DateTime(),isOptional:!1}}}),_0=T0({name:"ApprovalCommentModel",description:"A comment on an approval",fields:{id:{type:k.String_unsecure(),isOptional:!1},approvalRequestId:{type:k.String_unsecure(),isOptional:!1},authorId:{type:k.String_unsecure(),isOptional:!1},content:{type:k.String_unsecure(),isOptional:!1},isInternal:{type:k.Boolean(),isOptional:!1},createdAt:{type:k.DateTime(),isOptional:!1}}});import{defineCommand as K0,defineQuery as E0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as r,ScalarTypeEnum as $}from"@contractspec/lib.schema";var o=["@example.workflow-system"],PA=K0({meta:{key:"workflow.approval.decide",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","decision"],description:"Submit an approval decision (approve/reject).",goal:"Allow approvers to make decisions on requests.",context:"Approval inbox, workflow detail."},io:{input:r({name:"ApproveRejectInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1},decision:{type:m,isOptional:!1},comment:{type:$.String_unsecure(),isOptional:!0},data:{type:$.JSON(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.decided",version:"1.0.0",when:"Decision is made",payload:b}],audit:["workflow.approval.decided"]},acceptance:{scenarios:[{key:"approve-request-happy-path",given:["Approval request is pending","User is assignee"],when:["User approves request"],then:["Request is approved","ApprovalDecided event is emitted"]}],examples:[{key:"approve-basic",input:{requestId:"req-123",decision:"approve",comment:"Looks good"},output:{id:"req-123",status:"approved"}}]}}),CA=K0({meta:{key:"workflow.approval.delegate",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","delegate"],description:"Delegate an approval request to another user.",goal:"Allow approvers to pass approval to others.",context:"Approval inbox."},io:{input:r({name:"DelegateInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1},delegateTo:{type:$.String_unsecure(),isOptional:!1},reason:{type:$.String_unsecure(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.delegated",version:"1.0.0",when:"Approval is delegated",payload:b}],audit:["workflow.approval.delegated"]},acceptance:{scenarios:[{key:"delegate-approval-happy-path",given:["Approval request is pending","User is assignee"],when:["User delegates to another user"],then:["Assignee is updated","ApprovalDelegated event is emitted"]}],examples:[{key:"delegate-to-manager",input:{requestId:"req-123",delegateTo:"user-456",reason:"Out of office"},output:{id:"req-123",assigneeId:"user-456"}}]}}),NA=K0({meta:{key:"workflow.approval.comment.add",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","comment"],description:"Add a comment to an approval request.",goal:"Allow discussion on approval requests.",context:"Approval detail view."},io:{input:r({name:"AddCommentInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1},content:{type:$.NonEmptyString(),isOptional:!1},isInternal:{type:$.Boolean(),isOptional:!0}}}),output:_0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.comment.added",version:"1.0.0",when:"Comment is added",payload:_0}]},acceptance:{scenarios:[{key:"add-comment-happy-path",given:["Approval request exists"],when:["User adds a comment"],then:["Comment is added","CommentAdded event is emitted"]}],examples:[{key:"add-question",input:{requestId:"req-123",content:"Can you clarify budget?",isInternal:!1},output:{id:"com-789",content:"Can you clarify budget?"}}]}}),GA=E0({meta:{key:"workflow.approval.list.mine",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","list","inbox"],description:"List approval requests assigned to current user.",goal:"Show pending approvals in user inbox.",context:"Approval inbox, dashboard widget."},io:{input:r({name:"ListMyApprovalsInput",fields:{status:{type:y,isOptional:!0},limit:{type:$.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:$.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:r({name:"ListMyApprovalsOutput",fields:{requests:{type:b,isArray:!0,isOptional:!1},total:{type:$.Int_unsecure(),isOptional:!1},pendingCount:{type:$.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-approvals-happy-path",given:["User has assigned approvals"],when:["User lists approvals"],then:["List of requests is returned"]}],examples:[{key:"list-pending",input:{status:"pending",limit:10},output:{requests:[],total:2,pendingCount:2}}]}}),UA=E0({meta:{key:"workflow.approval.get",version:"1.0.0",stability:"stable",owners:[...o],tags:["workflow","approval","get"],description:"Get an approval request with details.",goal:"View approval request details.",context:"Approval detail view."},io:{input:r({name:"GetApprovalInput",fields:{requestId:{type:$.String_unsecure(),isOptional:!1}}}),output:b},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-approval-happy-path",given:["Approval request exists"],when:["User requests approval details"],then:["Approval details are returned"]}],examples:[{key:"get-basic",input:{requestId:"req-123"},output:{id:"req-123",status:"pending"}}]}});import{web as FA}from"@contractspec/lib.runtime-sandbox";var{generateId:S}=FA;function p0(A){return{id:A.id,projectId:A.projectId,organizationId:A.organizationId,name:A.name,description:A.description??void 0,type:A.type,status:A.status,createdAt:new Date(A.createdAt),updatedAt:new Date(A.updatedAt)}}function y0(A){return{id:A.id,definitionId:A.definitionId,name:A.name,description:A.description??void 0,stepOrder:A.stepOrder,type:A.type,requiredRoles:A.requiredRoles?JSON.parse(A.requiredRoles):[],autoApproveCondition:A.autoApproveCondition??void 0,timeoutHours:A.timeoutHours??void 0,createdAt:new Date(A.createdAt)}}function D0(A){return{id:A.id,projectId:A.projectId,definitionId:A.definitionId,status:A.status,currentStepId:A.currentStepId??void 0,data:A.data?JSON.parse(A.data):void 0,requestedBy:A.requestedBy,startedAt:new Date(A.startedAt),completedAt:A.completedAt?new Date(A.completedAt):void 0}}function JA(A){return{id:A.id,instanceId:A.instanceId,stepId:A.stepId,status:A.status,actorId:A.actorId??void 0,comment:A.comment??void 0,decidedAt:A.decidedAt?new Date(A.decidedAt):void 0,createdAt:new Date(A.createdAt)}}function sg(A){function _(L){let F=0;return L.replace(/\?/g,()=>`$${++F}`)}async function g(L,F=[]){return(await A.query(_(L),F)).rows}async function R(L,F=[]){await A.execute(_(L),F)}async function O(L){let{projectId:F,status:N,search:Y,limit:X=20,offset:q=0}=L,W='WHERE "projectId" = ?',d=[F];if(N&&N!=="all")W+=" AND status = ?",d.push(N);if(Y)W+=" AND name LIKE ?",d.push(`%${Y}%`);let j0=(await g(`SELECT COUNT(*) as count FROM workflow_definition ${W}`,d))[0]?.count??0;return{definitions:(await g(`SELECT * FROM workflow_definition ${W} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`,[...d,X,q])).map(p0),total:j0}}async function P(L,F){let N=S("wfdef"),Y=new Date().toISOString();await R(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
3
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N,F.projectId,F.organizationId,L.name,L.description??null,L.type??"APPROVAL","DRAFT",Y,Y]);let
|
|
4
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[F,L.definitionId,L.name,L.description??null
|
|
2
|
+
import{defineEnum as r0}from"@contractspec/lib.schema";var y=r0("ApprovalStatus",["PENDING","APPROVED","REJECTED","DELEGATED","ESCALATED","WITHDRAWN","EXPIRED"]),o=r0("ApprovalDecision",["APPROVE","REJECT","REQUEST_CHANGES","DELEGATE","ABSTAIN"]);import{defineEvent as A0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as g0,ScalarTypeEnum as J}from"@contractspec/lib.schema";var gA=g0({name:"ApprovalRequestedEventPayload",description:"Payload when approval is requested",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},workflowKey:{type:J.String_unsecure(),isOptional:!1},approverId:{type:J.String_unsecure(),isOptional:!1},approverRole:{type:J.String_unsecure(),isOptional:!0},title:{type:J.String_unsecure(),isOptional:!1},dueAt:{type:J.DateTime(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),_A=g0({name:"ApprovalDecidedEventPayload",description:"Payload when approval decision is made",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},decision:{type:J.String_unsecure(),isOptional:!1},decidedBy:{type:J.String_unsecure(),isOptional:!1},comment:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),DA=g0({name:"ApprovalDelegatedEventPayload",description:"Payload when approval is delegated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},fromUserId:{type:J.String_unsecure(),isOptional:!1},toUserId:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!0},timestamp:{type:J.DateTime(),isOptional:!1}}}),RA=g0({name:"ApprovalEscalatedEventPayload",description:"Payload when approval is escalated",fields:{requestId:{type:J.String_unsecure(),isOptional:!1},instanceId:{type:J.String_unsecure(),isOptional:!1},escalationLevel:{type:J.Int_unsecure(),isOptional:!1},escalatedTo:{type:J.String_unsecure(),isOptional:!1},reason:{type:J.String_unsecure(),isOptional:!1},timestamp:{type:J.DateTime(),isOptional:!1}}}),LA=A0({meta:{key:"workflow.approval.requested",version:"1.0.0",description:"An approval has been requested.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","requested"]},payload:gA}),ZA=A0({meta:{key:"workflow.approval.decided",version:"1.0.0",description:"An approval decision has been made.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","decided"]},payload:_A}),OA=A0({meta:{key:"workflow.approval.delegated",version:"1.0.0",description:"An approval has been delegated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","delegated"]},payload:DA}),IA=A0({meta:{key:"workflow.approval.escalated",version:"1.0.0",description:"An approval has been escalated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","approval","escalated"]},payload:RA});var Wg={workflows:new Map,steps:new Map,instances:new Map,approvals:new Map,stepExecutions:new Map};class w0{canTransition(A,_,g,R){if(_.status!=="RUNNING"&&_.status!=="WAITING")return{allowed:!1,reason:`Workflow is ${_.status}, cannot transition`};let O=A.steps[_.currentStepKey];if(!O)return{allowed:!1,reason:`Step ${_.currentStepKey} not found`};let P=O.transitions[g];if(!P)return{allowed:!1,reason:`Action ${g} not available in step ${_.currentStepKey}`};if(O.allowedRoles&&O.allowedRoles.length>0){if(!O.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:"User lacks required role for this action"}}if(typeof P==="object"&&P.allowedRoles&&P.allowedRoles.length>0){if(!P.allowedRoles.some((D)=>R.userRoles.includes(D)))return{allowed:!1,reason:`User lacks required role for action ${g}`}}return{allowed:!0}}getAvailableActions(A,_,g){if(_.status!=="RUNNING"&&_.status!=="WAITING")return[];let R=A.steps[_.currentStepKey];if(!R)return[];return Object.keys(R.transitions).filter((O)=>{return this.canTransition(A,_,O,g).allowed})}transition(A,_,g,R){let O=this.canTransition(A,_,g,R);if(!O.allowed)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:O.reason};let P=A.steps[_.currentStepKey];if(!P)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Current step ${_.currentStepKey} not found`};let Z=P.transitions[g];if(!Z)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Transition for action ${g} not found`};let D=typeof Z==="string"?Z:Z.targetStepKey,H=A.steps[D];if(!H)return{success:!1,previousStepKey:_.currentStepKey,currentStepKey:_.currentStepKey,status:_.status,error:`Target step ${D} not found`};let G="RUNNING";if(H.type==="END")G="COMPLETED";else if(H.type==="APPROVAL"||H.type==="WAIT")G="WAITING";return{success:!0,previousStepKey:_.currentStepKey,currentStepKey:D,status:G}}evaluateCondition(A,_){try{let g=A.match(/^(\w+)\s*(>=|<=|>|<|===|!==|==|!=)\s*(.+)$/);if(g){let[,R,O,P]=g;if(!R||!O||P===void 0)return!1;let Z=_[R],D=JSON.parse(P);switch(O){case">":return Number(Z)>Number(D);case"<":return Number(Z)<Number(D);case">=":return Number(Z)>=Number(D);case"<=":return Number(Z)<=Number(D);case"===":case"==":return Z===D;case"!==":case"!=":return Z!==D}}if(A in _)return Boolean(_[A]);return!1}catch{return!1}}}function bg(){return new w0}function xg(A,_){let g={};for(let P of _)g[P.key]={key:P.key,name:P.name,type:P.type,transitions:P.transitions,approvalMode:P.approvalMode,allowedRoles:P.approverRoles,timeoutSeconds:P.timeoutSeconds,conditionExpression:P.conditionExpression};let O=_.find((P)=>P.type==="START")?.key??_[0]?.key??"";return{key:A.key,name:A.name,version:A.version,initialStepKey:O,steps:g}}function Mg(A,_={}){return{currentStepKey:A.initialStepKey,status:"RUNNING",contextData:_,history:[]}}import{defineSchemaModel as T0,ScalarTypeEnum as X}from"@contractspec/lib.schema";var b=T0({name:"ApprovalRequestModel",description:"An approval request",fields:{id:{type:X.String_unsecure(),isOptional:!1},workflowInstanceId:{type:X.String_unsecure(),isOptional:!1},stepExecutionId:{type:X.String_unsecure(),isOptional:!1},approverId:{type:X.String_unsecure(),isOptional:!1},approverRole:{type:X.String_unsecure(),isOptional:!0},title:{type:X.String_unsecure(),isOptional:!1},description:{type:X.String_unsecure(),isOptional:!0},status:{type:y,isOptional:!1},decision:{type:o,isOptional:!0},decisionComment:{type:X.String_unsecure(),isOptional:!0},decidedAt:{type:X.DateTime(),isOptional:!0},dueAt:{type:X.DateTime(),isOptional:!0},contextSnapshot:{type:X.JSON(),isOptional:!0},sequenceOrder:{type:X.Int_unsecure(),isOptional:!1},createdAt:{type:X.DateTime(),isOptional:!1}}}),_0=T0({name:"ApprovalCommentModel",description:"A comment on an approval",fields:{id:{type:X.String_unsecure(),isOptional:!1},approvalRequestId:{type:X.String_unsecure(),isOptional:!1},authorId:{type:X.String_unsecure(),isOptional:!1},content:{type:X.String_unsecure(),isOptional:!1},isInternal:{type:X.Boolean(),isOptional:!1},createdAt:{type:X.DateTime(),isOptional:!1}}});import{defineCommand as K0,defineQuery as E0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as r,ScalarTypeEnum as k}from"@contractspec/lib.schema";var m=["@example.workflow-system"],PA=K0({meta:{key:"workflow.approval.decide",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","decision"],description:"Submit an approval decision (approve/reject).",goal:"Allow approvers to make decisions on requests.",context:"Approval inbox, workflow detail."},io:{input:r({name:"ApproveRejectInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1},decision:{type:o,isOptional:!1},comment:{type:k.String_unsecure(),isOptional:!0},data:{type:k.JSON(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.decided",version:"1.0.0",when:"Decision is made",payload:b}],audit:["workflow.approval.decided"]},acceptance:{scenarios:[{key:"approve-request-happy-path",given:["Approval request is pending","User is assignee"],when:["User approves request"],then:["Request is approved","ApprovalDecided event is emitted"]}],examples:[{key:"approve-basic",input:{requestId:"req-123",decision:"approve",comment:"Looks good"},output:{id:"req-123",status:"approved"}}]}}),CA=K0({meta:{key:"workflow.approval.delegate",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","delegate"],description:"Delegate an approval request to another user.",goal:"Allow approvers to pass approval to others.",context:"Approval inbox."},io:{input:r({name:"DelegateInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1},delegateTo:{type:k.String_unsecure(),isOptional:!1},reason:{type:k.String_unsecure(),isOptional:!0}}}),output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.delegated",version:"1.0.0",when:"Approval is delegated",payload:b}],audit:["workflow.approval.delegated"]},acceptance:{scenarios:[{key:"delegate-approval-happy-path",given:["Approval request is pending","User is assignee"],when:["User delegates to another user"],then:["Assignee is updated","ApprovalDelegated event is emitted"]}],examples:[{key:"delegate-to-manager",input:{requestId:"req-123",delegateTo:"user-456",reason:"Out of office"},output:{id:"req-123",assigneeId:"user-456"}}]}}),NA=K0({meta:{key:"workflow.approval.comment.add",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","comment"],description:"Add a comment to an approval request.",goal:"Allow discussion on approval requests.",context:"Approval detail view."},io:{input:r({name:"AddCommentInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1},content:{type:k.NonEmptyString(),isOptional:!1},isInternal:{type:k.Boolean(),isOptional:!0}}}),output:_0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.approval.comment.added",version:"1.0.0",when:"Comment is added",payload:_0}]},acceptance:{scenarios:[{key:"add-comment-happy-path",given:["Approval request exists"],when:["User adds a comment"],then:["Comment is added","CommentAdded event is emitted"]}],examples:[{key:"add-question",input:{requestId:"req-123",content:"Can you clarify budget?",isInternal:!1},output:{id:"com-789",content:"Can you clarify budget?"}}]}}),GA=E0({meta:{key:"workflow.approval.list.mine",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","list","inbox"],description:"List approval requests assigned to current user.",goal:"Show pending approvals in user inbox.",context:"Approval inbox, dashboard widget."},io:{input:r({name:"ListMyApprovalsInput",fields:{status:{type:y,isOptional:!0},limit:{type:k.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:k.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:r({name:"ListMyApprovalsOutput",fields:{requests:{type:b,isArray:!0,isOptional:!1},total:{type:k.Int_unsecure(),isOptional:!1},pendingCount:{type:k.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-approvals-happy-path",given:["User has assigned approvals"],when:["User lists approvals"],then:["List of requests is returned"]}],examples:[{key:"list-pending",input:{status:"pending",limit:10},output:{requests:[],total:2,pendingCount:2}}]}}),UA=E0({meta:{key:"workflow.approval.get",version:"1.0.0",stability:"stable",owners:[...m],tags:["workflow","approval","get"],description:"Get an approval request with details.",goal:"View approval request details.",context:"Approval detail view."},io:{input:r({name:"GetApprovalInput",fields:{requestId:{type:k.String_unsecure(),isOptional:!1}}}),output:b},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-approval-happy-path",given:["Approval request exists"],when:["User requests approval details"],then:["Approval details are returned"]}],examples:[{key:"get-basic",input:{requestId:"req-123"},output:{id:"req-123",status:"pending"}}]}});import{defineExample as FA}from"@contractspec/lib.contracts-spec/examples";var JA=FA({meta:{key:"workflow-system",version:"1.0.0",title:"Workflow System",description:"Workflow and approval system example for ContractSpec - State machine with role-based transitions",kind:"template",visibility:"public",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","workflow-system"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.workflow-system"}}),ig=JA;import{web as VA}from"@contractspec/lib.runtime-sandbox";var{generateId:S}=VA;function p0(A){return{id:A.id,projectId:A.projectId,organizationId:A.organizationId,name:A.name,description:A.description??void 0,type:A.type,status:A.status,createdAt:new Date(A.createdAt),updatedAt:new Date(A.updatedAt)}}function y0(A){return{id:A.id,definitionId:A.definitionId,name:A.name,description:A.description??void 0,stepOrder:A.stepOrder,type:A.type,requiredRoles:A.requiredRoles?JSON.parse(A.requiredRoles):[],autoApproveCondition:A.autoApproveCondition??void 0,timeoutHours:A.timeoutHours??void 0,createdAt:new Date(A.createdAt)}}function D0(A){return{id:A.id,projectId:A.projectId,definitionId:A.definitionId,status:A.status,currentStepId:A.currentStepId??void 0,data:A.data?JSON.parse(A.data):void 0,requestedBy:A.requestedBy,startedAt:new Date(A.startedAt),completedAt:A.completedAt?new Date(A.completedAt):void 0}}function HA(A){return{id:A.id,instanceId:A.instanceId,stepId:A.stepId,status:A.status,actorId:A.actorId??void 0,comment:A.comment??void 0,decidedAt:A.decidedAt?new Date(A.decidedAt):void 0,createdAt:new Date(A.createdAt)}}function eg(A){function _(L){let F=0;return L.replace(/\?/g,()=>`$${++F}`)}async function g(L,F=[]){return(await A.query(_(L),F)).rows}async function R(L,F=[]){await A.execute(_(L),F)}async function O(L){let{projectId:F,status:N,search:Y,limit:$=20,offset:q=0}=L,W='WHERE "projectId" = ?',d=[F];if(N&&N!=="all")W+=" AND status = ?",d.push(N);if(Y)W+=" AND name LIKE ?",d.push(`%${Y}%`);let j0=(await g(`SELECT COUNT(*) as count FROM workflow_definition ${W}`,d))[0]?.count??0;return{definitions:(await g(`SELECT * FROM workflow_definition ${W} ORDER BY "updatedAt" DESC LIMIT ? OFFSET ?`,[...d,$,q])).map(p0),total:j0}}async function P(L,F){let N=S("wfdef"),Y=new Date().toISOString();await R(`INSERT INTO workflow_definition (id, "projectId", "organizationId", name, description, type, status, "createdAt", "updatedAt")
|
|
3
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N,F.projectId,F.organizationId,L.name,L.description??null,L.type??"APPROVAL","DRAFT",Y,Y]);let $=await g("SELECT * FROM workflow_definition WHERE id = ?",[N]);return p0($[0])}async function Z(L){let F=S("wfstep"),N=new Date().toISOString(),$=((await g('SELECT MAX("stepOrder") as maxOrder FROM workflow_step WHERE "definitionId" = ?',[L.definitionId]))[0]?.maxOrder??0)+1;await R(`INSERT INTO workflow_step (id, "definitionId", name, description, "stepOrder", type, "requiredRoles", "autoApproveCondition", "timeoutHours", "createdAt")
|
|
4
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[F,L.definitionId,L.name,L.description??null,$,L.type??"APPROVAL",JSON.stringify(L.requiredRoles),L.autoApproveCondition??null,L.timeoutHours??null,N]);let q=await g("SELECT * FROM workflow_step WHERE id = ?",[F]);return y0(q[0])}async function D(L){return(await g('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder"',[L])).map(y0)}async function H(L){let{projectId:F,definitionId:N,status:Y,requestedBy:$,limit:q=20,offset:W=0}=L,d='WHERE "projectId" = ?',f=[F];if(N)d+=' AND "definitionId" = ?',f.push(N);if(Y&&Y!=="all")d+=" AND status = ?",f.push(Y);if($)d+=' AND "requestedBy" = ?',f.push($);let f0=(await g(`SELECT COUNT(*) as count FROM workflow_instance ${d}`,f))[0]?.count??0;return{instances:(await g(`SELECT * FROM workflow_instance ${d} ORDER BY "startedAt" DESC LIMIT ? OFFSET ?`,[...f,q,W])).map(D0),total:f0}}async function G(L,F){let N=S("wfinst"),Y=new Date().toISOString(),q=(await g('SELECT * FROM workflow_step WHERE "definitionId" = ? ORDER BY "stepOrder" LIMIT 1',[L.definitionId]))[0]?.id??null;if(await R(`INSERT INTO workflow_instance (id, "projectId", "definitionId", status, "currentStepId", data, "requestedBy", "startedAt")
|
|
5
5
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[N,F.projectId,L.definitionId,q?"IN_PROGRESS":"PENDING",q,L.data?JSON.stringify(L.data):null,F.requestedBy,Y]),q)await R(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
6
|
-
VALUES (?, ?, ?, ?, ?)`,[S("wfappr"),N,q,"PENDING",Y]);let W=await g("SELECT * FROM workflow_instance WHERE id = ?",[N]);return D0(W[0])}async function n(L,F){let N=new Date().toISOString(),Y=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);if(!Y[0])throw Error("NOT_FOUND");let
|
|
7
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.comment??null,N,L.instanceId
|
|
6
|
+
VALUES (?, ?, ?, ?, ?)`,[S("wfappr"),N,q,"PENDING",Y]);let W=await g("SELECT * FROM workflow_instance WHERE id = ?",[N]);return D0(W[0])}async function n(L,F){let N=new Date().toISOString(),Y=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);if(!Y[0])throw Error("NOT_FOUND");let $=Y[0];await R(`UPDATE workflow_approval SET status = 'APPROVED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
7
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.comment??null,N,L.instanceId,$.currentStepId]);let q=await g("SELECT * FROM workflow_step WHERE id = ?",[$.currentStepId]),W=await g('SELECT * FROM workflow_step WHERE "definitionId" = ? AND "stepOrder" > ? ORDER BY "stepOrder" LIMIT 1',[$.definitionId,q[0]?.stepOrder??0]);if(W[0])await R('UPDATE workflow_instance SET "currentStepId" = ? WHERE id = ?',[W[0].id,L.instanceId]),await R(`INSERT INTO workflow_approval (id, "instanceId", "stepId", status, "createdAt")
|
|
8
8
|
VALUES (?, ?, ?, ?, ?)`,[S("wfappr"),L.instanceId,W[0].id,"PENDING",N]);else await R(`UPDATE workflow_instance SET status = 'COMPLETED', "currentStepId" = NULL, "completedAt" = ? WHERE id = ?`,[N,L.instanceId]);let d=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);return D0(d[0])}async function Y0(L,F){let N=new Date().toISOString(),Y=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);if(!Y[0])throw Error("NOT_FOUND");await R(`UPDATE workflow_approval SET status = 'REJECTED', "actorId" = ?, comment = ?, "decidedAt" = ?
|
|
9
|
-
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.reason,N,L.instanceId,Y[0].currentStepId]),await R(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`,[N,L.instanceId]);let X=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);return D0(X[0])}async function a(L){return(await g('SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"',[L])).map(JA)}return{listDefinitions:O,createDefinition:P,addStep:Z,getSteps:D,listInstances:H,startInstance:G,approveStep:n,rejectStep:Y0,getApprovals:a}}import{defineEnum as VA}from"@contractspec/lib.schema";var t=VA("InstanceStatus",["PENDING","RUNNING","WAITING","PAUSED","COMPLETED","CANCELLED","FAILED","TIMEOUT"]);import{defineEvent as h}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as k0,ScalarTypeEnum as V}from"@contractspec/lib.schema";var w=k0({name:"InstanceEventPayload",description:"Base payload for instance events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},status:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},triggeredBy:{type:V.String_unsecure(),isOptional:!1},organizationId:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),m0=k0({name:"StepTransitionEventPayload",description:"Payload for step transition events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},fromStepKey:{type:V.String_unsecure(),isOptional:!0},toStepKey:{type:V.String_unsecure(),isOptional:!1},action:{type:V.String_unsecure(),isOptional:!0},executedBy:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),HA=k0({name:"InstanceCompletedEventPayload",description:"Payload when instance completes",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},outcome:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},duration:{type:V.Int_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),YA=h({meta:{key:"workflow.instance.started",version:"1.0.0",description:"A new workflow instance has been started.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","started"]},payload:w}),KA=h({meta:{key:"workflow.step.entered",version:"1.0.0",description:"A workflow instance has entered a new step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","entered"]},payload:m0}),kA=h({meta:{key:"workflow.step.exited",version:"1.0.0",description:"A workflow instance has exited a step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","exited"]},payload:m0}),XA=h({meta:{key:"workflow.instance.completed",version:"1.0.0",description:"A workflow instance has completed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","completed"]},payload:HA}),$A=h({meta:{key:"workflow.instance.cancelled",version:"1.0.0",description:"A workflow instance has been cancelled.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","cancelled"]},payload:w}),QA=h({meta:{key:"workflow.instance.paused",version:"1.0.0",description:"A workflow instance has been paused.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","paused"]},payload:w}),BA=h({meta:{key:"workflow.instance.resumed",version:"1.0.0",description:"A workflow instance has been resumed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","resumed"]},payload:w}),vA=h({meta:{key:"workflow.instance.failed",version:"1.0.0",description:"A workflow instance has failed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","failed"]},payload:w}),zA=h({meta:{key:"workflow.instance.timedOut",version:"1.0.0",description:"A workflow instance has timed out.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","timeout"]},payload:w});import{defineSchemaModel as R0,ScalarTypeEnum as U}from"@contractspec/lib.schema";var K=R0({name:"WorkflowInstanceModel",description:"A running workflow instance",fields:{id:{type:U.String_unsecure(),isOptional:!1},workflowDefinitionId:{type:U.String_unsecure(),isOptional:!1},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!1},currentStepId:{type:U.String_unsecure(),isOptional:!0},contextData:{type:U.JSON(),isOptional:!0},triggeredBy:{type:U.String_unsecure(),isOptional:!1},organizationId:{type:U.String_unsecure(),isOptional:!1},priority:{type:U.Int_unsecure(),isOptional:!1},dueAt:{type:U.DateTime(),isOptional:!0},outcome:{type:U.String_unsecure(),isOptional:!0},resultData:{type:U.JSON(),isOptional:!0},errorMessage:{type:U.String_unsecure(),isOptional:!0},createdAt:{type:U.DateTime(),isOptional:!1},startedAt:{type:U.DateTime(),isOptional:!0},completedAt:{type:U.DateTime(),isOptional:!0}}}),X0=R0({name:"StartWorkflowInput",description:"Input for starting a workflow",fields:{workflowKey:{type:U.NonEmptyString(),isOptional:!1},contextData:{type:U.JSON(),isOptional:!0},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},priority:{type:U.Int_unsecure(),isOptional:!0},dueAt:{type:U.DateTime(),isOptional:!0}}}),$0=R0({name:"TransitionInput",description:"Input for transitioning a workflow",fields:{instanceId:{type:U.String_unsecure(),isOptional:!1},action:{type:U.NonEmptyString(),isOptional:!1},data:{type:U.JSON(),isOptional:!0},comment:{type:U.String_unsecure(),isOptional:!0}}}),Q0=R0({name:"TransitionResult",description:"Result of a workflow transition",fields:{success:{type:U.Boolean(),isOptional:!1},instance:{type:K,isOptional:!1},previousStepKey:{type:U.String_unsecure(),isOptional:!0},currentStepKey:{type:U.String_unsecure(),isOptional:!0},message:{type:U.String_unsecure(),isOptional:!0}}});import{defineCommand as s,defineQuery as o0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as T,ScalarTypeEnum as Q}from"@contractspec/lib.schema";var j=["@example.workflow-system"],qA=s({meta:{key:"workflow.instance.start",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","start"],description:"Start a new workflow instance.",goal:"Initiate a workflow for a business process.",context:"Order creation, request submission, etc."},io:{input:X0,output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.started",version:"1.0.0",when:"Workflow starts",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"First step entered",payload:K}],audit:["workflow.instance.started"]},acceptance:{scenarios:[{key:"start-workflow-happy-path",given:["Workflow definition exists"],when:["User starts workflow"],then:["Instance is created and started"]}],examples:[{key:"start-onboarding",input:{workflowKey:"onboarding-v1",context:{employeeId:"emp-123"}},output:{id:"inst-456",status:"running"}}]}}),WA=s({meta:{key:"workflow.instance.transition",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","transition","state-machine"],description:"Transition a workflow instance to the next step.",goal:"Move workflow forward based on action.",context:"Task completion, approval decisions."},io:{input:$0,output:Q0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.exited",version:"1.0.0",when:"Step is exited",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"New step is entered",payload:K},{key:"workflow.instance.completed",version:"1.0.0",when:"Workflow reaches end",payload:K}],audit:["workflow.instance.transitioned"]},acceptance:{scenarios:[{key:"transition-workflow-happy-path",given:["Workflow instance is waiting at step"],when:["User provides input"],then:["Instance moves to next step"]}],examples:[{key:"complete-task",input:{instanceId:"inst-456",action:"complete",data:{approved:!0}},output:{success:!0,nextStep:"notify-hr"}}]}}),dA=s({meta:{key:"workflow.instance.pause",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","pause"],description:"Pause a running workflow instance.",goal:"Temporarily halt workflow execution.",context:"Administrative action, emergency stop."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.paused",version:"1.0.0",when:"Workflow is paused",payload:K}],audit:["workflow.instance.paused"]},acceptance:{scenarios:[{key:"pause-workflow-happy-path",given:["Workflow is running"],when:["Admin pauses workflow"],then:["Instance status becomes PAUSED"]}],examples:[{key:"pause-maintenance",input:{instanceId:"inst-456",reason:"System maintenance"},output:{id:"inst-456",status:"paused"}}]}}),bA=s({meta:{key:"workflow.instance.resume",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","resume"],description:"Resume a paused workflow instance.",goal:"Continue workflow execution.",context:"Administrative action."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.resumed",version:"1.0.0",when:"Workflow is resumed",payload:K}],audit:["workflow.instance.resumed"]},acceptance:{scenarios:[{key:"resume-workflow-happy-path",given:["Workflow is paused"],when:["Admin resumes workflow"],then:["Instance status becomes RUNNING"]}],examples:[{key:"resume-normal",input:{instanceId:"inst-456",reason:"Issue resolved"},output:{id:"inst-456",status:"running"}}]}}),xA=s({meta:{key:"workflow.instance.cancel",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","cancel"],description:"Cancel a workflow instance.",goal:"Terminate workflow without completion.",context:"User request, system cancellation."},io:{input:T({name:"CancelWorkflowInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.cancelled",version:"1.0.0",when:"Workflow is cancelled",payload:K}],audit:["workflow.instance.cancelled"]},acceptance:{scenarios:[{key:"cancel-workflow-happy-path",given:["Workflow is running"],when:["User cancels workflow"],then:["Instance status becomes CANCELLED"]}],examples:[{key:"cancel-mistake",input:{instanceId:"inst-456",reason:"Created by mistake"},output:{id:"inst-456",status:"cancelled"}}]}}),MA=o0({meta:{key:"workflow.instance.list",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","list"],description:"List workflow instances with filtering.",goal:"Browse and search running workflows.",context:"Dashboard, monitoring."},io:{input:T({name:"ListInstancesInput",fields:{workflowKey:{type:Q.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!0},referenceType:{type:Q.String_unsecure(),isOptional:!0},referenceId:{type:Q.String_unsecure(),isOptional:!0},triggeredBy:{type:Q.String_unsecure(),isOptional:!0},limit:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:T({name:"ListInstancesOutput",fields:{instances:{type:K,isArray:!0,isOptional:!1},total:{type:Q.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-instances-happy-path",given:["Workflow instances exist"],when:["User lists instances"],then:["List of instances is returned"]}],examples:[{key:"list-running",input:{status:"running",limit:10},output:{instances:[],total:5}}]}}),hA=o0({meta:{key:"workflow.instance.get",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","get"],description:"Get a workflow instance with details.",goal:"View workflow instance details.",context:"Instance detail view."},io:{input:T({name:"GetInstanceInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-instance-happy-path",given:["Instance exists"],when:["User requests instance details"],then:["Instance details are returned"]}],examples:[{key:"get-details",input:{instanceId:"inst-456"},output:{id:"inst-456",workflowKey:"onboarding-v1"}}]}});import{defineEnum as L0}from"@contractspec/lib.schema";var c=L0("WorkflowStatus",["DRAFT","ACTIVE","DEPRECATED","ARCHIVED"]),u=L0("WorkflowTriggerType",["MANUAL","EVENT","SCHEDULED","API"]),Z0=L0("StepType",["START","APPROVAL","TASK","CONDITION","PARALLEL","WAIT","ACTION","END"]),O0=L0("ApprovalMode",["ANY","ALL","MAJORITY","SEQUENTIAL"]);import{defineSchemaModel as i,ScalarTypeEnum as I}from"@contractspec/lib.schema";var l=i({name:"WorkflowStepModel",description:"A step in a workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!1},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0}}}),B=i({name:"WorkflowDefinitionModel",description:"A workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},version:{type:I.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1},triggerType:{type:u,isOptional:!1},initialStepId:{type:I.String_unsecure(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},organizationId:{type:I.String_unsecure(),isOptional:!1},createdAt:{type:I.DateTime(),isOptional:!1},updatedAt:{type:I.DateTime(),isOptional:!1},steps:{type:l,isArray:!0,isOptional:!0}}}),B0=i({name:"CreateWorkflowInput",description:"Input for creating a workflow definition",fields:{name:{type:I.NonEmptyString(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),v0=i({name:"UpdateWorkflowInput",description:"Input for updating a workflow definition",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!0},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),z0=i({name:"AddStepInput",description:"Input for adding a step to a workflow",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!0},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0},approverUserIds:{type:I.String_unsecure(),isArray:!0,isOptional:!0},timeoutSeconds:{type:I.Int_unsecure(),isOptional:!0},slaSeconds:{type:I.Int_unsecure(),isOptional:!0}}});import{definePresentation as x,StabilityEnum as M}from"@contractspec/lib.contracts-spec";var jA=x({meta:{key:"workflow.designer",version:"1.0.0",title:"Workflow Designer",description:"Visual workflow designer with drag-and-drop steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","designer","admin"],stability:M.Experimental,goal:"Building and modifying workflow definitions",context:"Workflow administration and setup"},source:{type:"component",framework:"react",componentKey:"WorkflowDesigner",props:B},targets:["react"],policy:{flags:["workflow.designer.enabled"]}}),fA=x({meta:{key:"workflow.definition.viewList",version:"1.0.0",title:"Workflow List",description:"List of workflow definitions with status and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","list","admin"],stability:M.Experimental,goal:"Overview of all defined workflows",context:"Workflow management dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionList",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),rA=x({meta:{key:"workflow.definition.detail",version:"1.0.0",title:"Workflow Details",description:"Detailed view of a workflow definition with steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","detail"],stability:M.Experimental,goal:"Viewing technical details of a workflow definition",context:"Workflow inspection and debugging"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionDetail",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),wA=x({meta:{key:"workflow.instance.viewList",version:"1.0.0",title:"Instance List",description:"List of workflow instances with status and progress",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","list"],stability:M.Experimental,goal:"Monitoring active and past workflow executions",context:"Operations monitoring"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceList",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),TA=x({meta:{key:"workflow.instance.detail",version:"1.0.0",title:"Instance Details",description:"Detailed view of a workflow instance with step timeline",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","detail","timeline"],stability:M.Experimental,goal:"Detailed inspection of a specific workflow instance",context:"Case management and troubleshooting"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceDetail",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),EA=x({meta:{key:"workflow.instance.progress",version:"1.0.0",title:"Progress Tracker",description:"Visual progress tracker showing current step in workflow",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","progress","widget"],stability:M.Experimental,goal:"Quick view of current progress for a workflow",context:"Embedded progress indicator in entity views"},source:{type:"component",framework:"react",componentKey:"WorkflowProgressTracker",props:K},targets:["react"],policy:{flags:["workflow.enabled"]}}),pA=x({meta:{key:"workflow.approval.inbox",version:"1.0.0",title:"Approval Inbox",description:"Inbox showing pending approval requests for current user",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","inbox"],stability:M.Experimental,goal:"Managing personal workload of approval requests",context:"Personal task management"},source:{type:"component",framework:"react",componentKey:"ApprovalInbox",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),yA=x({meta:{key:"workflow.approval.detail",version:"1.0.0",title:"Approval Details",description:"Detailed approval request view with context and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","detail"],stability:M.Experimental,goal:"Decision support for an approval request",context:"Specific approval action"},source:{type:"component",framework:"react",componentKey:"ApprovalRequestDetail",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),mA=x({meta:{key:"workflow.approval.form",version:"1.0.0",title:"Approval Form",description:"Form for submitting approval decisions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","form"],stability:M.Experimental,goal:"Submitting a decision on an approval request",context:"Approval decision dialog"},source:{type:"component",framework:"react",componentKey:"ApprovalDecisionForm"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),oA=x({meta:{key:"workflow.approval.badge",version:"1.0.0",title:"Pending Approvals Badge",description:"Badge showing count of pending approvals",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","badge","widget"],stability:M.Experimental,goal:"Visual notification of pending approvals",context:"Global navigation or sidebar"},source:{type:"component",framework:"react",componentKey:"PendingApprovalsBadge"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),SA=x({meta:{key:"workflow.metrics",version:"1.0.0",title:"Workflow Metrics",description:"Dashboard widget showing workflow metrics and statistics",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","metrics","dashboard"],stability:M.Experimental,goal:"Monitoring throughput and bottlenecks",context:"System performance dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowMetricsDashboard"},targets:["react","markdown"],policy:{flags:["workflow.metrics.enabled"]}}),X2={WorkflowDesignerPresentation:jA,WorkflowListPresentation:fA,WorkflowDetailPresentation:rA,InstanceListPresentation:wA,InstanceDetailPresentation:TA,ProgressTrackerPresentation:EA,ApprovalInboxPresentation:pA,ApprovalDetailPresentation:yA,ApprovalFormPresentation:mA,PendingApprovalsBadgePresentation:oA,WorkflowMetricsPresentation:SA};import{useTemplateRuntime as tA}from"@contractspec/lib.example-shared-ui";import{useCallback as sA,useEffect as cA,useState as I0}from"react";function q0(A){let{handlers:_,projectId:g}=tA(),R=A??g,O=_.workflow,[P,Z]=I0([]),[D,H]=I0([]),[G,n]=I0(!0),[Y0,a]=I0(null),L=sA(async()=>{try{n(!0),a(null);let[N,Y]=await Promise.all([O.listDefinitions({projectId:R,limit:100}),O.listInstances({projectId:R,limit:100})]);Z(N.definitions),H(Y.instances)}catch(N){a(N instanceof Error?N:Error("Failed to load workflows"))}finally{n(!1)}},[R,O]);cA(()=>{L()},[L]);let F={totalDefinitions:P.length,activeDefinitions:P.filter((N)=>N.status==="ACTIVE").length,totalInstances:D.length,pendingInstances:D.filter((N)=>N.status==="PENDING").length,inProgressInstances:D.filter((N)=>N.status==="IN_PROGRESS").length,completedInstances:D.filter((N)=>N.status==="COMPLETED").length,rejectedInstances:D.filter((N)=>N.status==="REJECTED").length};return{definitions:P,instances:D,loading:G,error:Y0,stats:F,refetch:L}}var x2="workflow-system-demo",M2="org_demo",S0=[{id:"wf_expense",name:"Expense Approval",description:"Approve non-trivial spend before finance releases budget.",type:"APPROVAL",status:"ACTIVE",createdAt:"2026-03-10T09:00:00.000Z",updatedAt:"2026-03-20T08:15:00.000Z",steps:[{id:"wfstep_expense_manager",name:"Manager Review",description:"Validate business value and team budget.",stepOrder:1,type:"APPROVAL",requiredRoles:["manager"],createdAt:"2026-03-10T09:00:00.000Z"},{id:"wfstep_expense_finance",name:"Finance Review",description:"Confirm ledger coding and spending threshold.",stepOrder:2,type:"APPROVAL",requiredRoles:["finance"],createdAt:"2026-03-10T09:10:00.000Z"}]},{id:"wf_vendor",name:"Vendor Onboarding",description:"Sequence security, procurement, and legal before activation.",type:"SEQUENTIAL",status:"ACTIVE",createdAt:"2026-03-08T11:00:00.000Z",updatedAt:"2026-03-19T13:10:00.000Z",steps:[{id:"wfstep_vendor_security",name:"Security Check",description:"Review data access and integration scope.",stepOrder:1,type:"APPROVAL",requiredRoles:["security"],createdAt:"2026-03-08T11:00:00.000Z"},{id:"wfstep_vendor_procurement",name:"Procurement Check",description:"Validate pricing, procurement policy, and owner.",stepOrder:2,type:"APPROVAL",requiredRoles:["procurement"],createdAt:"2026-03-08T11:05:00.000Z"},{id:"wfstep_vendor_legal",name:"Legal Sign-off",description:"Approve terms before the vendor goes live.",stepOrder:3,type:"APPROVAL",requiredRoles:["legal"],createdAt:"2026-03-08T11:10:00.000Z"}]},{id:"wf_policy_exception",name:"Policy Exception",description:"Escalate a temporary exception through team lead and compliance.",type:"APPROVAL",status:"DRAFT",createdAt:"2026-03-15T07:30:00.000Z",updatedAt:"2026-03-18T11:20:00.000Z",steps:[{id:"wfstep_policy_lead",name:"Team Lead Review",description:"Check urgency and expected blast radius.",stepOrder:1,type:"APPROVAL",requiredRoles:["team-lead"],createdAt:"2026-03-15T07:30:00.000Z"},{id:"wfstep_policy_compliance",name:"Compliance Review",description:"Accept or reject the exception request.",stepOrder:2,type:"APPROVAL",requiredRoles:["compliance"],createdAt:"2026-03-15T07:40:00.000Z"}]}],t0=[{id:"wfinst_expense_open",definitionId:"wf_expense",status:"IN_PROGRESS",currentStepId:"wfstep_expense_finance",data:{amount:4200,currency:"EUR",vendor:"Nimbus AI"},requestedBy:"sarah@contractspec.io",startedAt:"2026-03-20T08:00:00.000Z",approvals:[{id:"wfappr_expense_manager",stepId:"wfstep_expense_manager",status:"APPROVED",actorId:"manager.demo",comment:"Approved for the Q2 automation budget.",decidedAt:"2026-03-20T08:15:00.000Z",createdAt:"2026-03-20T08:05:00.000Z"},{id:"wfappr_expense_finance",stepId:"wfstep_expense_finance",status:"PENDING",createdAt:"2026-03-20T08:15:00.000Z"}]},{id:"wfinst_vendor_done",definitionId:"wf_vendor",status:"COMPLETED",data:{vendor:"Acme Cloud",riskTier:"medium"},requestedBy:"leo@contractspec.io",startedAt:"2026-03-19T09:30:00.000Z",completedAt:"2026-03-19T13:10:00.000Z",approvals:[{id:"wfappr_vendor_security",stepId:"wfstep_vendor_security",status:"APPROVED",actorId:"security.demo",comment:"SOC2 scope is acceptable.",decidedAt:"2026-03-19T10:10:00.000Z",createdAt:"2026-03-19T09:35:00.000Z"},{id:"wfappr_vendor_procurement",stepId:"wfstep_vendor_procurement",status:"APPROVED",actorId:"procurement.demo",comment:"Commercial terms match the preferred vendor tier.",decidedAt:"2026-03-19T11:25:00.000Z",createdAt:"2026-03-19T10:15:00.000Z"},{id:"wfappr_vendor_legal",stepId:"wfstep_vendor_legal",status:"APPROVED",actorId:"legal.demo",comment:"MSA redlines are complete.",decidedAt:"2026-03-19T13:05:00.000Z",createdAt:"2026-03-19T11:30:00.000Z"}]},{id:"wfinst_policy_rejected",definitionId:"wf_policy_exception",status:"REJECTED",currentStepId:"wfstep_policy_compliance",data:{policy:"Model rollout freeze",durationDays:14},requestedBy:"maya@contractspec.io",startedAt:"2026-03-18T10:00:00.000Z",completedAt:"2026-03-18T11:20:00.000Z",approvals:[{id:"wfappr_policy_lead",stepId:"wfstep_policy_lead",status:"APPROVED",actorId:"lead.demo",comment:"Escalation justified for the release train.",decidedAt:"2026-03-18T10:30:00.000Z",createdAt:"2026-03-18T10:05:00.000Z"},{id:"wfappr_policy_compliance",stepId:"wfstep_policy_compliance",status:"REJECTED",actorId:"compliance.demo",comment:"Exception exceeds the allowed blast radius.",decidedAt:"2026-03-18T11:15:00.000Z",createdAt:"2026-03-18T10:35:00.000Z"}]}];import{defineVisualization as P0,VisualizationRegistry as uA}from"@contractspec/lib.contracts-spec/visualizations";var C0={key:"workflow.instance.list",version:"1.0.0"},N0={version:"1.0.0",domain:"workflow",stability:"experimental",owners:["@example.workflow-system"],tags:["workflow","visualization","operations"]},W0=P0({meta:{...N0,key:"workflow-system.visualization.instance-status",title:"Instance Status Breakdown",description:"Distribution of workflow instance states.",goal:"Surface the current workload mix.",context:"Workflow operations overview."},source:{primary:C0,resultPath:"data"},visualization:{kind:"pie",nameDimension:"status",valueMeasure:"instances",dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number"}],table:{caption:"Workflow instance counts by status."}}}),d0=P0({meta:{...N0,key:"workflow-system.visualization.throughput",title:"Run Throughput",description:"Daily workflow instance starts.",goal:"Show operational throughput over time.",context:"Workflow trend monitoring."},source:{primary:C0,resultPath:"data"},visualization:{kind:"cartesian",variant:"line",xDimension:"day",yMeasures:["instances"],dimensions:[{key:"day",label:"Day",dataPath:"day",type:"time"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number",color:"#0f766e"}],table:{caption:"Daily workflow instance starts."}}}),b0=P0({meta:{...N0,key:"workflow-system.visualization.active-work",title:"Active Work",description:"Current in-flight or pending workflow instances.",goal:"Expose active operational workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Active workflow count."}}}),x0=P0({meta:{...N0,key:"workflow-system.visualization.completed-work",title:"Completed Work",description:"Completed workflow instances in the current sample.",goal:"Show output against active workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Completed workflow count."}}}),s0=[W0,d0,b0,x0],f2=new uA([...s0]),c0=s0.map((A)=>({key:A.meta.key,version:A.meta.version}));function iA(A){return(A instanceof Date?A:new Date(A)).toISOString().slice(0,10)}function G0(A){let _=new Map,g=new Map,R=0,O=0;for(let D of A){_.set(D.status,(_.get(D.status)??0)+1);let H=iA(D.startedAt);if(g.set(H,(g.get(H)??0)+1),D.status==="PENDING"||D.status==="IN_PROGRESS")R+=1;if(D.status==="COMPLETED")O+=1}return{primaryItems:[{key:"workflow-status",spec:W0,data:{data:Array.from(_.entries()).map(([D,H])=>({status:D,instances:H}))},title:"Instance Status Breakdown",description:"Status mix across workflow instances.",height:260},{key:"workflow-throughput",spec:d0,data:{data:Array.from(g.entries()).sort(([D],[H])=>D.localeCompare(H)).map(([D,H])=>({day:D,instances:H}))},title:"Run Throughput",description:"Daily workflow starts from current instances."}],comparisonItems:[{key:"workflow-active",spec:b0,data:{data:[{value:R}]},title:"Active Work",description:"Pending and in-progress workflows.",height:200},{key:"workflow-completed",spec:x0,data:{data:[{value:O}]},title:"Completed Work",description:"Completed workflows in the current sample.",height:200}]}}var U0=S0,M0=t0,lA=new Map(U0.map((A)=>[A.id,A]));function u0(A){return new Date(A).toISOString().slice(0,10)}var eA={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowDashboard")throw Error("workflowDashboardMarkdownRenderer: not WorkflowDashboard");let _=U0,g=M0,R=G0(g),O=_.filter((D)=>D.status==="ACTIVE"),P=g.filter((D)=>D.status==="PENDING"||D.status==="IN_PROGRESS"),Z=["# Workflow Dashboard","","> Seeded workflow and approval overview for the sandbox demo.","","## Summary","","| Metric | Value |","|--------|-------|",`| Active Workflows | ${O.length} |`,`| Awaiting Action | ${P.length} |`,`| Completed | ${g.filter((D)=>D.status==="COMPLETED").length} |`,`| Rejected | ${g.filter((D)=>D.status==="REJECTED").length} |`,""];Z.push("## Visualization Overview"),Z.push("");for(let D of[...R.primaryItems,...R.comparisonItems])Z.push(`- **${D.title}** via \`${D.spec.meta.key}\``);if(Z.push(""),Z.push("## Active Workflow Definitions"),Z.push(""),O.length===0)Z.push("_No active workflow definitions._");else{Z.push("| Name | Type | Steps | Status |"),Z.push("|------|------|-------|--------|");for(let D of O)Z.push(`| ${D.name} | ${D.type} | ${D.steps.length} | ${D.status} |`)}if(Z.push(""),Z.push("## Recent Instances"),Z.push(""),g.length===0)Z.push("_No workflow instances._");else{Z.push("| Workflow | Requested By | Status | Started |"),Z.push("|----------|--------------|--------|---------|");for(let D of g.slice(0,10)){let H=u0(D.startedAt),G=lA.get(D.definitionId)?.name??D.definitionId;Z.push(`| ${G} | ${D.requestedBy} | ${D.status} | ${H} |`)}}return{mimeType:"text/markdown",body:Z.join(`
|
|
10
|
-
`)}}},
|
|
11
|
-
`)}}},
|
|
9
|
+
WHERE "instanceId" = ? AND "stepId" = ? AND status = 'PENDING'`,[F.actorId,L.reason,N,L.instanceId,Y[0].currentStepId]),await R(`UPDATE workflow_instance SET status = 'REJECTED', "completedAt" = ? WHERE id = ?`,[N,L.instanceId]);let $=await g("SELECT * FROM workflow_instance WHERE id = ?",[L.instanceId]);return D0($[0])}async function a(L){return(await g('SELECT * FROM workflow_approval WHERE "instanceId" = ? ORDER BY "createdAt"',[L])).map(HA)}return{listDefinitions:O,createDefinition:P,addStep:Z,getSteps:D,listInstances:H,startInstance:G,approveStep:n,rejectStep:Y0,getApprovals:a}}import{defineEnum as YA}from"@contractspec/lib.schema";var t=YA("InstanceStatus",["PENDING","RUNNING","WAITING","PAUSED","COMPLETED","CANCELLED","FAILED","TIMEOUT"]);import{defineEvent as h}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as X0,ScalarTypeEnum as V}from"@contractspec/lib.schema";var w=X0({name:"InstanceEventPayload",description:"Base payload for instance events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},status:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},triggeredBy:{type:V.String_unsecure(),isOptional:!1},organizationId:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),o0=X0({name:"StepTransitionEventPayload",description:"Payload for step transition events",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},fromStepKey:{type:V.String_unsecure(),isOptional:!0},toStepKey:{type:V.String_unsecure(),isOptional:!1},action:{type:V.String_unsecure(),isOptional:!0},executedBy:{type:V.String_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),KA=X0({name:"InstanceCompletedEventPayload",description:"Payload when instance completes",fields:{instanceId:{type:V.String_unsecure(),isOptional:!1},workflowId:{type:V.String_unsecure(),isOptional:!1},workflowKey:{type:V.String_unsecure(),isOptional:!1},outcome:{type:V.String_unsecure(),isOptional:!1},referenceId:{type:V.String_unsecure(),isOptional:!0},referenceType:{type:V.String_unsecure(),isOptional:!0},duration:{type:V.Int_unsecure(),isOptional:!1},timestamp:{type:V.DateTime(),isOptional:!1}}}),XA=h({meta:{key:"workflow.instance.started",version:"1.0.0",description:"A new workflow instance has been started.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","started"]},payload:w}),$A=h({meta:{key:"workflow.step.entered",version:"1.0.0",description:"A workflow instance has entered a new step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","entered"]},payload:o0}),kA=h({meta:{key:"workflow.step.exited",version:"1.0.0",description:"A workflow instance has exited a step.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","exited"]},payload:o0}),QA=h({meta:{key:"workflow.instance.completed",version:"1.0.0",description:"A workflow instance has completed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","completed"]},payload:KA}),BA=h({meta:{key:"workflow.instance.cancelled",version:"1.0.0",description:"A workflow instance has been cancelled.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","cancelled"]},payload:w}),vA=h({meta:{key:"workflow.instance.paused",version:"1.0.0",description:"A workflow instance has been paused.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","paused"]},payload:w}),zA=h({meta:{key:"workflow.instance.resumed",version:"1.0.0",description:"A workflow instance has been resumed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","resumed"]},payload:w}),qA=h({meta:{key:"workflow.instance.failed",version:"1.0.0",description:"A workflow instance has failed.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","failed"]},payload:w}),WA=h({meta:{key:"workflow.instance.timedOut",version:"1.0.0",description:"A workflow instance has timed out.",stability:"stable",owners:["@workflow-team"],tags:["workflow","instance","timeout"]},payload:w});import{defineSchemaModel as R0,ScalarTypeEnum as U}from"@contractspec/lib.schema";var K=R0({name:"WorkflowInstanceModel",description:"A running workflow instance",fields:{id:{type:U.String_unsecure(),isOptional:!1},workflowDefinitionId:{type:U.String_unsecure(),isOptional:!1},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!1},currentStepId:{type:U.String_unsecure(),isOptional:!0},contextData:{type:U.JSON(),isOptional:!0},triggeredBy:{type:U.String_unsecure(),isOptional:!1},organizationId:{type:U.String_unsecure(),isOptional:!1},priority:{type:U.Int_unsecure(),isOptional:!1},dueAt:{type:U.DateTime(),isOptional:!0},outcome:{type:U.String_unsecure(),isOptional:!0},resultData:{type:U.JSON(),isOptional:!0},errorMessage:{type:U.String_unsecure(),isOptional:!0},createdAt:{type:U.DateTime(),isOptional:!1},startedAt:{type:U.DateTime(),isOptional:!0},completedAt:{type:U.DateTime(),isOptional:!0}}}),$0=R0({name:"StartWorkflowInput",description:"Input for starting a workflow",fields:{workflowKey:{type:U.NonEmptyString(),isOptional:!1},contextData:{type:U.JSON(),isOptional:!0},referenceId:{type:U.String_unsecure(),isOptional:!0},referenceType:{type:U.String_unsecure(),isOptional:!0},priority:{type:U.Int_unsecure(),isOptional:!0},dueAt:{type:U.DateTime(),isOptional:!0}}}),k0=R0({name:"TransitionInput",description:"Input for transitioning a workflow",fields:{instanceId:{type:U.String_unsecure(),isOptional:!1},action:{type:U.NonEmptyString(),isOptional:!1},data:{type:U.JSON(),isOptional:!0},comment:{type:U.String_unsecure(),isOptional:!0}}}),Q0=R0({name:"TransitionResult",description:"Result of a workflow transition",fields:{success:{type:U.Boolean(),isOptional:!1},instance:{type:K,isOptional:!1},previousStepKey:{type:U.String_unsecure(),isOptional:!0},currentStepKey:{type:U.String_unsecure(),isOptional:!0},message:{type:U.String_unsecure(),isOptional:!0}}});import{defineCommand as s,defineQuery as m0}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as T,ScalarTypeEnum as Q}from"@contractspec/lib.schema";var j=["@example.workflow-system"],dA=s({meta:{key:"workflow.instance.start",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","start"],description:"Start a new workflow instance.",goal:"Initiate a workflow for a business process.",context:"Order creation, request submission, etc."},io:{input:$0,output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.started",version:"1.0.0",when:"Workflow starts",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"First step entered",payload:K}],audit:["workflow.instance.started"]},acceptance:{scenarios:[{key:"start-workflow-happy-path",given:["Workflow definition exists"],when:["User starts workflow"],then:["Instance is created and started"]}],examples:[{key:"start-onboarding",input:{workflowKey:"onboarding-v1",context:{employeeId:"emp-123"}},output:{id:"inst-456",status:"running"}}]}}),bA=s({meta:{key:"workflow.instance.transition",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","transition","state-machine"],description:"Transition a workflow instance to the next step.",goal:"Move workflow forward based on action.",context:"Task completion, approval decisions."},io:{input:k0,output:Q0},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.exited",version:"1.0.0",when:"Step is exited",payload:K},{key:"workflow.step.entered",version:"1.0.0",when:"New step is entered",payload:K},{key:"workflow.instance.completed",version:"1.0.0",when:"Workflow reaches end",payload:K}],audit:["workflow.instance.transitioned"]},acceptance:{scenarios:[{key:"transition-workflow-happy-path",given:["Workflow instance is waiting at step"],when:["User provides input"],then:["Instance moves to next step"]}],examples:[{key:"complete-task",input:{instanceId:"inst-456",action:"complete",data:{approved:!0}},output:{success:!0,nextStep:"notify-hr"}}]}}),xA=s({meta:{key:"workflow.instance.pause",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","pause"],description:"Pause a running workflow instance.",goal:"Temporarily halt workflow execution.",context:"Administrative action, emergency stop."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.paused",version:"1.0.0",when:"Workflow is paused",payload:K}],audit:["workflow.instance.paused"]},acceptance:{scenarios:[{key:"pause-workflow-happy-path",given:["Workflow is running"],when:["Admin pauses workflow"],then:["Instance status becomes PAUSED"]}],examples:[{key:"pause-maintenance",input:{instanceId:"inst-456",reason:"System maintenance"},output:{id:"inst-456",status:"paused"}}]}}),MA=s({meta:{key:"workflow.instance.resume",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","resume"],description:"Resume a paused workflow instance.",goal:"Continue workflow execution.",context:"Administrative action."},io:{input:T({name:"PauseResumeInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!0}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.resumed",version:"1.0.0",when:"Workflow is resumed",payload:K}],audit:["workflow.instance.resumed"]},acceptance:{scenarios:[{key:"resume-workflow-happy-path",given:["Workflow is paused"],when:["Admin resumes workflow"],then:["Instance status becomes RUNNING"]}],examples:[{key:"resume-normal",input:{instanceId:"inst-456",reason:"Issue resolved"},output:{id:"inst-456",status:"running"}}]}}),hA=s({meta:{key:"workflow.instance.cancel",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","cancel"],description:"Cancel a workflow instance.",goal:"Terminate workflow without completion.",context:"User request, system cancellation."},io:{input:T({name:"CancelWorkflowInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1},reason:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.instance.cancelled",version:"1.0.0",when:"Workflow is cancelled",payload:K}],audit:["workflow.instance.cancelled"]},acceptance:{scenarios:[{key:"cancel-workflow-happy-path",given:["Workflow is running"],when:["User cancels workflow"],then:["Instance status becomes CANCELLED"]}],examples:[{key:"cancel-mistake",input:{instanceId:"inst-456",reason:"Created by mistake"},output:{id:"inst-456",status:"cancelled"}}]}}),jA=m0({meta:{key:"workflow.instance.list",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","list"],description:"List workflow instances with filtering.",goal:"Browse and search running workflows.",context:"Dashboard, monitoring."},io:{input:T({name:"ListInstancesInput",fields:{workflowKey:{type:Q.String_unsecure(),isOptional:!0},status:{type:t,isOptional:!0},referenceType:{type:Q.String_unsecure(),isOptional:!0},referenceId:{type:Q.String_unsecure(),isOptional:!0},triggeredBy:{type:Q.String_unsecure(),isOptional:!0},limit:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:Q.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:T({name:"ListInstancesOutput",fields:{instances:{type:K,isArray:!0,isOptional:!1},total:{type:Q.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-instances-happy-path",given:["Workflow instances exist"],when:["User lists instances"],then:["List of instances is returned"]}],examples:[{key:"list-running",input:{status:"running",limit:10},output:{instances:[],total:5}}]}}),fA=m0({meta:{key:"workflow.instance.get",version:"1.0.0",stability:"stable",owners:[...j],tags:["workflow","instance","get"],description:"Get a workflow instance with details.",goal:"View workflow instance details.",context:"Instance detail view."},io:{input:T({name:"GetInstanceInput",fields:{instanceId:{type:Q.String_unsecure(),isOptional:!1}}}),output:K},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-instance-happy-path",given:["Instance exists"],when:["User requests instance details"],then:["Instance details are returned"]}],examples:[{key:"get-details",input:{instanceId:"inst-456"},output:{id:"inst-456",workflowKey:"onboarding-v1"}}]}});import{defineEnum as L0}from"@contractspec/lib.schema";var c=L0("WorkflowStatus",["DRAFT","ACTIVE","DEPRECATED","ARCHIVED"]),u=L0("WorkflowTriggerType",["MANUAL","EVENT","SCHEDULED","API"]),Z0=L0("StepType",["START","APPROVAL","TASK","CONDITION","PARALLEL","WAIT","ACTION","END"]),O0=L0("ApprovalMode",["ANY","ALL","MAJORITY","SEQUENTIAL"]);import{defineSchemaModel as i,ScalarTypeEnum as I}from"@contractspec/lib.schema";var l=i({name:"WorkflowStepModel",description:"A step in a workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!1},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0}}}),B=i({name:"WorkflowDefinitionModel",description:"A workflow definition",fields:{id:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!1},key:{type:I.String_unsecure(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},version:{type:I.String_unsecure(),isOptional:!1},status:{type:c,isOptional:!1},triggerType:{type:u,isOptional:!1},initialStepId:{type:I.String_unsecure(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},organizationId:{type:I.String_unsecure(),isOptional:!1},createdAt:{type:I.DateTime(),isOptional:!1},updatedAt:{type:I.DateTime(),isOptional:!1},steps:{type:l,isArray:!0,isOptional:!0}}}),B0=i({name:"CreateWorkflowInput",description:"Input for creating a workflow definition",fields:{name:{type:I.NonEmptyString(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),v0=i({name:"UpdateWorkflowInput",description:"Input for updating a workflow definition",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},name:{type:I.String_unsecure(),isOptional:!0},description:{type:I.String_unsecure(),isOptional:!0},triggerType:{type:u,isOptional:!0},triggerConfig:{type:I.JSON(),isOptional:!0},featureFlagKey:{type:I.String_unsecure(),isOptional:!0},settings:{type:I.JSON(),isOptional:!0}}}),z0=i({name:"AddStepInput",description:"Input for adding a step to a workflow",fields:{workflowId:{type:I.String_unsecure(),isOptional:!1},key:{type:I.NonEmptyString(),isOptional:!1},name:{type:I.NonEmptyString(),isOptional:!1},description:{type:I.String_unsecure(),isOptional:!0},type:{type:Z0,isOptional:!1},position:{type:I.Int_unsecure(),isOptional:!0},transitions:{type:I.JSON(),isOptional:!1},approvalMode:{type:O0,isOptional:!0},approverRoles:{type:I.String_unsecure(),isArray:!0,isOptional:!0},approverUserIds:{type:I.String_unsecure(),isArray:!0,isOptional:!0},timeoutSeconds:{type:I.Int_unsecure(),isOptional:!0},slaSeconds:{type:I.Int_unsecure(),isOptional:!0}}});import{definePresentation as x,StabilityEnum as M}from"@contractspec/lib.contracts-spec";var rA=x({meta:{key:"workflow.designer",version:"1.0.0",title:"Workflow Designer",description:"Visual workflow designer with drag-and-drop steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","designer","admin"],stability:M.Experimental,goal:"Building and modifying workflow definitions",context:"Workflow administration and setup"},source:{type:"component",framework:"react",componentKey:"WorkflowDesigner",props:B},targets:["react"],policy:{flags:["workflow.designer.enabled"]}}),wA=x({meta:{key:"workflow.definition.viewList",version:"1.0.0",title:"Workflow List",description:"List of workflow definitions with status and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","list","admin"],stability:M.Experimental,goal:"Overview of all defined workflows",context:"Workflow management dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionList",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),TA=x({meta:{key:"workflow.definition.detail",version:"1.0.0",title:"Workflow Details",description:"Detailed view of a workflow definition with steps",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","detail"],stability:M.Experimental,goal:"Viewing technical details of a workflow definition",context:"Workflow inspection and debugging"},source:{type:"component",framework:"react",componentKey:"WorkflowDefinitionDetail",props:B},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),EA=x({meta:{key:"workflow.instance.viewList",version:"1.0.0",title:"Instance List",description:"List of workflow instances with status and progress",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","list"],stability:M.Experimental,goal:"Monitoring active and past workflow executions",context:"Operations monitoring"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceList",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),pA=x({meta:{key:"workflow.instance.detail",version:"1.0.0",title:"Instance Details",description:"Detailed view of a workflow instance with step timeline",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","instance","detail","timeline"],stability:M.Experimental,goal:"Detailed inspection of a specific workflow instance",context:"Case management and troubleshooting"},source:{type:"component",framework:"react",componentKey:"WorkflowInstanceDetail",props:K},targets:["react","markdown"],policy:{flags:["workflow.enabled"]}}),yA=x({meta:{key:"workflow.instance.progress",version:"1.0.0",title:"Progress Tracker",description:"Visual progress tracker showing current step in workflow",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","progress","widget"],stability:M.Experimental,goal:"Quick view of current progress for a workflow",context:"Embedded progress indicator in entity views"},source:{type:"component",framework:"react",componentKey:"WorkflowProgressTracker",props:K},targets:["react"],policy:{flags:["workflow.enabled"]}}),oA=x({meta:{key:"workflow.approval.inbox",version:"1.0.0",title:"Approval Inbox",description:"Inbox showing pending approval requests for current user",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","inbox"],stability:M.Experimental,goal:"Managing personal workload of approval requests",context:"Personal task management"},source:{type:"component",framework:"react",componentKey:"ApprovalInbox",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),mA=x({meta:{key:"workflow.approval.detail",version:"1.0.0",title:"Approval Details",description:"Detailed approval request view with context and actions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","detail"],stability:M.Experimental,goal:"Decision support for an approval request",context:"Specific approval action"},source:{type:"component",framework:"react",componentKey:"ApprovalRequestDetail",props:b},targets:["react","markdown"],policy:{flags:["workflow.approvals.enabled"]}}),SA=x({meta:{key:"workflow.approval.form",version:"1.0.0",title:"Approval Form",description:"Form for submitting approval decisions",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","form"],stability:M.Experimental,goal:"Submitting a decision on an approval request",context:"Approval decision dialog"},source:{type:"component",framework:"react",componentKey:"ApprovalDecisionForm"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),tA=x({meta:{key:"workflow.approval.badge",version:"1.0.0",title:"Pending Approvals Badge",description:"Badge showing count of pending approvals",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","approval","badge","widget"],stability:M.Experimental,goal:"Visual notification of pending approvals",context:"Global navigation or sidebar"},source:{type:"component",framework:"react",componentKey:"PendingApprovalsBadge"},targets:["react"],policy:{flags:["workflow.approvals.enabled"]}}),sA=x({meta:{key:"workflow.metrics",version:"1.0.0",title:"Workflow Metrics",description:"Dashboard widget showing workflow metrics and statistics",domain:"workflow-system",owners:["@workflow-team"],tags:["workflow","metrics","dashboard"],stability:M.Experimental,goal:"Monitoring throughput and bottlenecks",context:"System performance dashboard"},source:{type:"component",framework:"react",componentKey:"WorkflowMetricsDashboard"},targets:["react","markdown"],policy:{flags:["workflow.metrics.enabled"]}}),z2={WorkflowDesignerPresentation:rA,WorkflowListPresentation:wA,WorkflowDetailPresentation:TA,InstanceListPresentation:EA,InstanceDetailPresentation:pA,ProgressTrackerPresentation:yA,ApprovalInboxPresentation:oA,ApprovalDetailPresentation:mA,ApprovalFormPresentation:SA,PendingApprovalsBadgePresentation:tA,WorkflowMetricsPresentation:sA};import{useTemplateRuntime as cA}from"@contractspec/lib.example-shared-ui";import{useCallback as uA,useEffect as iA,useState as I0}from"react";function q0(A){let{handlers:_,projectId:g}=cA(),R=A??g,O=_.workflow,[P,Z]=I0([]),[D,H]=I0([]),[G,n]=I0(!0),[Y0,a]=I0(null),L=uA(async()=>{try{n(!0),a(null);let[N,Y]=await Promise.all([O.listDefinitions({projectId:R,limit:100}),O.listInstances({projectId:R,limit:100})]);Z(N.definitions),H(Y.instances)}catch(N){a(N instanceof Error?N:Error("Failed to load workflows"))}finally{n(!1)}},[R,O]);iA(()=>{L()},[L]);let F={totalDefinitions:P.length,activeDefinitions:P.filter((N)=>N.status==="ACTIVE").length,totalInstances:D.length,pendingInstances:D.filter((N)=>N.status==="PENDING").length,inProgressInstances:D.filter((N)=>N.status==="IN_PROGRESS").length,completedInstances:D.filter((N)=>N.status==="COMPLETED").length,rejectedInstances:D.filter((N)=>N.status==="REJECTED").length};return{definitions:P,instances:D,loading:G,error:Y0,stats:F,refetch:L}}var r2="workflow-system-demo",w2="org_demo",S0=[{id:"wf_expense",name:"Expense Approval",description:"Approve non-trivial spend before finance releases budget.",type:"APPROVAL",status:"ACTIVE",createdAt:"2026-03-10T09:00:00.000Z",updatedAt:"2026-03-20T08:15:00.000Z",steps:[{id:"wfstep_expense_manager",name:"Manager Review",description:"Validate business value and team budget.",stepOrder:1,type:"APPROVAL",requiredRoles:["manager"],createdAt:"2026-03-10T09:00:00.000Z"},{id:"wfstep_expense_finance",name:"Finance Review",description:"Confirm ledger coding and spending threshold.",stepOrder:2,type:"APPROVAL",requiredRoles:["finance"],createdAt:"2026-03-10T09:10:00.000Z"}]},{id:"wf_vendor",name:"Vendor Onboarding",description:"Sequence security, procurement, and legal before activation.",type:"SEQUENTIAL",status:"ACTIVE",createdAt:"2026-03-08T11:00:00.000Z",updatedAt:"2026-03-19T13:10:00.000Z",steps:[{id:"wfstep_vendor_security",name:"Security Check",description:"Review data access and integration scope.",stepOrder:1,type:"APPROVAL",requiredRoles:["security"],createdAt:"2026-03-08T11:00:00.000Z"},{id:"wfstep_vendor_procurement",name:"Procurement Check",description:"Validate pricing, procurement policy, and owner.",stepOrder:2,type:"APPROVAL",requiredRoles:["procurement"],createdAt:"2026-03-08T11:05:00.000Z"},{id:"wfstep_vendor_legal",name:"Legal Sign-off",description:"Approve terms before the vendor goes live.",stepOrder:3,type:"APPROVAL",requiredRoles:["legal"],createdAt:"2026-03-08T11:10:00.000Z"}]},{id:"wf_policy_exception",name:"Policy Exception",description:"Escalate a temporary exception through team lead and compliance.",type:"APPROVAL",status:"DRAFT",createdAt:"2026-03-15T07:30:00.000Z",updatedAt:"2026-03-18T11:20:00.000Z",steps:[{id:"wfstep_policy_lead",name:"Team Lead Review",description:"Check urgency and expected blast radius.",stepOrder:1,type:"APPROVAL",requiredRoles:["team-lead"],createdAt:"2026-03-15T07:30:00.000Z"},{id:"wfstep_policy_compliance",name:"Compliance Review",description:"Accept or reject the exception request.",stepOrder:2,type:"APPROVAL",requiredRoles:["compliance"],createdAt:"2026-03-15T07:40:00.000Z"}]}],t0=[{id:"wfinst_expense_open",definitionId:"wf_expense",status:"IN_PROGRESS",currentStepId:"wfstep_expense_finance",data:{amount:4200,currency:"EUR",vendor:"Nimbus AI"},requestedBy:"sarah@contractspec.io",startedAt:"2026-03-20T08:00:00.000Z",approvals:[{id:"wfappr_expense_manager",stepId:"wfstep_expense_manager",status:"APPROVED",actorId:"manager.demo",comment:"Approved for the Q2 automation budget.",decidedAt:"2026-03-20T08:15:00.000Z",createdAt:"2026-03-20T08:05:00.000Z"},{id:"wfappr_expense_finance",stepId:"wfstep_expense_finance",status:"PENDING",createdAt:"2026-03-20T08:15:00.000Z"}]},{id:"wfinst_vendor_done",definitionId:"wf_vendor",status:"COMPLETED",data:{vendor:"Acme Cloud",riskTier:"medium"},requestedBy:"leo@contractspec.io",startedAt:"2026-03-19T09:30:00.000Z",completedAt:"2026-03-19T13:10:00.000Z",approvals:[{id:"wfappr_vendor_security",stepId:"wfstep_vendor_security",status:"APPROVED",actorId:"security.demo",comment:"SOC2 scope is acceptable.",decidedAt:"2026-03-19T10:10:00.000Z",createdAt:"2026-03-19T09:35:00.000Z"},{id:"wfappr_vendor_procurement",stepId:"wfstep_vendor_procurement",status:"APPROVED",actorId:"procurement.demo",comment:"Commercial terms match the preferred vendor tier.",decidedAt:"2026-03-19T11:25:00.000Z",createdAt:"2026-03-19T10:15:00.000Z"},{id:"wfappr_vendor_legal",stepId:"wfstep_vendor_legal",status:"APPROVED",actorId:"legal.demo",comment:"MSA redlines are complete.",decidedAt:"2026-03-19T13:05:00.000Z",createdAt:"2026-03-19T11:30:00.000Z"}]},{id:"wfinst_policy_rejected",definitionId:"wf_policy_exception",status:"REJECTED",currentStepId:"wfstep_policy_compliance",data:{policy:"Model rollout freeze",durationDays:14},requestedBy:"maya@contractspec.io",startedAt:"2026-03-18T10:00:00.000Z",completedAt:"2026-03-18T11:20:00.000Z",approvals:[{id:"wfappr_policy_lead",stepId:"wfstep_policy_lead",status:"APPROVED",actorId:"lead.demo",comment:"Escalation justified for the release train.",decidedAt:"2026-03-18T10:30:00.000Z",createdAt:"2026-03-18T10:05:00.000Z"},{id:"wfappr_policy_compliance",stepId:"wfstep_policy_compliance",status:"REJECTED",actorId:"compliance.demo",comment:"Exception exceeds the allowed blast radius.",decidedAt:"2026-03-18T11:15:00.000Z",createdAt:"2026-03-18T10:35:00.000Z"}]}];import{defineVisualization as P0,VisualizationRegistry as lA}from"@contractspec/lib.contracts-spec/visualizations";var C0={key:"workflow.instance.list",version:"1.0.0"},N0={version:"1.0.0",domain:"workflow",stability:"experimental",owners:["@example.workflow-system"],tags:["workflow","visualization","operations"]},W0=P0({meta:{...N0,key:"workflow-system.visualization.instance-status",title:"Instance Status Breakdown",description:"Distribution of workflow instance states.",goal:"Surface the current workload mix.",context:"Workflow operations overview."},source:{primary:C0,resultPath:"data"},visualization:{kind:"pie",nameDimension:"status",valueMeasure:"instances",dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number"}],table:{caption:"Workflow instance counts by status."}}}),d0=P0({meta:{...N0,key:"workflow-system.visualization.throughput",title:"Run Throughput",description:"Daily workflow instance starts.",goal:"Show operational throughput over time.",context:"Workflow trend monitoring."},source:{primary:C0,resultPath:"data"},visualization:{kind:"cartesian",variant:"line",xDimension:"day",yMeasures:["instances"],dimensions:[{key:"day",label:"Day",dataPath:"day",type:"time"}],measures:[{key:"instances",label:"Instances",dataPath:"instances",format:"number",color:"#0f766e"}],table:{caption:"Daily workflow instance starts."}}}),b0=P0({meta:{...N0,key:"workflow-system.visualization.active-work",title:"Active Work",description:"Current in-flight or pending workflow instances.",goal:"Expose active operational workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Active workflow count."}}}),x0=P0({meta:{...N0,key:"workflow-system.visualization.completed-work",title:"Completed Work",description:"Completed workflow instances in the current sample.",goal:"Show output against active workload.",context:"Workflow workload comparison."},source:{primary:C0,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Instances",dataPath:"value",format:"number"}],table:{caption:"Completed workflow count."}}}),s0=[W0,d0,b0,x0],p2=new lA([...s0]),c0=s0.map((A)=>({key:A.meta.key,version:A.meta.version}));function eA(A){return(A instanceof Date?A:new Date(A)).toISOString().slice(0,10)}function G0(A){let _=new Map,g=new Map,R=0,O=0;for(let D of A){_.set(D.status,(_.get(D.status)??0)+1);let H=eA(D.startedAt);if(g.set(H,(g.get(H)??0)+1),D.status==="PENDING"||D.status==="IN_PROGRESS")R+=1;if(D.status==="COMPLETED")O+=1}return{primaryItems:[{key:"workflow-status",spec:W0,data:{data:Array.from(_.entries()).map(([D,H])=>({status:D,instances:H}))},title:"Instance Status Breakdown",description:"Status mix across workflow instances.",height:260},{key:"workflow-throughput",spec:d0,data:{data:Array.from(g.entries()).sort(([D],[H])=>D.localeCompare(H)).map(([D,H])=>({day:D,instances:H}))},title:"Run Throughput",description:"Daily workflow starts from current instances."}],comparisonItems:[{key:"workflow-active",spec:b0,data:{data:[{value:R}]},title:"Active Work",description:"Pending and in-progress workflows.",height:200},{key:"workflow-completed",spec:x0,data:{data:[{value:O}]},title:"Completed Work",description:"Completed workflows in the current sample.",height:200}]}}var U0=S0,M0=t0,nA=new Map(U0.map((A)=>[A.id,A]));function u0(A){return new Date(A).toISOString().slice(0,10)}var aA={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowDashboard")throw Error("workflowDashboardMarkdownRenderer: not WorkflowDashboard");let _=U0,g=M0,R=G0(g),O=_.filter((D)=>D.status==="ACTIVE"),P=g.filter((D)=>D.status==="PENDING"||D.status==="IN_PROGRESS"),Z=["# Workflow Dashboard","","> Seeded workflow and approval overview for the sandbox demo.","","## Summary","","| Metric | Value |","|--------|-------|",`| Active Workflows | ${O.length} |`,`| Awaiting Action | ${P.length} |`,`| Completed | ${g.filter((D)=>D.status==="COMPLETED").length} |`,`| Rejected | ${g.filter((D)=>D.status==="REJECTED").length} |`,""];Z.push("## Visualization Overview"),Z.push("");for(let D of[...R.primaryItems,...R.comparisonItems])Z.push(`- **${D.title}** via \`${D.spec.meta.key}\``);if(Z.push(""),Z.push("## Active Workflow Definitions"),Z.push(""),O.length===0)Z.push("_No active workflow definitions._");else{Z.push("| Name | Type | Steps | Status |"),Z.push("|------|------|-------|--------|");for(let D of O)Z.push(`| ${D.name} | ${D.type} | ${D.steps.length} | ${D.status} |`)}if(Z.push(""),Z.push("## Recent Instances"),Z.push(""),g.length===0)Z.push("_No workflow instances._");else{Z.push("| Workflow | Requested By | Status | Started |"),Z.push("|----------|--------------|--------|---------|");for(let D of g.slice(0,10)){let H=u0(D.startedAt),G=nA.get(D.definitionId)?.name??D.definitionId;Z.push(`| ${G} | ${D.requestedBy} | ${D.status} | ${H} |`)}}return{mimeType:"text/markdown",body:Z.join(`
|
|
10
|
+
`)}}},Ag={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowDefinitionList")throw Error("workflowDefinitionListMarkdownRenderer: not WorkflowDefinitionList");let _=U0,g=["# Workflow Definitions","","> Configure automated approval and process workflows",""];for(let R of _){g.push(`## ${R.name}`),g.push(""),g.push(`**Type:** ${R.type} | **Status:** ${R.status}`),g.push(""),g.push("### Steps"),g.push("");for(let O of R.steps)g.push(`${O.stepOrder}. **${O.name}** - Roles: ${O.requiredRoles.join(", ")}`);g.push("")}return{mimeType:"text/markdown",body:g.join(`
|
|
11
|
+
`)}}},gg={target:"markdown",render:async(A)=>{if(A.source.type!=="component"||A.source.componentKey!=="WorkflowInstanceDetail")throw Error("workflowInstanceDetailMarkdownRenderer: not WorkflowInstanceDetail");let _=M0.find((O)=>O.status==="IN_PROGRESS")??M0[0];if(!_)return{mimeType:"text/markdown",body:`# No Workflow Instances
|
|
12
12
|
|
|
13
13
|
No workflow instances available.`};let g=U0.find((O)=>O.id===_.definitionId),R=[`# Workflow: ${g?.name??_.definitionId}`,"",`**Instance ID:** ${_.id}`,`**Status:** ${_.status}`,`**Requested By:** ${_.requestedBy}`,`**Started:** ${u0(_.startedAt)}`,"","## Steps Progress",""];if(g)for(let O of g.steps){let P=O.id===_.currentStepId,Z=g.steps.indexOf(O)<g.steps.findIndex((H)=>H.id===_.currentStepId),D="\u2B1C Pending";if(Z)D="\u2705 Completed";if(P)D="\uD83D\uDD04 In Progress";R.push(`- ${D} **${O.name}**`)}return R.push(""),R.push("## Actions"),R.push(""),R.push("- **Approve** - Move to next step"),R.push("- **Reject** - End the workflow with a rejection outcome"),R.push("- **Delegate** - Assign to another approver"),{mimeType:"text/markdown",body:R.join(`
|
|
14
|
-
`)}}};import{ComparisonView as Ag,VisualizationCard as gg,VisualizationGrid as _g}from"@contractspec/lib.design-system";import{jsx as e,jsxs as i0}from"react/jsx-runtime";function l0({instances:A}){let{primaryItems:_,comparisonItems:g}=G0(A);return i0("section",{className:"space-y-4",children:[i0("div",{children:[e("h3",{className:"font-semibold text-lg",children:"Workflow Visualizations"}),e("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for workflow health and throughput."})]}),e(_g,{children:_.map((R)=>e(gg,{data:R.data,description:R.description,height:R.height,spec:R.spec,title:R.title},R.key))}),e(Ag,{description:"Shared comparison surface for active versus completed work.",items:g,title:"Workload Comparison"})]})}import{Button as e0,ErrorState as Dg,LoaderBlock as Rg,StatCard as F0,StatCardGroup as Lg}from"@contractspec/lib.design-system";import{useState as Zg}from"react";import{jsx as C,jsxs as v}from"react/jsx-runtime";var n0={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DRAFT:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",ARCHIVED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",PENDING:"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",IN_PROGRESS:"bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",COMPLETED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",REJECTED:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",CANCELLED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"};function Og(){let[A,_]=Zg("definitions"),{definitions:g,instances:R,loading:O,error:P,stats:Z,refetch:D}=q0(),H=[{id:"definitions",label:"Definitions",icon:"\uD83D\uDCCB"},{id:"instances",label:"Instances",icon:"\uD83D\uDD04"}];if(O)return C(Rg,{label:"Loading Workflows..."});if(P)return C(Dg,{title:"Failed to load Workflows",description:P.message,onRetry:D,retryLabel:"Retry"});return v("div",{className:"space-y-6",children:[v("div",{className:"flex items-center justify-between",children:[C("h2",{className:"font-bold text-2xl",children:"Workflow System"}),C(e0,{onClick:()=>void D(),children:"Refresh"})]}),v(Lg,{children:[C(F0,{label:"Workflows",value:Z.totalDefinitions,hint:`${Z.activeDefinitions} active`}),C(F0,{label:"Instances",value:Z.totalInstances,hint:"total runs"}),C(F0,{label:"Awaiting Action",value:Z.pendingInstances+Z.inProgressInstances,hint:"open approvals"}),C(F0,{label:"Completed",value:Z.completedInstances,hint:"finished"})]}),C(l0,{instances:R}),C("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:H.map((G)=>v(e0,{type:"button",role:"tab","aria-selected":A===G.id,onClick:()=>_(G.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${A===G.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[C("span",{children:G.icon}),G.label]},G.id))}),v("div",{className:"min-h-[400px]",role:"tabpanel",children:[A==="definitions"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Name"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Type"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Created"})]})}),v("tbody",{className:"divide-y divide-border",children:[g.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[v("td",{className:"px-4 py-3",children:[C("div",{className:"font-medium",children:G.name}),C("div",{className:"text-muted-foreground text-sm",children:G.description})]}),C("td",{className:"px-4 py-3 font-mono text-sm",children:G.type}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.createdAt.toLocaleDateString()})]},G.id)),g.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow definitions found"})})]})]})}),A==="instances"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Instance ID"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Requested By"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Started"})]})}),v("tbody",{className:"divide-y divide-border",children:[R.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[C("td",{className:"px-4 py-3 font-mono text-sm",children:G.id}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-sm",children:G.requestedBy}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.startedAt.toLocaleDateString()})]},G.id)),R.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow instances found"})})]})]})})]})]})}import{defineEvent as J0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as a0,ScalarTypeEnum as z}from"@contractspec/lib.schema";var h0=a0({name:"WorkflowDefinitionEventPayload",description:"Payload for workflow definition events",fields:{workflowId:{type:z.String_unsecure(),isOptional:!1},key:{type:z.String_unsecure(),isOptional:!1},name:{type:z.String_unsecure(),isOptional:!1},version:{type:z.String_unsecure(),isOptional:!1},organizationId:{type:z.String_unsecure(),isOptional:!1},createdBy:{type:z.String_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Ig=a0({name:"StepAddedEventPayload",description:"Payload when a step is added",fields:{stepId:{type:z.String_unsecure(),isOptional:!1},workflowId:{type:z.String_unsecure(),isOptional:!1},stepKey:{type:z.String_unsecure(),isOptional:!1},stepType:{type:z.String_unsecure(),isOptional:!1},position:{type:z.Int_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Pg=J0({meta:{key:"workflow.definition.created",version:"1.0.0",description:"A new workflow definition has been created.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","created"]},payload:h0}),Cg=J0({meta:{key:"workflow.definition.updated",version:"1.0.0",description:"A workflow definition has been updated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","updated"]},payload:h0}),Ng=J0({meta:{key:"workflow.definition.published",version:"1.0.0",description:"A workflow definition has been published and is now active.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","published"]},payload:h0}),Gg=J0({meta:{key:"workflow.step.added",version:"1.0.0",description:"A step has been added to a workflow definition.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","added"]},payload:Ig});import{defineCommand as H0,defineQuery as AA}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as V0,ScalarTypeEnum as E}from"@contractspec/lib.schema";var p=["@example.workflow-system"],Ug=H0({meta:{key:"workflow.definition.create",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","create"],description:"Create a new workflow definition.",goal:"Allow users to define new workflow blueprints.",context:"Workflow designer, admin panel."},io:{input:B0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.created",version:"1.0.0",when:"Workflow is created",payload:B}],audit:["workflow.definition.created"]},acceptance:{scenarios:[{key:"create-workflow-happy-path",given:["User is admin"],when:["User creates new workflow definition"],then:["Definition is created","WorkflowDefinitionCreated event is emitted"]}],examples:[{key:"create-onboarding",input:{key:"onboarding-v1",name:"Employee Onboarding",version:"1.0.0"},output:{id:"def-123",status:"draft"}}]}}),Fg=H0({meta:{key:"workflow.definition.update",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","update"],description:"Update an existing workflow definition.",goal:"Allow users to modify workflow blueprints.",context:"Workflow designer."},io:{input:v0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.updated",version:"1.0.0",when:"Workflow is updated",payload:B}],audit:["workflow.definition.updated"]},acceptance:{scenarios:[{key:"update-workflow-happy-path",given:["Workflow definition exists"],when:["User updates definition"],then:["Definition is updated","WorkflowDefinitionUpdated event is emitted"]}],examples:[{key:"update-name",input:{workflowId:"def-123",name:"New Employee Onboarding"},output:{id:"def-123",name:"New Employee Onboarding"}}]}}),Jg=H0({meta:{key:"workflow.step.add",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","step","add"],description:"Add a step to a workflow definition.",goal:"Build workflow structure step by step.",context:"Workflow designer."},io:{input:z0,output:l},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.added",version:"1.0.0",when:"Step is added",payload:l}],audit:["workflow.step.added"]},acceptance:{scenarios:[{key:"add-step-happy-path",given:["Workflow definition exists"],when:["User adds a step"],then:["Step is added","StepAdded event is emitted"]}],examples:[{key:"add-approval-step",input:{workflowId:"def-123",stepKey:"approve-contract",type:"approval"},output:{id:"step-456",key:"approve-contract"}}]}}),Vg=H0({meta:{key:"workflow.definition.publish",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","publish"],description:"Publish a workflow definition to make it available for use.",goal:"Activate workflow for production use.",context:"Workflow designer, deployment."},io:{input:V0({name:"PublishWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.published",version:"1.0.0",when:"Workflow is published",payload:B}],audit:["workflow.definition.published"]},acceptance:{scenarios:[{key:"publish-workflow-happy-path",given:["Workflow definition is valid"],when:["User publishes workflow"],then:["Workflow becomes active","WorkflowPublished event is emitted"]}],examples:[{key:"publish-onboarding",input:{workflowId:"def-123"},output:{id:"def-123",status:"published"}}]}}),Hg=AA({meta:{key:"workflow.definition.list",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","list"],description:"List workflow definitions with filtering.",goal:"Browse and search available workflows.",context:"Workflow list, search."},io:{input:V0({name:"ListWorkflowsInput",fields:{status:{type:c,isOptional:!0},search:{type:E.String_unsecure(),isOptional:!0},limit:{type:E.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:E.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:V0({name:"ListWorkflowsOutput",fields:{workflows:{type:B,isArray:!0,isOptional:!1},total:{type:E.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-workflows-happy-path",given:["Workflow definitions exist"],when:["User lists workflows"],then:["List of workflows is returned"]}],examples:[{key:"list-all",input:{limit:10},output:{workflows:[],total:5}}]}}),Yg=AA({meta:{key:"workflow.definition.get",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","get"],description:"Get a workflow definition with all steps.",goal:"View workflow details.",context:"Workflow designer, detail view."},io:{input:V0({name:"GetWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-workflow-happy-path",given:["Workflow definition exists"],when:["User requests workflow details"],then:["Workflow details are returned"]}],examples:[{key:"get-details",input:{workflowId:"def-123"},output:{id:"def-123",name:"Employee Onboarding"}}]}});import{defineFeature as Kg}from"@contractspec/lib.contracts-spec";var $_=Kg({meta:{key:"workflow-system",title:"Workflow & Approval System",description:"State machine-based workflow engine with role-based approvals, delegation, and escalation",domain:"workflow",owners:["@workflow-team"],tags:["workflow","approval","state-machine","automation"],stability:"experimental",version:"1.0.0"},operations:[{key:"workflow.definition.create",version:"1.0.0"},{key:"workflow.definition.update",version:"1.0.0"},{key:"workflow.step.add",version:"1.0.0"},{key:"workflow.definition.publish",version:"1.0.0"},{key:"workflow.definition.list",version:"1.0.0"},{key:"workflow.definition.get",version:"1.0.0"},{key:"workflow.instance.start",version:"1.0.0"},{key:"workflow.instance.transition",version:"1.0.0"},{key:"workflow.instance.pause",version:"1.0.0"},{key:"workflow.instance.resume",version:"1.0.0"},{key:"workflow.instance.cancel",version:"1.0.0"},{key:"workflow.instance.list",version:"1.0.0"},{key:"workflow.instance.get",version:"1.0.0"},{key:"workflow.approval.decide",version:"1.0.0"},{key:"workflow.approval.delegate",version:"1.0.0"},{key:"workflow.approval.comment.add",version:"1.0.0"},{key:"workflow.approval.list.mine",version:"1.0.0"},{key:"workflow.approval.get",version:"1.0.0"}],events:[{key:"workflow.definition.created",version:"1.0.0"},{key:"workflow.definition.updated",version:"1.0.0"},{key:"workflow.definition.published",version:"1.0.0"},{key:"workflow.step.added",version:"1.0.0"},{key:"workflow.instance.started",version:"1.0.0"},{key:"workflow.step.entered",version:"1.0.0"},{key:"workflow.step.exited",version:"1.0.0"},{key:"workflow.instance.completed",version:"1.0.0"},{key:"workflow.instance.cancelled",version:"1.0.0"},{key:"workflow.instance.paused",version:"1.0.0"},{key:"workflow.instance.resumed",version:"1.0.0"},{key:"workflow.instance.failed",version:"1.0.0"},{key:"workflow.instance.timedOut",version:"1.0.0"},{key:"workflow.approval.requested",version:"1.0.0"},{key:"workflow.approval.decided",version:"1.0.0"},{key:"workflow.approval.delegated",version:"1.0.0"},{key:"workflow.approval.escalated",version:"1.0.0"}],presentations:[{key:"workflow.designer",version:"1.0.0"},{key:"workflow.definition.viewList",version:"1.0.0"},{key:"workflow.definition.detail",version:"1.0.0"},{key:"workflow.instance.viewList",version:"1.0.0"},{key:"workflow.instance.detail",version:"1.0.0"},{key:"workflow.instance.progress",version:"1.0.0"},{key:"workflow.approval.inbox",version:"1.0.0"},{key:"workflow.approval.detail",version:"1.0.0"},{key:"workflow.approval.form",version:"1.0.0"},{key:"workflow.approval.badge",version:"1.0.0"},{key:"workflow.metrics",version:"1.0.0"}],opToPresentation:[{op:{key:"workflow.definition.list",version:"1.0.0"},pres:{key:"workflow.definition.viewList",version:"1.0.0"}},{op:{key:"workflow.instance.list",version:"1.0.0"},pres:{key:"workflow.instance.viewList",version:"1.0.0"}},{op:{key:"workflow.approval.list.mine",version:"1.0.0"},pres:{key:"workflow.approval.inbox",version:"1.0.0"}},{op:{key:"workflow.approval.decide",version:"1.0.0"},pres:{key:"workflow.approval.form",version:"1.0.0"}}],presentationsTargets:[{key:"workflow.designer",version:"1.0.0",targets:["react"]},{key:"workflow.definition.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.definition.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.progress",version:"1.0.0",targets:["react"]},{key:"workflow.approval.inbox",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.approval.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.metrics",version:"1.0.0",targets:["react","markdown"]}],visualizations:c0,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"notifications",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"}],provides:[{key:"workflow",version:"1.0.0"},{key:"approval",version:"1.0.0"},{key:"state-machine",version:"1.0.0"}]},workflows:[{key:"workflow-system.workflow.approval-chain",version:"1.0.0"}],telemetry:[{key:"workflow-system.telemetry",version:"1.0.0"}],jobs:[{key:"workflow-system.job.instance-timeout",version:"1.0.0"},{key:"workflow-system.job.escalation",version:"1.0.0"}],docs:["docs.examples.workflow-system","docs.examples.workflow-system.goal","docs.examples.workflow-system.usage","docs.examples.workflow-system.constraints"]});export{aA as workflowInstanceDetailMarkdownRenderer,nA as workflowDefinitionListMarkdownRenderer,eA as workflowDashboardMarkdownRenderer,q0 as useWorkflowList,zg as mockDataStore,G0 as createWorkflowVisualizationSections,sg as createWorkflowHandlers,Wg as createStateMachineEngine,bg as createInitialState,dg as buildStateMachineDefinition,s0 as WorkflowVisualizationSpecs,f2 as WorkflowVisualizationRegistry,c0 as WorkflowVisualizationRefs,Cg as WorkflowUpdatedEvent,d0 as WorkflowThroughputVisualization,X2 as WorkflowSystemPresentations,$_ as WorkflowSystemFeature,l as WorkflowStepModel,c as WorkflowStatusEnum,Ng as WorkflowPublishedEvent,SA as WorkflowMetricsPresentation,fA as WorkflowListPresentation,W0 as WorkflowInstanceStatusVisualization,K as WorkflowInstanceModel,rA as WorkflowDetailPresentation,jA as WorkflowDesignerPresentation,B as WorkflowDefinitionModel,Og as WorkflowDashboard,Pg as WorkflowCreatedEvent,x0 as WorkflowCompletedMetricVisualization,b0 as WorkflowActiveMetricVisualization,v0 as UpdateWorkflowInputModel,Fg as UpdateWorkflowContract,u as TriggerTypeEnum,WA as TransitionWorkflowContract,Q0 as TransitionResultModel,$0 as TransitionInputModel,PA as SubmitDecisionContract,Z0 as StepTypeEnum,kA as StepExitedEvent,KA as StepEnteredEvent,Gg as StepAddedEvent,X0 as StartWorkflowInputModel,qA as StartWorkflowContract,bA as ResumeWorkflowContract,Vg as PublishWorkflowContract,EA as ProgressTrackerPresentation,oA as PendingApprovalsBadgePresentation,dA as PauseWorkflowContract,Hg as ListWorkflowsContract,GA as ListMyApprovalsContract,MA as ListInstancesContract,zA as InstanceTimedOutEvent,t as InstanceStatusEnum,YA as InstanceStartedEvent,BA as InstanceResumedEvent,QA as InstancePausedEvent,wA as InstanceListPresentation,vA as InstanceFailedEvent,TA as InstanceDetailPresentation,XA as InstanceCompletedEvent,$A as InstanceCancelledEvent,Yg as GetWorkflowContract,hA as GetInstanceContract,UA as GetApprovalContract,CA as DelegateApprovalContract,B0 as CreateWorkflowInputModel,Ug as CreateWorkflowContract,xA as CancelWorkflowContract,w0 as BasicStateMachineEngine,y as ApprovalStatusEnum,LA as ApprovalRequestedEvent,b as ApprovalRequestModel,O0 as ApprovalModeEnum,pA as ApprovalInboxPresentation,mA as ApprovalFormPresentation,IA as ApprovalEscalatedEvent,yA as ApprovalDetailPresentation,OA as ApprovalDelegatedEvent,m as ApprovalDecisionEnum,ZA as ApprovalDecidedEvent,_0 as ApprovalCommentModel,z0 as AddStepInputModel,Jg as AddStepContract,NA as AddApprovalCommentContract};
|
|
14
|
+
`)}}};import{ComparisonView as _g,VisualizationCard as Dg,VisualizationGrid as Rg}from"@contractspec/lib.design-system";import{jsx as e,jsxs as i0}from"react/jsx-runtime";function l0({instances:A}){let{primaryItems:_,comparisonItems:g}=G0(A);return i0("section",{className:"space-y-4",children:[i0("div",{children:[e("h3",{className:"font-semibold text-lg",children:"Workflow Visualizations"}),e("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for workflow health and throughput."})]}),e(Rg,{children:_.map((R)=>e(Dg,{data:R.data,description:R.description,height:R.height,spec:R.spec,title:R.title},R.key))}),e(_g,{description:"Shared comparison surface for active versus completed work.",items:g,title:"Workload Comparison"})]})}import{Button as e0,ErrorState as Lg,LoaderBlock as Zg,StatCard as F0,StatCardGroup as Og}from"@contractspec/lib.design-system";import{useState as Ig}from"react";import{jsx as C,jsxs as v}from"react/jsx-runtime";var n0={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DRAFT:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",ARCHIVED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",PENDING:"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",IN_PROGRESS:"bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",COMPLETED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",REJECTED:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",CANCELLED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"};function Pg(){let[A,_]=Ig("definitions"),{definitions:g,instances:R,loading:O,error:P,stats:Z,refetch:D}=q0(),H=[{id:"definitions",label:"Definitions",icon:"\uD83D\uDCCB"},{id:"instances",label:"Instances",icon:"\uD83D\uDD04"}];if(O)return C(Zg,{label:"Loading Workflows..."});if(P)return C(Lg,{title:"Failed to load Workflows",description:P.message,onRetry:D,retryLabel:"Retry"});return v("div",{className:"space-y-6",children:[v("div",{className:"flex items-center justify-between",children:[C("h2",{className:"font-bold text-2xl",children:"Workflow System"}),C(e0,{onClick:()=>void D(),children:"Refresh"})]}),v(Og,{children:[C(F0,{label:"Workflows",value:Z.totalDefinitions,hint:`${Z.activeDefinitions} active`}),C(F0,{label:"Instances",value:Z.totalInstances,hint:"total runs"}),C(F0,{label:"Awaiting Action",value:Z.pendingInstances+Z.inProgressInstances,hint:"open approvals"}),C(F0,{label:"Completed",value:Z.completedInstances,hint:"finished"})]}),C(l0,{instances:R}),C("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:H.map((G)=>v(e0,{type:"button",role:"tab","aria-selected":A===G.id,onClick:()=>_(G.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${A===G.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[C("span",{children:G.icon}),G.label]},G.id))}),v("div",{className:"min-h-[400px]",role:"tabpanel",children:[A==="definitions"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Name"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Type"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Created"})]})}),v("tbody",{className:"divide-y divide-border",children:[g.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[v("td",{className:"px-4 py-3",children:[C("div",{className:"font-medium",children:G.name}),C("div",{className:"text-muted-foreground text-sm",children:G.description})]}),C("td",{className:"px-4 py-3 font-mono text-sm",children:G.type}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.createdAt.toLocaleDateString()})]},G.id)),g.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow definitions found"})})]})]})}),A==="instances"&&C("div",{className:"rounded-lg border border-border",children:v("table",{className:"w-full",children:[C("thead",{className:"border-border border-b bg-muted/30",children:v("tr",{children:[C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Instance ID"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Status"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Requested By"}),C("th",{className:"px-4 py-3 text-left font-medium text-sm",children:"Started"})]})}),v("tbody",{className:"divide-y divide-border",children:[R.map((G)=>v("tr",{className:"hover:bg-muted/50",children:[C("td",{className:"px-4 py-3 font-mono text-sm",children:G.id}),C("td",{className:"px-4 py-3",children:C("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${n0[G.status]??""}`,children:G.status})}),C("td",{className:"px-4 py-3 text-sm",children:G.requestedBy}),C("td",{className:"px-4 py-3 text-muted-foreground text-sm",children:G.startedAt.toLocaleDateString()})]},G.id)),R.length===0&&C("tr",{children:C("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No workflow instances found"})})]})]})})]})]})}import{defineEvent as J0}from"@contractspec/lib.contracts-spec";import{defineSchemaModel as a0,ScalarTypeEnum as z}from"@contractspec/lib.schema";var h0=a0({name:"WorkflowDefinitionEventPayload",description:"Payload for workflow definition events",fields:{workflowId:{type:z.String_unsecure(),isOptional:!1},key:{type:z.String_unsecure(),isOptional:!1},name:{type:z.String_unsecure(),isOptional:!1},version:{type:z.String_unsecure(),isOptional:!1},organizationId:{type:z.String_unsecure(),isOptional:!1},createdBy:{type:z.String_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Cg=a0({name:"StepAddedEventPayload",description:"Payload when a step is added",fields:{stepId:{type:z.String_unsecure(),isOptional:!1},workflowId:{type:z.String_unsecure(),isOptional:!1},stepKey:{type:z.String_unsecure(),isOptional:!1},stepType:{type:z.String_unsecure(),isOptional:!1},position:{type:z.Int_unsecure(),isOptional:!1},timestamp:{type:z.DateTime(),isOptional:!1}}}),Ng=J0({meta:{key:"workflow.definition.created",version:"1.0.0",description:"A new workflow definition has been created.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","created"]},payload:h0}),Gg=J0({meta:{key:"workflow.definition.updated",version:"1.0.0",description:"A workflow definition has been updated.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","updated"]},payload:h0}),Ug=J0({meta:{key:"workflow.definition.published",version:"1.0.0",description:"A workflow definition has been published and is now active.",stability:"stable",owners:["@workflow-team"],tags:["workflow","definition","published"]},payload:h0}),Fg=J0({meta:{key:"workflow.step.added",version:"1.0.0",description:"A step has been added to a workflow definition.",stability:"stable",owners:["@workflow-team"],tags:["workflow","step","added"]},payload:Cg});import{defineCommand as H0,defineQuery as AA}from"@contractspec/lib.contracts-spec/operations";import{defineSchemaModel as V0,ScalarTypeEnum as E}from"@contractspec/lib.schema";var p=["@example.workflow-system"],Jg=H0({meta:{key:"workflow.definition.create",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","create"],description:"Create a new workflow definition.",goal:"Allow users to define new workflow blueprints.",context:"Workflow designer, admin panel."},io:{input:B0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.created",version:"1.0.0",when:"Workflow is created",payload:B}],audit:["workflow.definition.created"]},acceptance:{scenarios:[{key:"create-workflow-happy-path",given:["User is admin"],when:["User creates new workflow definition"],then:["Definition is created","WorkflowDefinitionCreated event is emitted"]}],examples:[{key:"create-onboarding",input:{key:"onboarding-v1",name:"Employee Onboarding",version:"1.0.0"},output:{id:"def-123",status:"draft"}}]}}),Vg=H0({meta:{key:"workflow.definition.update",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","update"],description:"Update an existing workflow definition.",goal:"Allow users to modify workflow blueprints.",context:"Workflow designer."},io:{input:v0,output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.updated",version:"1.0.0",when:"Workflow is updated",payload:B}],audit:["workflow.definition.updated"]},acceptance:{scenarios:[{key:"update-workflow-happy-path",given:["Workflow definition exists"],when:["User updates definition"],then:["Definition is updated","WorkflowDefinitionUpdated event is emitted"]}],examples:[{key:"update-name",input:{workflowId:"def-123",name:"New Employee Onboarding"},output:{id:"def-123",name:"New Employee Onboarding"}}]}}),Hg=H0({meta:{key:"workflow.step.add",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","step","add"],description:"Add a step to a workflow definition.",goal:"Build workflow structure step by step.",context:"Workflow designer."},io:{input:z0,output:l},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.step.added",version:"1.0.0",when:"Step is added",payload:l}],audit:["workflow.step.added"]},acceptance:{scenarios:[{key:"add-step-happy-path",given:["Workflow definition exists"],when:["User adds a step"],then:["Step is added","StepAdded event is emitted"]}],examples:[{key:"add-approval-step",input:{workflowId:"def-123",stepKey:"approve-contract",type:"approval"},output:{id:"step-456",key:"approve-contract"}}]}}),Yg=H0({meta:{key:"workflow.definition.publish",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","publish"],description:"Publish a workflow definition to make it available for use.",goal:"Activate workflow for production use.",context:"Workflow designer, deployment."},io:{input:V0({name:"PublishWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},sideEffects:{emits:[{key:"workflow.definition.published",version:"1.0.0",when:"Workflow is published",payload:B}],audit:["workflow.definition.published"]},acceptance:{scenarios:[{key:"publish-workflow-happy-path",given:["Workflow definition is valid"],when:["User publishes workflow"],then:["Workflow becomes active","WorkflowPublished event is emitted"]}],examples:[{key:"publish-onboarding",input:{workflowId:"def-123"},output:{id:"def-123",status:"published"}}]}}),Kg=AA({meta:{key:"workflow.definition.list",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","list"],description:"List workflow definitions with filtering.",goal:"Browse and search available workflows.",context:"Workflow list, search."},io:{input:V0({name:"ListWorkflowsInput",fields:{status:{type:c,isOptional:!0},search:{type:E.String_unsecure(),isOptional:!0},limit:{type:E.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:E.Int_unsecure(),isOptional:!0,defaultValue:0}}}),output:V0({name:"ListWorkflowsOutput",fields:{workflows:{type:B,isArray:!0,isOptional:!1},total:{type:E.Int_unsecure(),isOptional:!1}}})},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-workflows-happy-path",given:["Workflow definitions exist"],when:["User lists workflows"],then:["List of workflows is returned"]}],examples:[{key:"list-all",input:{limit:10},output:{workflows:[],total:5}}]}}),Xg=AA({meta:{key:"workflow.definition.get",version:"1.0.0",stability:"stable",owners:[...p],tags:["workflow","definition","get"],description:"Get a workflow definition with all steps.",goal:"View workflow details.",context:"Workflow designer, detail view."},io:{input:V0({name:"GetWorkflowInput",fields:{workflowId:{type:E.String_unsecure(),isOptional:!1}}}),output:B},policy:{auth:"user"},acceptance:{scenarios:[{key:"get-workflow-happy-path",given:["Workflow definition exists"],when:["User requests workflow details"],then:["Workflow details are returned"]}],examples:[{key:"get-details",input:{workflowId:"def-123"},output:{id:"def-123",name:"Employee Onboarding"}}]}});import{defineFeature as $g}from"@contractspec/lib.contracts-spec/features";var q_=$g({meta:{key:"workflow-system",title:"Workflow & Approval System",description:"State machine-based workflow engine with role-based approvals, delegation, and escalation",domain:"workflow",owners:["@workflow-team"],tags:["workflow","approval","state-machine","automation"],stability:"experimental",version:"1.0.0"},operations:[{key:"workflow.definition.create",version:"1.0.0"},{key:"workflow.definition.update",version:"1.0.0"},{key:"workflow.step.add",version:"1.0.0"},{key:"workflow.definition.publish",version:"1.0.0"},{key:"workflow.definition.list",version:"1.0.0"},{key:"workflow.definition.get",version:"1.0.0"},{key:"workflow.instance.start",version:"1.0.0"},{key:"workflow.instance.transition",version:"1.0.0"},{key:"workflow.instance.pause",version:"1.0.0"},{key:"workflow.instance.resume",version:"1.0.0"},{key:"workflow.instance.cancel",version:"1.0.0"},{key:"workflow.instance.list",version:"1.0.0"},{key:"workflow.instance.get",version:"1.0.0"},{key:"workflow.approval.decide",version:"1.0.0"},{key:"workflow.approval.delegate",version:"1.0.0"},{key:"workflow.approval.comment.add",version:"1.0.0"},{key:"workflow.approval.list.mine",version:"1.0.0"},{key:"workflow.approval.get",version:"1.0.0"}],events:[{key:"workflow.definition.created",version:"1.0.0"},{key:"workflow.definition.updated",version:"1.0.0"},{key:"workflow.definition.published",version:"1.0.0"},{key:"workflow.step.added",version:"1.0.0"},{key:"workflow.instance.started",version:"1.0.0"},{key:"workflow.step.entered",version:"1.0.0"},{key:"workflow.step.exited",version:"1.0.0"},{key:"workflow.instance.completed",version:"1.0.0"},{key:"workflow.instance.cancelled",version:"1.0.0"},{key:"workflow.instance.paused",version:"1.0.0"},{key:"workflow.instance.resumed",version:"1.0.0"},{key:"workflow.instance.failed",version:"1.0.0"},{key:"workflow.instance.timedOut",version:"1.0.0"},{key:"workflow.approval.requested",version:"1.0.0"},{key:"workflow.approval.decided",version:"1.0.0"},{key:"workflow.approval.delegated",version:"1.0.0"},{key:"workflow.approval.escalated",version:"1.0.0"}],presentations:[{key:"workflow.designer",version:"1.0.0"},{key:"workflow.definition.viewList",version:"1.0.0"},{key:"workflow.definition.detail",version:"1.0.0"},{key:"workflow.instance.viewList",version:"1.0.0"},{key:"workflow.instance.detail",version:"1.0.0"},{key:"workflow.instance.progress",version:"1.0.0"},{key:"workflow.approval.inbox",version:"1.0.0"},{key:"workflow.approval.detail",version:"1.0.0"},{key:"workflow.approval.form",version:"1.0.0"},{key:"workflow.approval.badge",version:"1.0.0"},{key:"workflow.metrics",version:"1.0.0"}],opToPresentation:[{op:{key:"workflow.definition.list",version:"1.0.0"},pres:{key:"workflow.definition.viewList",version:"1.0.0"}},{op:{key:"workflow.instance.list",version:"1.0.0"},pres:{key:"workflow.instance.viewList",version:"1.0.0"}},{op:{key:"workflow.approval.list.mine",version:"1.0.0"},pres:{key:"workflow.approval.inbox",version:"1.0.0"}},{op:{key:"workflow.approval.decide",version:"1.0.0"},pres:{key:"workflow.approval.form",version:"1.0.0"}}],presentationsTargets:[{key:"workflow.designer",version:"1.0.0",targets:["react"]},{key:"workflow.definition.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.definition.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.instance.progress",version:"1.0.0",targets:["react"]},{key:"workflow.approval.inbox",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.approval.detail",version:"1.0.0",targets:["react","markdown"]},{key:"workflow.metrics",version:"1.0.0",targets:["react","markdown"]}],visualizations:c0,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"notifications",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"}],provides:[{key:"workflow",version:"1.0.0"},{key:"approval",version:"1.0.0"},{key:"state-machine",version:"1.0.0"}]},workflows:[{key:"workflow-system.workflow.approval-chain",version:"1.0.0"}],telemetry:[{key:"workflow-system.telemetry",version:"1.0.0"}],jobs:[{key:"workflow-system.job.instance-timeout",version:"1.0.0"},{key:"workflow-system.job.escalation",version:"1.0.0"}],docs:["docs.examples.workflow-system","docs.examples.workflow-system.goal","docs.examples.workflow-system.usage","docs.examples.workflow-system.constraints"]});export{gg as workflowInstanceDetailMarkdownRenderer,Ag as workflowDefinitionListMarkdownRenderer,aA as workflowDashboardMarkdownRenderer,q0 as useWorkflowList,Wg as mockDataStore,G0 as createWorkflowVisualizationSections,eg as createWorkflowHandlers,bg as createStateMachineEngine,Mg as createInitialState,xg as buildStateMachineDefinition,s0 as WorkflowVisualizationSpecs,p2 as WorkflowVisualizationRegistry,c0 as WorkflowVisualizationRefs,Gg as WorkflowUpdatedEvent,d0 as WorkflowThroughputVisualization,z2 as WorkflowSystemPresentations,q_ as WorkflowSystemFeature,l as WorkflowStepModel,c as WorkflowStatusEnum,Ug as WorkflowPublishedEvent,sA as WorkflowMetricsPresentation,wA as WorkflowListPresentation,W0 as WorkflowInstanceStatusVisualization,K as WorkflowInstanceModel,TA as WorkflowDetailPresentation,rA as WorkflowDesignerPresentation,B as WorkflowDefinitionModel,Pg as WorkflowDashboard,Ng as WorkflowCreatedEvent,x0 as WorkflowCompletedMetricVisualization,b0 as WorkflowActiveMetricVisualization,v0 as UpdateWorkflowInputModel,Vg as UpdateWorkflowContract,u as TriggerTypeEnum,bA as TransitionWorkflowContract,Q0 as TransitionResultModel,k0 as TransitionInputModel,PA as SubmitDecisionContract,Z0 as StepTypeEnum,kA as StepExitedEvent,$A as StepEnteredEvent,Fg as StepAddedEvent,$0 as StartWorkflowInputModel,dA as StartWorkflowContract,MA as ResumeWorkflowContract,Yg as PublishWorkflowContract,yA as ProgressTrackerPresentation,tA as PendingApprovalsBadgePresentation,xA as PauseWorkflowContract,Kg as ListWorkflowsContract,GA as ListMyApprovalsContract,jA as ListInstancesContract,WA as InstanceTimedOutEvent,t as InstanceStatusEnum,XA as InstanceStartedEvent,zA as InstanceResumedEvent,vA as InstancePausedEvent,EA as InstanceListPresentation,qA as InstanceFailedEvent,pA as InstanceDetailPresentation,QA as InstanceCompletedEvent,BA as InstanceCancelledEvent,Xg as GetWorkflowContract,fA as GetInstanceContract,UA as GetApprovalContract,JA as ExamplesWorkflowSystemExample,CA as DelegateApprovalContract,B0 as CreateWorkflowInputModel,Jg as CreateWorkflowContract,hA as CancelWorkflowContract,w0 as BasicStateMachineEngine,y as ApprovalStatusEnum,LA as ApprovalRequestedEvent,b as ApprovalRequestModel,O0 as ApprovalModeEnum,oA as ApprovalInboxPresentation,SA as ApprovalFormPresentation,IA as ApprovalEscalatedEvent,mA as ApprovalDetailPresentation,OA as ApprovalDelegatedEvent,o as ApprovalDecisionEnum,ZA as ApprovalDecidedEvent,_0 as ApprovalCommentModel,z0 as AddStepInputModel,Hg as AddStepContract,NA as AddApprovalCommentContract};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/example.workflow-system",
|
|
3
|
-
"version": "3.8.
|
|
3
|
+
"version": "3.8.14",
|
|
4
4
|
"description": "Workflow and approval system example for ContractSpec - State machine with role-based transitions",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -21,20 +21,20 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@contractspec/lib.schema": "3.7.14",
|
|
24
|
-
"@contractspec/lib.contracts-spec": "5.
|
|
25
|
-
"@contractspec/lib.example-shared-ui": "6.0.
|
|
26
|
-
"@contractspec/lib.design-system": "3.
|
|
27
|
-
"@contractspec/lib.runtime-sandbox": "2.7.
|
|
24
|
+
"@contractspec/lib.contracts-spec": "5.5.0",
|
|
25
|
+
"@contractspec/lib.example-shared-ui": "6.0.22",
|
|
26
|
+
"@contractspec/lib.design-system": "3.11.0",
|
|
27
|
+
"@contractspec/lib.runtime-sandbox": "2.7.15",
|
|
28
28
|
"react": "19.2.0",
|
|
29
29
|
"react-dom": "19.2.0",
|
|
30
|
-
"@contractspec/lib.presentation-runtime-core": "
|
|
30
|
+
"@contractspec/lib.presentation-runtime-core": "5.0.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@contractspec/tool.typescript": "3.7.13",
|
|
34
34
|
"typescript": "^5.9.3",
|
|
35
35
|
"@types/react": "^19.2.14",
|
|
36
36
|
"@types/react-dom": "^19.2.2",
|
|
37
|
-
"@contractspec/tool.bun": "3.7.
|
|
37
|
+
"@contractspec/tool.bun": "3.7.15"
|
|
38
38
|
},
|
|
39
39
|
"exports": {
|
|
40
40
|
".": {
|