@lssm/example.workflow-system 0.0.0-canary-20251217083314 → 0.0.0-canary-20251220002821

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/LICENSE +21 -0
  2. package/dist/approval/approval.contracts.d.ts +136 -135
  3. package/dist/approval/approval.contracts.d.ts.map +1 -0
  4. package/dist/approval/approval.contracts.js +23 -24
  5. package/dist/approval/approval.contracts.js.map +1 -0
  6. package/dist/approval/approval.enum.d.ts +5 -4
  7. package/dist/approval/approval.enum.d.ts.map +1 -0
  8. package/dist/approval/approval.enum.js +5 -5
  9. package/dist/approval/approval.enum.js.map +1 -0
  10. package/dist/approval/approval.event.d.ts +34 -33
  11. package/dist/approval/approval.event.d.ts.map +1 -0
  12. package/dist/approval/approval.event.js +34 -34
  13. package/dist/approval/approval.event.js.map +1 -0
  14. package/dist/approval/approval.handler.d.ts +2 -1
  15. package/dist/approval/approval.handler.d.ts.map +1 -0
  16. package/dist/approval/approval.handler.js +2 -1
  17. package/dist/approval/approval.handler.js.map +1 -0
  18. package/dist/approval/approval.schema.d.ts +26 -25
  19. package/dist/approval/approval.schema.d.ts.map +1 -0
  20. package/dist/approval/approval.schema.js +24 -25
  21. package/dist/approval/approval.schema.js.map +1 -0
  22. package/dist/docs/workflow-system.docblock.js +2 -1
  23. package/dist/docs/workflow-system.docblock.js.map +1 -0
  24. package/dist/entities/approval.d.ts +38 -37
  25. package/dist/entities/approval.d.ts.map +1 -0
  26. package/dist/entities/approval.js +44 -44
  27. package/dist/entities/approval.js.map +1 -0
  28. package/dist/entities/index.d.ts +129 -128
  29. package/dist/entities/index.d.ts.map +1 -0
  30. package/dist/entities/index.js +2 -1
  31. package/dist/entities/index.js.map +1 -0
  32. package/dist/entities/instance.d.ts +49 -48
  33. package/dist/entities/instance.d.ts.map +1 -0
  34. package/dist/entities/instance.js +58 -58
  35. package/dist/entities/instance.js.map +1 -0
  36. package/dist/entities/step.d.ts +34 -33
  37. package/dist/entities/step.d.ts.map +1 -0
  38. package/dist/entities/step.js +37 -37
  39. package/dist/entities/step.js.map +1 -0
  40. package/dist/entities/workflow.d.ts +25 -24
  41. package/dist/entities/workflow.d.ts.map +1 -0
  42. package/dist/entities/workflow.js +28 -28
  43. package/dist/entities/workflow.js.map +1 -0
  44. package/dist/example.d.ts +2 -1
  45. package/dist/example.d.ts.map +1 -0
  46. package/dist/example.js +2 -1
  47. package/dist/example.js.map +1 -0
  48. package/dist/instance/instance.contracts.d.ts +258 -257
  49. package/dist/instance/instance.contracts.d.ts.map +1 -0
  50. package/dist/instance/instance.contracts.js +23 -24
  51. package/dist/instance/instance.contracts.js.map +1 -0
  52. package/dist/instance/instance.enum.d.ts +4 -3
  53. package/dist/instance/instance.enum.d.ts.map +1 -0
  54. package/dist/instance/instance.enum.js +4 -4
  55. package/dist/instance/instance.enum.js.map +1 -0
  56. package/dist/instance/instance.event.d.ts +89 -88
  57. package/dist/instance/instance.event.d.ts.map +1 -0
  58. package/dist/instance/instance.event.js +31 -31
  59. package/dist/instance/instance.event.js.map +1 -0
  60. package/dist/instance/instance.handler.d.ts +2 -1
  61. package/dist/instance/instance.handler.d.ts.map +1 -0
  62. package/dist/instance/instance.handler.js +2 -1
  63. package/dist/instance/instance.handler.js.map +1 -0
  64. package/dist/instance/instance.schema.d.ts +56 -55
  65. package/dist/instance/instance.schema.d.ts.map +1 -0
  66. package/dist/instance/instance.schema.js +37 -38
  67. package/dist/instance/instance.schema.js.map +1 -0
  68. package/dist/libs/contracts/dist/capabilities/openbanking.js +2 -1
  69. package/dist/libs/contracts/dist/capabilities/openbanking.js.map +1 -0
  70. package/dist/libs/contracts/dist/contract-registry/schemas.js +2 -1
  71. package/dist/libs/contracts/dist/contract-registry/schemas.js.map +1 -0
  72. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +2 -1
  73. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js.map +1 -0
  74. package/dist/libs/contracts/dist/docs/index.js +2 -6
  75. package/dist/libs/contracts/dist/docs/meta.docs.js +30 -0
  76. package/dist/libs/contracts/dist/docs/meta.docs.js.map +1 -0
  77. package/dist/libs/contracts/dist/docs/presentations.js +2 -1
  78. package/dist/libs/contracts/dist/docs/presentations.js.map +1 -0
  79. package/dist/libs/contracts/dist/docs/registry.js +2 -1
  80. package/dist/libs/contracts/dist/docs/registry.js.map +1 -0
  81. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +2 -1
  82. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js.map +1 -0
  83. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +2 -1
  84. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js.map +1 -0
  85. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +2 -1
  86. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js.map +1 -0
  87. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +2 -1
  88. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js.map +1 -0
  89. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +2 -1
  90. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js.map +1 -0
  91. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +2 -1
  92. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js.map +1 -0
  93. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +2 -1
  94. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js.map +1 -0
  95. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +2 -1
  96. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js.map +1 -0
  97. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +2 -1
  98. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js.map +1 -0
  99. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +2 -1
  100. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js.map +1 -0
  101. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +2 -1
  102. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js.map +1 -0
  103. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +2 -1
  104. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js.map +1 -0
  105. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +2 -1
  106. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js.map +1 -0
  107. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +2 -1
  108. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js.map +1 -0
  109. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +2 -1
  110. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js.map +1 -0
  111. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +2 -1
  112. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js.map +1 -0
  113. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +2 -1
  114. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js.map +1 -0
  115. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +2 -1
  116. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js.map +1 -0
  117. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +2 -1
  118. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js.map +1 -0
  119. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +2 -1
  120. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js.map +1 -0
  121. package/dist/libs/contracts/dist/docs/tech-contracts.docs.js +97 -0
  122. package/dist/libs/contracts/dist/docs/tech-contracts.docs.js.map +1 -0
  123. package/dist/libs/contracts/dist/events.js +2 -1
  124. package/dist/libs/contracts/dist/events.js.map +1 -0
  125. package/dist/libs/contracts/dist/index.js +3 -2
  126. package/dist/libs/contracts/dist/integrations/contracts.js +65 -66
  127. package/dist/libs/contracts/dist/integrations/contracts.js.map +1 -0
  128. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +31 -32
  129. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js.map +1 -0
  130. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +18 -19
  131. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js.map +1 -0
  132. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +32 -33
  133. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js.map +1 -0
  134. package/dist/libs/contracts/dist/integrations/openbanking/models.js +60 -61
  135. package/dist/libs/contracts/dist/integrations/openbanking/models.js.map +1 -0
  136. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +2 -1
  137. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js.map +1 -0
  138. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +2 -1
  139. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js.map +1 -0
  140. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +2 -1
  141. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js.map +1 -0
  142. package/dist/libs/contracts/dist/integrations/providers/gmail.js +2 -1
  143. package/dist/libs/contracts/dist/integrations/providers/gmail.js.map +1 -0
  144. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +2 -1
  145. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js.map +1 -0
  146. package/dist/libs/contracts/dist/integrations/providers/mistral.js +2 -1
  147. package/dist/libs/contracts/dist/integrations/providers/mistral.js.map +1 -0
  148. package/dist/libs/contracts/dist/integrations/providers/postmark.js +2 -1
  149. package/dist/libs/contracts/dist/integrations/providers/postmark.js.map +1 -0
  150. package/dist/libs/contracts/dist/integrations/providers/powens.js +2 -1
  151. package/dist/libs/contracts/dist/integrations/providers/powens.js.map +1 -0
  152. package/dist/libs/contracts/dist/integrations/providers/qdrant.js +2 -1
  153. package/dist/libs/contracts/dist/integrations/providers/qdrant.js.map +1 -0
  154. package/dist/libs/contracts/dist/integrations/providers/stripe.js +2 -1
  155. package/dist/libs/contracts/dist/integrations/providers/stripe.js.map +1 -0
  156. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +2 -1
  157. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js.map +1 -0
  158. package/dist/libs/contracts/dist/knowledge/contracts.js +44 -45
  159. package/dist/libs/contracts/dist/knowledge/contracts.js.map +1 -0
  160. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js +2 -1
  161. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js.map +1 -0
  162. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js +2 -1
  163. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js.map +1 -0
  164. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js +2 -1
  165. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js.map +1 -0
  166. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js +2 -1
  167. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js.map +1 -0
  168. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js +2 -1
  169. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js.map +1 -0
  170. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js +2 -1
  171. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js.map +1 -0
  172. package/dist/libs/contracts/dist/llm/exporters.js +2 -1
  173. package/dist/libs/contracts/dist/llm/exporters.js.map +1 -0
  174. package/dist/libs/contracts/dist/onboarding-base.js +22 -23
  175. package/dist/libs/contracts/dist/onboarding-base.js.map +1 -0
  176. package/dist/libs/contracts/dist/ownership.js +4 -2
  177. package/dist/libs/contracts/dist/ownership.js.map +1 -0
  178. package/dist/libs/contracts/dist/presentations.v2.js +2 -1
  179. package/dist/libs/contracts/dist/presentations.v2.js.map +1 -0
  180. package/dist/libs/contracts/dist/regenerator/service.js +2 -1
  181. package/dist/libs/contracts/dist/regenerator/service.js.map +1 -0
  182. package/dist/libs/contracts/dist/schema/dist/index.js +3874 -6
  183. package/dist/libs/contracts/dist/schema/dist/index.js.map +1 -0
  184. package/dist/libs/contracts/dist/spec.js +2 -1
  185. package/dist/libs/contracts/dist/spec.js.map +1 -0
  186. package/dist/libs/schema/dist/index.js +4922 -6
  187. package/dist/libs/schema/dist/index.js.map +1 -0
  188. package/dist/presentations/index.d.ts +2 -1
  189. package/dist/presentations/index.d.ts.map +1 -0
  190. package/dist/presentations/index.js +2 -1
  191. package/dist/presentations/index.js.map +1 -0
  192. package/dist/shared/mock-data.d.ts +2 -1
  193. package/dist/shared/mock-data.d.ts.map +1 -0
  194. package/dist/shared/mock-data.js +2 -1
  195. package/dist/shared/mock-data.js.map +1 -0
  196. package/dist/shared/types.d.ts +2 -1
  197. package/dist/shared/types.d.ts.map +1 -0
  198. package/dist/state-machine/index.d.ts +2 -1
  199. package/dist/state-machine/index.d.ts.map +1 -0
  200. package/dist/state-machine/index.js +2 -1
  201. package/dist/state-machine/index.js.map +1 -0
  202. package/dist/workflow/workflow.contracts.d.ts +248 -247
  203. package/dist/workflow/workflow.contracts.d.ts.map +1 -0
  204. package/dist/workflow/workflow.contracts.js +13 -14
  205. package/dist/workflow/workflow.contracts.js.map +1 -0
  206. package/dist/workflow/workflow.enum.d.ts +7 -6
  207. package/dist/workflow/workflow.enum.d.ts.map +1 -0
  208. package/dist/workflow/workflow.enum.js +7 -7
  209. package/dist/workflow/workflow.enum.js.map +1 -0
  210. package/dist/workflow/workflow.event.d.ts +35 -34
  211. package/dist/workflow/workflow.event.d.ts.map +1 -0
  212. package/dist/workflow/workflow.event.js +19 -19
  213. package/dist/workflow/workflow.event.js.map +1 -0
  214. package/dist/workflow/workflow.handler.d.ts +2 -1
  215. package/dist/workflow/workflow.handler.d.ts.map +1 -0
  216. package/dist/workflow/workflow.handler.js +2 -1
  217. package/dist/workflow/workflow.handler.js.map +1 -0
  218. package/dist/workflow/workflow.schema.d.ts +2 -1
  219. package/dist/workflow/workflow.schema.d.ts.map +1 -0
  220. package/dist/workflow/workflow.schema.js +47 -48
  221. package/dist/workflow/workflow.schema.js.map +1 -0
  222. package/dist/workflow-system.feature.d.ts +2 -1
  223. package/dist/workflow-system.feature.d.ts.map +1 -0
  224. package/dist/workflow-system.feature.js +2 -1
  225. package/dist/workflow-system.feature.js.map +1 -0
  226. package/package.json +19 -12
  227. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +0 -16
  228. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +0 -16
  229. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +0 -16
  230. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +0 -16
  231. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +0 -16
  232. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +0 -16
  233. package/dist/libs/contracts/dist/schema/dist/EnumType.js +0 -2
  234. package/dist/libs/contracts/dist/schema/dist/FieldType.js +0 -49
  235. package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +0 -236
  236. package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +0 -39
  237. package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +0 -1
  238. package/dist/libs/contracts/dist/schema/dist/entity/index.js +0 -2
  239. package/dist/libs/contracts/dist/schema/dist/entity/types.js +0 -1
  240. package/dist/libs/schema/dist/EnumType.js +0 -56
  241. package/dist/libs/schema/dist/FieldType.js +0 -49
  242. package/dist/libs/schema/dist/ScalarTypeEnum.js +0 -236
  243. package/dist/libs/schema/dist/SchemaModel.js +0 -39
  244. package/dist/libs/schema/dist/entity/defineEntity.js +0 -236
  245. package/dist/libs/schema/dist/entity/index.js +0 -2
  246. package/dist/libs/schema/dist/entity/types.js +0 -1
@@ -1,30 +1,28 @@
1
- import { ScalarTypeEnum } from "../libs/schema/dist/ScalarTypeEnum.js";
2
- import { defineSchemaModel } from "../libs/schema/dist/SchemaModel.js";
3
- import "../libs/schema/dist/index.js";
1
+ import { E5, K5 } from "../libs/schema/dist/index.js";
4
2
  import { ApprovalModeEnum, StepTypeEnum, TriggerTypeEnum, WorkflowStatusEnum } from "./workflow.enum.js";
5
3
 
6
4
  //#region src/workflow/workflow.schema.ts
7
5
  /**
8
6
  * A step in a workflow definition.
9
7
  */
10
- const WorkflowStepModel = defineSchemaModel({
8
+ const WorkflowStepModel = K5({
11
9
  name: "WorkflowStepModel",
12
10
  description: "A step in a workflow definition",
13
11
  fields: {
14
12
  id: {
15
- type: ScalarTypeEnum.String_unsecure(),
13
+ type: E5.String_unsecure(),
16
14
  isOptional: false
17
15
  },
18
16
  key: {
19
- type: ScalarTypeEnum.String_unsecure(),
17
+ type: E5.String_unsecure(),
20
18
  isOptional: false
21
19
  },
22
20
  name: {
23
- type: ScalarTypeEnum.String_unsecure(),
21
+ type: E5.String_unsecure(),
24
22
  isOptional: false
25
23
  },
26
24
  description: {
27
- type: ScalarTypeEnum.String_unsecure(),
25
+ type: E5.String_unsecure(),
28
26
  isOptional: true
29
27
  },
30
28
  type: {
@@ -32,11 +30,11 @@ const WorkflowStepModel = defineSchemaModel({
32
30
  isOptional: false
33
31
  },
34
32
  position: {
35
- type: ScalarTypeEnum.Int_unsecure(),
33
+ type: E5.Int_unsecure(),
36
34
  isOptional: false
37
35
  },
38
36
  transitions: {
39
- type: ScalarTypeEnum.JSON(),
37
+ type: E5.JSON(),
40
38
  isOptional: false
41
39
  },
42
40
  approvalMode: {
@@ -44,7 +42,7 @@ const WorkflowStepModel = defineSchemaModel({
44
42
  isOptional: true
45
43
  },
46
44
  approverRoles: {
47
- type: ScalarTypeEnum.String_unsecure(),
45
+ type: E5.String_unsecure(),
48
46
  isArray: true,
49
47
  isOptional: true
50
48
  }
@@ -53,28 +51,28 @@ const WorkflowStepModel = defineSchemaModel({
53
51
  /**
54
52
  * A workflow definition.
55
53
  */
56
- const WorkflowDefinitionModel = defineSchemaModel({
54
+ const WorkflowDefinitionModel = K5({
57
55
  name: "WorkflowDefinitionModel",
58
56
  description: "A workflow definition",
59
57
  fields: {
60
58
  id: {
61
- type: ScalarTypeEnum.String_unsecure(),
59
+ type: E5.String_unsecure(),
62
60
  isOptional: false
63
61
  },
64
62
  name: {
65
- type: ScalarTypeEnum.String_unsecure(),
63
+ type: E5.String_unsecure(),
66
64
  isOptional: false
67
65
  },
68
66
  key: {
69
- type: ScalarTypeEnum.String_unsecure(),
67
+ type: E5.String_unsecure(),
70
68
  isOptional: false
71
69
  },
72
70
  description: {
73
- type: ScalarTypeEnum.String_unsecure(),
71
+ type: E5.String_unsecure(),
74
72
  isOptional: true
75
73
  },
76
74
  version: {
77
- type: ScalarTypeEnum.Int_unsecure(),
75
+ type: E5.Int_unsecure(),
78
76
  isOptional: false
79
77
  },
80
78
  status: {
@@ -86,23 +84,23 @@ const WorkflowDefinitionModel = defineSchemaModel({
86
84
  isOptional: false
87
85
  },
88
86
  initialStepId: {
89
- type: ScalarTypeEnum.String_unsecure(),
87
+ type: E5.String_unsecure(),
90
88
  isOptional: true
91
89
  },
92
90
  featureFlagKey: {
93
- type: ScalarTypeEnum.String_unsecure(),
91
+ type: E5.String_unsecure(),
94
92
  isOptional: true
95
93
  },
96
94
  organizationId: {
97
- type: ScalarTypeEnum.String_unsecure(),
95
+ type: E5.String_unsecure(),
98
96
  isOptional: false
99
97
  },
100
98
  createdAt: {
101
- type: ScalarTypeEnum.DateTime(),
99
+ type: E5.DateTime(),
102
100
  isOptional: false
103
101
  },
104
102
  updatedAt: {
105
- type: ScalarTypeEnum.DateTime(),
103
+ type: E5.DateTime(),
106
104
  isOptional: false
107
105
  },
108
106
  steps: {
@@ -115,20 +113,20 @@ const WorkflowDefinitionModel = defineSchemaModel({
115
113
  /**
116
114
  * Input for creating a workflow definition.
117
115
  */
118
- const CreateWorkflowInputModel = defineSchemaModel({
116
+ const CreateWorkflowInputModel = K5({
119
117
  name: "CreateWorkflowInput",
120
118
  description: "Input for creating a workflow definition",
121
119
  fields: {
122
120
  name: {
123
- type: ScalarTypeEnum.NonEmptyString(),
121
+ type: E5.NonEmptyString(),
124
122
  isOptional: false
125
123
  },
126
124
  key: {
127
- type: ScalarTypeEnum.NonEmptyString(),
125
+ type: E5.NonEmptyString(),
128
126
  isOptional: false
129
127
  },
130
128
  description: {
131
- type: ScalarTypeEnum.String_unsecure(),
129
+ type: E5.String_unsecure(),
132
130
  isOptional: true
133
131
  },
134
132
  triggerType: {
@@ -136,15 +134,15 @@ const CreateWorkflowInputModel = defineSchemaModel({
136
134
  isOptional: true
137
135
  },
138
136
  triggerConfig: {
139
- type: ScalarTypeEnum.JSON(),
137
+ type: E5.JSON(),
140
138
  isOptional: true
141
139
  },
142
140
  featureFlagKey: {
143
- type: ScalarTypeEnum.String_unsecure(),
141
+ type: E5.String_unsecure(),
144
142
  isOptional: true
145
143
  },
146
144
  settings: {
147
- type: ScalarTypeEnum.JSON(),
145
+ type: E5.JSON(),
148
146
  isOptional: true
149
147
  }
150
148
  }
@@ -152,20 +150,20 @@ const CreateWorkflowInputModel = defineSchemaModel({
152
150
  /**
153
151
  * Input for updating a workflow definition.
154
152
  */
155
- const UpdateWorkflowInputModel = defineSchemaModel({
153
+ const UpdateWorkflowInputModel = K5({
156
154
  name: "UpdateWorkflowInput",
157
155
  description: "Input for updating a workflow definition",
158
156
  fields: {
159
157
  workflowId: {
160
- type: ScalarTypeEnum.String_unsecure(),
158
+ type: E5.String_unsecure(),
161
159
  isOptional: false
162
160
  },
163
161
  name: {
164
- type: ScalarTypeEnum.String_unsecure(),
162
+ type: E5.String_unsecure(),
165
163
  isOptional: true
166
164
  },
167
165
  description: {
168
- type: ScalarTypeEnum.String_unsecure(),
166
+ type: E5.String_unsecure(),
169
167
  isOptional: true
170
168
  },
171
169
  triggerType: {
@@ -173,15 +171,15 @@ const UpdateWorkflowInputModel = defineSchemaModel({
173
171
  isOptional: true
174
172
  },
175
173
  triggerConfig: {
176
- type: ScalarTypeEnum.JSON(),
174
+ type: E5.JSON(),
177
175
  isOptional: true
178
176
  },
179
177
  featureFlagKey: {
180
- type: ScalarTypeEnum.String_unsecure(),
178
+ type: E5.String_unsecure(),
181
179
  isOptional: true
182
180
  },
183
181
  settings: {
184
- type: ScalarTypeEnum.JSON(),
182
+ type: E5.JSON(),
185
183
  isOptional: true
186
184
  }
187
185
  }
@@ -189,24 +187,24 @@ const UpdateWorkflowInputModel = defineSchemaModel({
189
187
  /**
190
188
  * Input for adding a step to a workflow.
191
189
  */
192
- const AddStepInputModel = defineSchemaModel({
190
+ const AddStepInputModel = K5({
193
191
  name: "AddStepInput",
194
192
  description: "Input for adding a step to a workflow",
195
193
  fields: {
196
194
  workflowId: {
197
- type: ScalarTypeEnum.String_unsecure(),
195
+ type: E5.String_unsecure(),
198
196
  isOptional: false
199
197
  },
200
198
  key: {
201
- type: ScalarTypeEnum.NonEmptyString(),
199
+ type: E5.NonEmptyString(),
202
200
  isOptional: false
203
201
  },
204
202
  name: {
205
- type: ScalarTypeEnum.NonEmptyString(),
203
+ type: E5.NonEmptyString(),
206
204
  isOptional: false
207
205
  },
208
206
  description: {
209
- type: ScalarTypeEnum.String_unsecure(),
207
+ type: E5.String_unsecure(),
210
208
  isOptional: true
211
209
  },
212
210
  type: {
@@ -214,11 +212,11 @@ const AddStepInputModel = defineSchemaModel({
214
212
  isOptional: false
215
213
  },
216
214
  position: {
217
- type: ScalarTypeEnum.Int_unsecure(),
215
+ type: E5.Int_unsecure(),
218
216
  isOptional: true
219
217
  },
220
218
  transitions: {
221
- type: ScalarTypeEnum.JSON(),
219
+ type: E5.JSON(),
222
220
  isOptional: false
223
221
  },
224
222
  approvalMode: {
@@ -226,25 +224,26 @@ const AddStepInputModel = defineSchemaModel({
226
224
  isOptional: true
227
225
  },
228
226
  approverRoles: {
229
- type: ScalarTypeEnum.String_unsecure(),
227
+ type: E5.String_unsecure(),
230
228
  isArray: true,
231
229
  isOptional: true
232
230
  },
233
231
  approverUserIds: {
234
- type: ScalarTypeEnum.String_unsecure(),
232
+ type: E5.String_unsecure(),
235
233
  isArray: true,
236
234
  isOptional: true
237
235
  },
238
236
  timeoutSeconds: {
239
- type: ScalarTypeEnum.Int_unsecure(),
237
+ type: E5.Int_unsecure(),
240
238
  isOptional: true
241
239
  },
242
240
  slaSeconds: {
243
- type: ScalarTypeEnum.Int_unsecure(),
241
+ type: E5.Int_unsecure(),
244
242
  isOptional: true
245
243
  }
246
244
  }
247
245
  });
248
246
 
249
247
  //#endregion
250
- export { AddStepInputModel, CreateWorkflowInputModel, UpdateWorkflowInputModel, WorkflowDefinitionModel, WorkflowStepModel };
248
+ export { AddStepInputModel, CreateWorkflowInputModel, UpdateWorkflowInputModel, WorkflowDefinitionModel, WorkflowStepModel };
249
+ //# sourceMappingURL=workflow.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.schema.js","names":["defineSchemaModel","ScalarTypeEnum"],"sources":["../../src/workflow/workflow.schema.ts"],"sourcesContent":["import { defineSchemaModel, ScalarTypeEnum } from '@lssm/lib.schema';\nimport {\n WorkflowStatusEnum,\n TriggerTypeEnum,\n StepTypeEnum,\n ApprovalModeEnum,\n} from './workflow.enum';\n\n/**\n * A step in a workflow definition.\n */\nexport const WorkflowStepModel = defineSchemaModel({\n name: 'WorkflowStepModel',\n description: 'A step in a workflow definition',\n fields: {\n id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n key: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n type: { type: StepTypeEnum, isOptional: false },\n position: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n transitions: { type: ScalarTypeEnum.JSON(), isOptional: false },\n approvalMode: { type: ApprovalModeEnum, isOptional: true },\n approverRoles: {\n type: ScalarTypeEnum.String_unsecure(),\n isArray: true,\n isOptional: true,\n },\n },\n});\n\n/**\n * A workflow definition.\n */\nexport const WorkflowDefinitionModel = defineSchemaModel({\n name: 'WorkflowDefinitionModel',\n description: 'A workflow definition',\n fields: {\n id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n key: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n version: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n status: { type: WorkflowStatusEnum, isOptional: false },\n triggerType: { type: TriggerTypeEnum, isOptional: false },\n initialStepId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n featureFlagKey: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n steps: { type: WorkflowStepModel, isArray: true, isOptional: true },\n },\n});\n\n/**\n * Input for creating a workflow definition.\n */\nexport const CreateWorkflowInputModel = defineSchemaModel({\n name: 'CreateWorkflowInput',\n description: 'Input for creating a workflow definition',\n fields: {\n name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n key: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n triggerType: { type: TriggerTypeEnum, isOptional: true },\n triggerConfig: { type: ScalarTypeEnum.JSON(), isOptional: true },\n featureFlagKey: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n settings: { type: ScalarTypeEnum.JSON(), isOptional: true },\n },\n});\n\n/**\n * Input for updating a workflow definition.\n */\nexport const UpdateWorkflowInputModel = defineSchemaModel({\n name: 'UpdateWorkflowInput',\n description: 'Input for updating a workflow definition',\n fields: {\n workflowId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n triggerType: { type: TriggerTypeEnum, isOptional: true },\n triggerConfig: { type: ScalarTypeEnum.JSON(), isOptional: true },\n featureFlagKey: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n settings: { type: ScalarTypeEnum.JSON(), isOptional: true },\n },\n});\n\n/**\n * Input for adding a step to a workflow.\n */\nexport const AddStepInputModel = defineSchemaModel({\n name: 'AddStepInput',\n description: 'Input for adding a step to a workflow',\n fields: {\n workflowId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n key: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n type: { type: StepTypeEnum, isOptional: false },\n position: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n transitions: { type: ScalarTypeEnum.JSON(), isOptional: false },\n approvalMode: { type: ApprovalModeEnum, isOptional: true },\n approverRoles: {\n type: ScalarTypeEnum.String_unsecure(),\n isArray: true,\n isOptional: true,\n },\n approverUserIds: {\n type: ScalarTypeEnum.String_unsecure(),\n isArray: true,\n isOptional: true,\n },\n timeoutSeconds: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n slaSeconds: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },\n },\n});\n"],"mappings":";;;;;;;AAWA,MAAa,oBAAoBA,GAAkB;CACjD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,IAAI;GAAE,MAAMC,GAAe,iBAAiB;GAAE,YAAY;GAAO;EACjE,KAAK;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAO;EAClE,MAAM;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAO;EACnE,aAAa;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAM;EACzE,MAAM;GAAE,MAAM;GAAc,YAAY;GAAO;EAC/C,UAAU;GAAE,MAAMA,GAAe,cAAc;GAAE,YAAY;GAAO;EACpE,aAAa;GAAE,MAAMA,GAAe,MAAM;GAAE,YAAY;GAAO;EAC/D,cAAc;GAAE,MAAM;GAAkB,YAAY;GAAM;EAC1D,eAAe;GACb,MAAMA,GAAe,iBAAiB;GACtC,SAAS;GACT,YAAY;GACb;EACF;CACF,CAAC;;;;AAKF,MAAa,0BAA0BD,GAAkB;CACvD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,IAAI;GAAE,MAAMC,GAAe,iBAAiB;GAAE,YAAY;GAAO;EACjE,MAAM;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAO;EACnE,KAAK;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAO;EAClE,aAAa;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAM;EACzE,SAAS;GAAE,MAAMA,GAAe,cAAc;GAAE,YAAY;GAAO;EACnE,QAAQ;GAAE,MAAM;GAAoB,YAAY;GAAO;EACvD,aAAa;GAAE,MAAM;GAAiB,YAAY;GAAO;EACzD,eAAe;GACb,MAAMA,GAAe,iBAAiB;GACtC,YAAY;GACb;EACD,gBAAgB;GACd,MAAMA,GAAe,iBAAiB;GACtC,YAAY;GACb;EACD,gBAAgB;GACd,MAAMA,GAAe,iBAAiB;GACtC,YAAY;GACb;EACD,WAAW;GAAE,MAAMA,GAAe,UAAU;GAAE,YAAY;GAAO;EACjE,WAAW;GAAE,MAAMA,GAAe,UAAU;GAAE,YAAY;GAAO;EACjE,OAAO;GAAE,MAAM;GAAmB,SAAS;GAAM,YAAY;GAAM;EACpE;CACF,CAAC;;;;AAKF,MAAa,2BAA2BD,GAAkB;CACxD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,MAAM;GAAE,MAAMC,GAAe,gBAAgB;GAAE,YAAY;GAAO;EAClE,KAAK;GAAE,MAAMA,GAAe,gBAAgB;GAAE,YAAY;GAAO;EACjE,aAAa;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAM;EACzE,aAAa;GAAE,MAAM;GAAiB,YAAY;GAAM;EACxD,eAAe;GAAE,MAAMA,GAAe,MAAM;GAAE,YAAY;GAAM;EAChE,gBAAgB;GACd,MAAMA,GAAe,iBAAiB;GACtC,YAAY;GACb;EACD,UAAU;GAAE,MAAMA,GAAe,MAAM;GAAE,YAAY;GAAM;EAC5D;CACF,CAAC;;;;AAKF,MAAa,2BAA2BD,GAAkB;CACxD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,YAAY;GACV,MAAMC,GAAe,iBAAiB;GACtC,YAAY;GACb;EACD,MAAM;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAM;EAClE,aAAa;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAM;EACzE,aAAa;GAAE,MAAM;GAAiB,YAAY;GAAM;EACxD,eAAe;GAAE,MAAMA,GAAe,MAAM;GAAE,YAAY;GAAM;EAChE,gBAAgB;GACd,MAAMA,GAAe,iBAAiB;GACtC,YAAY;GACb;EACD,UAAU;GAAE,MAAMA,GAAe,MAAM;GAAE,YAAY;GAAM;EAC5D;CACF,CAAC;;;;AAKF,MAAa,oBAAoBD,GAAkB;CACjD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,YAAY;GACV,MAAMC,GAAe,iBAAiB;GACtC,YAAY;GACb;EACD,KAAK;GAAE,MAAMA,GAAe,gBAAgB;GAAE,YAAY;GAAO;EACjE,MAAM;GAAE,MAAMA,GAAe,gBAAgB;GAAE,YAAY;GAAO;EAClE,aAAa;GAAE,MAAMA,GAAe,iBAAiB;GAAE,YAAY;GAAM;EACzE,MAAM;GAAE,MAAM;GAAc,YAAY;GAAO;EAC/C,UAAU;GAAE,MAAMA,GAAe,cAAc;GAAE,YAAY;GAAM;EACnE,aAAa;GAAE,MAAMA,GAAe,MAAM;GAAE,YAAY;GAAO;EAC/D,cAAc;GAAE,MAAM;GAAkB,YAAY;GAAM;EAC1D,eAAe;GACb,MAAMA,GAAe,iBAAiB;GACtC,SAAS;GACT,YAAY;GACb;EACD,iBAAiB;GACf,MAAMA,GAAe,iBAAiB;GACtC,SAAS;GACT,YAAY;GACb;EACD,gBAAgB;GAAE,MAAMA,GAAe,cAAc;GAAE,YAAY;GAAM;EACzE,YAAY;GAAE,MAAMA,GAAe,cAAc;GAAE,YAAY;GAAM;EACtE;CACF,CAAC"}
@@ -8,4 +8,5 @@ import { FeatureModuleSpec } from "@lssm/lib.contracts";
8
8
  */
9
9
  declare const WorkflowSystemFeature: FeatureModuleSpec;
10
10
  //#endregion
11
- export { WorkflowSystemFeature };
11
+ export { WorkflowSystemFeature };
12
+ //# sourceMappingURL=workflow-system.feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-system.feature.d.ts","names":[],"sources":["../src/workflow-system.feature.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAWa,uBAAuB"}
@@ -334,4 +334,5 @@ const WorkflowSystemFeature = {
334
334
  };
335
335
 
336
336
  //#endregion
337
- export { WorkflowSystemFeature };
337
+ export { WorkflowSystemFeature };
338
+ //# sourceMappingURL=workflow-system.feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-system.feature.js","names":["WorkflowSystemFeature: FeatureModuleSpec"],"sources":["../src/workflow-system.feature.ts"],"sourcesContent":["/**\n * Workflow System Feature Module Specification\n *\n * Defines the feature module for workflow and approval capabilities.\n */\nimport type { FeatureModuleSpec } from '@lssm/lib.contracts';\n\n/**\n * Workflow System feature module that bundles workflow definition,\n * instance management, and approval handling into an installable feature.\n */\nexport const WorkflowSystemFeature: FeatureModuleSpec = {\n meta: {\n key: 'workflow-system',\n title: 'Workflow & Approval System',\n description:\n 'State machine-based workflow engine with role-based approvals, delegation, and escalation',\n domain: 'workflow',\n owners: ['@workflow-team'],\n tags: ['workflow', 'approval', 'state-machine', 'automation'],\n stability: 'experimental',\n },\n\n // All contract operations included in this feature\n operations: [\n // Workflow definition operations\n { name: 'workflow.definition.create', version: 1 },\n { name: 'workflow.definition.update', version: 1 },\n { name: 'workflow.step.add', version: 1 },\n { name: 'workflow.definition.publish', version: 1 },\n { name: 'workflow.definition.list', version: 1 },\n { name: 'workflow.definition.get', version: 1 },\n\n // Workflow instance operations\n { name: 'workflow.instance.start', version: 1 },\n { name: 'workflow.instance.transition', version: 1 },\n { name: 'workflow.instance.pause', version: 1 },\n { name: 'workflow.instance.resume', version: 1 },\n { name: 'workflow.instance.cancel', version: 1 },\n { name: 'workflow.instance.list', version: 1 },\n { name: 'workflow.instance.get', version: 1 },\n\n // Approval operations\n { name: 'workflow.approval.decide', version: 1 },\n { name: 'workflow.approval.delegate', version: 1 },\n { name: 'workflow.approval.comment.add', version: 1 },\n { name: 'workflow.approval.list.mine', version: 1 },\n { name: 'workflow.approval.get', version: 1 },\n ],\n\n // Events emitted by this feature\n events: [\n // Definition events\n { name: 'workflow.definition.created', version: 1 },\n { name: 'workflow.definition.updated', version: 1 },\n { name: 'workflow.definition.published', version: 1 },\n { name: 'workflow.step.added', version: 1 },\n\n // Instance events\n { name: 'workflow.instance.started', version: 1 },\n { name: 'workflow.step.entered', version: 1 },\n { name: 'workflow.step.exited', version: 1 },\n { name: 'workflow.instance.completed', version: 1 },\n { name: 'workflow.instance.cancelled', version: 1 },\n { name: 'workflow.instance.paused', version: 1 },\n { name: 'workflow.instance.resumed', version: 1 },\n { name: 'workflow.instance.failed', version: 1 },\n { name: 'workflow.instance.timeout', version: 1 },\n\n // Approval events\n { name: 'workflow.approval.requested', version: 1 },\n { name: 'workflow.approval.decided', version: 1 },\n { name: 'workflow.approval.delegated', version: 1 },\n { name: 'workflow.approval.escalated', version: 1 },\n ],\n\n // Presentations associated with this feature\n presentations: [\n // Definition\n { name: 'workflow.designer', version: 1 },\n { name: 'workflow.definition.list', version: 1 },\n { name: 'workflow.definition.detail', version: 1 },\n\n // Instance\n { name: 'workflow.instance.list', version: 1 },\n { name: 'workflow.instance.detail', version: 1 },\n { name: 'workflow.instance.progress', version: 1 },\n\n // Approval\n { name: 'workflow.approval.inbox', version: 1 },\n { name: 'workflow.approval.detail', version: 1 },\n { name: 'workflow.approval.form', version: 1 },\n { name: 'workflow.approval.badge', version: 1 },\n\n // Dashboard\n { name: 'workflow.metrics', version: 1 },\n ],\n\n // Link operations to their primary presentations\n opToPresentation: [\n {\n op: { name: 'workflow.definition.list', version: 1 },\n pres: { name: 'workflow.definition.list', version: 1 },\n },\n {\n op: { name: 'workflow.instance.list', version: 1 },\n pres: { name: 'workflow.instance.list', version: 1 },\n },\n {\n op: { name: 'workflow.approval.list.mine', version: 1 },\n pres: { name: 'workflow.approval.inbox', version: 1 },\n },\n {\n op: { name: 'workflow.approval.decide', version: 1 },\n pres: { name: 'workflow.approval.form', version: 1 },\n },\n ],\n\n // Target requirements for multi-surface rendering\n presentationsTargets: [\n { name: 'workflow.designer', version: 1, targets: ['react'] },\n {\n name: 'workflow.definition.list',\n version: 1,\n targets: ['react', 'markdown'],\n },\n {\n name: 'workflow.definition.detail',\n version: 1,\n targets: ['react', 'markdown'],\n },\n {\n name: 'workflow.instance.list',\n version: 1,\n targets: ['react', 'markdown'],\n },\n {\n name: 'workflow.instance.detail',\n version: 1,\n targets: ['react', 'markdown'],\n },\n { name: 'workflow.instance.progress', version: 1, targets: ['react'] },\n {\n name: 'workflow.approval.inbox',\n version: 1,\n targets: ['react', 'markdown'],\n },\n {\n name: 'workflow.approval.detail',\n version: 1,\n targets: ['react', 'markdown'],\n },\n { name: 'workflow.metrics', version: 1, targets: ['react', 'markdown'] },\n ],\n\n // Capability requirements\n capabilities: {\n requires: [\n { key: 'identity', version: 1 },\n { key: 'audit-trail', version: 1 },\n { key: 'notifications', version: 1 },\n { key: 'feature-flags', version: 1 },\n ],\n provides: [\n { key: 'workflow', version: 1 },\n { key: 'approval', version: 1 },\n { key: 'state-machine', version: 1 },\n ],\n },\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/example.workflow-system",
3
- "version": "0.0.0-canary-20251217083314",
3
+ "version": "0.0.0-canary-20251220002821",
4
4
  "description": "Workflow and approval system example for ContractSpec - State machine with role-based transitions",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,19 +18,19 @@
18
18
  "lint:check": "eslint src"
19
19
  },
20
20
  "dependencies": {
21
- "@lssm/lib.schema": "0.0.0-canary-20251217083314",
22
- "@lssm/lib.contracts": "0.0.0-canary-20251217083314",
23
- "@lssm/lib.bus": "0.0.0-canary-20251217083314",
24
- "@lssm/lib.identity-rbac": "0.0.0-canary-20251217083314",
25
- "@lssm/lib.feature-flags": "0.0.0-canary-20251217083314",
26
- "@lssm/lib.jobs": "0.0.0-canary-20251217083314",
27
- "@lssm/module.audit-trail": "0.0.0-canary-20251217083314",
28
- "@lssm/module.notifications": "0.0.0-canary-20251217083314",
21
+ "@lssm/lib.schema": "0.0.0-canary-20251220002821",
22
+ "@lssm/lib.contracts": "0.0.0-canary-20251220002821",
23
+ "@lssm/lib.bus": "0.0.0-canary-20251220002821",
24
+ "@lssm/lib.identity-rbac": "0.0.0-canary-20251220002821",
25
+ "@lssm/lib.feature-flags": "0.0.0-canary-20251220002821",
26
+ "@lssm/lib.jobs": "0.0.0-canary-20251220002821",
27
+ "@lssm/module.audit-trail": "0.0.0-canary-20251220002821",
28
+ "@lssm/module.notifications": "0.0.0-canary-20251220002821",
29
29
  "zod": "^4.1.13"
30
30
  },
31
31
  "devDependencies": {
32
- "@lssm/tool.typescript": "0.0.0-canary-20251217083314",
33
- "@lssm/tool.tsdown": "0.0.0-canary-20251217083314",
32
+ "@lssm/tool.typescript": "0.0.0-canary-20251220002821",
33
+ "@lssm/tool.tsdown": "0.0.0-canary-20251220002821",
34
34
  "typescript": "^5.9.3"
35
35
  },
36
36
  "exports": {
@@ -111,6 +111,13 @@
111
111
  "./workflow/workflow.handler": "./dist/workflow/workflow.handler.js",
112
112
  "./workflow/workflow.schema": "./dist/workflow/workflow.schema.js",
113
113
  "./*": "./*"
114
- }
114
+ },
115
+ "registry": "https://registry.npmjs.org/"
116
+ },
117
+ "license": "MIT",
118
+ "repository": {
119
+ "type": "git",
120
+ "url": "https://github.com/lssm-tech/contractspec.git",
121
+ "directory": "packages/examples/workflow-system"
115
122
  }
116
123
  }
@@ -1,16 +0,0 @@
1
- import { registerDocBlocks } from "./registry.js";
2
-
3
- //#region ../../libs/contracts/dist/docs/PUBLISHING.docblock.js
4
- const PUBLISHING_DocBlocks = [{
5
- id: "docs.PUBLISHING",
6
- title: "Publishing ContractSpec Libraries",
7
- summary: "This guide describes how we release the ContractSpec libraries to npm. We use a dual-track release system: **Stable** (manual) and **Canary** (automatic).",
8
- kind: "reference",
9
- visibility: "public",
10
- route: "/docs/PUBLISHING",
11
- tags: ["PUBLISHING"],
12
- body: "# Publishing ContractSpec Libraries\n\nThis guide describes how we release the ContractSpec libraries to npm. We use a dual-track release system: **Stable** (manual) and **Canary** (automatic).\n\n## Release Tracks\n\n| Track | Branch | npm Tag | Frequency | Versioning | Use Case |\n|-------|--------|---------|-----------|------------|----------|\n| **Stable** | `release` | `latest` | Manual | SemVer (e.g., `1.7.4`) | Production, external users |\n| **Canary** | `main` | `canary` | Every Push | Snapshot (e.g., `1.7.4-canary...`) | Dev, internal testing |\n\n## Prerequisites\n\n- ✅ `NPM_TOKEN` secret is configured in GitHub (owner or automation token with _publish_ scope).\n- ✅ `GITHUB_TOKEN` (built-in) has permissions to create PRs (enabled by default in new repos).\n- ✅ For stable releases: `release` branch exists and is protected.\n\n## Canary Workflow (Automatic)\n\nEvery commit pushed to `main` triggers the `.github/workflows/publish-canary.yml` workflow.\n\n1. **Trigger**: Push to `main`.\n2. **Versioning**: Runs `changeset version --snapshot canary` to generate a temporary snapshot version.\n3. **Publish**: Packages are published to npm with the `canary` tag using `changeset publish --tag canary`.\n\n### Consuming Canary Builds\n\nTo install the latest bleeding-edge version:\n\n```bash\nnpm install @lssm/lib.contracts@canary\n# or\nbun add @lssm/lib.contracts@canary\n```\n\n## Stable Release Workflow (Manual)\n\nStable releases are managed via the `release` branch using the standard [Changesets Action](https://github.com/changesets/action).\n\n1. **Develop on `main`**: Create features and fixes.\n2. **Add Changesets**: Run `bun changeset` to document changes and impact (major/minor/patch).\n3. **Merge to `release`**: When ready to ship, open a PR from `main` to `release` or merge manually.\n4. **\"Version Packages\" PR**:\n - The GitHub Action detects new changesets and automatically creates a Pull Request titled **\"Version Packages\"**.\n - This PR contains the version bumps and updated `CHANGELOG.md` files.\n5. **Merge & Publish**:\n - Review and merge the \"Version Packages\" PR.\n - The Action runs again, detects the versions have been bumped, builds the libraries, and publishes them to npm with the `latest` tag.\n\n### Publishing Steps\n\n1. Ensure all changesets are present on `main`.\n2. Merge `main` into `release`:\n ```bash\n git checkout release\n git pull origin release\n git merge main\n git push origin release\n ```\n3. Go to GitHub Pull Requests. You will see a **\"Version Packages\"** PR created by the bot.\n4. Merge that PR.\n5. The release is now live on npm!\n\n## Manual Verification (Optional)\n\nBefore publishing a new version you can run:\n\n```bash\nbun run build:not-apps\nnpx npm-packlist --json packages/libs/contracts\n```\n\n## Rollback\n\nIf a publish fails mid-way, re-run the workflow once the issue is fixed. Already published packages are skipped automatically. Use `npm deprecate <package>@<version>` if we need to warn consumers about a broken release.\n"
13
- }];
14
- registerDocBlocks(PUBLISHING_DocBlocks);
15
-
16
- //#endregion
@@ -1,16 +0,0 @@
1
- import { registerDocBlocks } from "../registry.js";
2
-
3
- //#region ../../libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js
4
- const tech_PHASE_1_QUICKSTART_DocBlocks = [{
5
- id: "docs.tech.PHASE_1_QUICKSTART",
6
- title: "Phase 1: API Reference Index",
7
- summary: "Quick reference for all new Phase 1 APIs.",
8
- kind: "reference",
9
- visibility: "public",
10
- route: "/docs/tech/PHASE_1_QUICKSTART",
11
- tags: ["tech", "PHASE_1_QUICKSTART"],
12
- body: "# Phase 1: API Reference Index\n\nQuick reference for all new Phase 1 APIs.\n\n---\n\n## @lssm/lib.multi-tenancy\n\n### RLS\n```typescript\nimport { createRlsMiddleware, type TenantIdProvider } from '@lssm/lib.multi-tenancy/rls';\n```\n\n### Provisioning\n```typescript\nimport { \n TenantProvisioningService,\n type CreateTenantInput,\n type TenantProvisioningConfig \n} from '@lssm/lib.multi-tenancy/provisioning';\n```\n\n### Isolation\n```typescript\nimport { IsolationValidator } from '@lssm/lib.multi-tenancy/isolation';\n```\n\n---\n\n## @lssm/lib.observability\n\n### Tracing\n```typescript\nimport { \n getTracer,\n traceAsync,\n traceSync,\n createTracingMiddleware \n} from '@lssm/lib.observability/tracing';\n```\n\n### Metrics\n```typescript\nimport {\n getMeter,\n createCounter,\n createUpDownCounter,\n createHistogram,\n standardMetrics\n} from '@lssm/lib.observability/metrics';\n```\n\n### Logging\n```typescript\nimport {\n Logger,\n logger,\n type LogLevel,\n type LogEntry\n} from '@lssm/lib.observability/logging';\n```\n\n---\n\n## @lssm/lib.resilience\n\n### Circuit Breaker\n```typescript\nimport {\n CircuitBreaker,\n type CircuitState,\n type CircuitBreakerConfig\n} from '@lssm/lib.resilience/circuit-breaker';\n```\n\n### Retry\n```typescript\nimport { retry } from '@lssm/lib.resilience/retry';\n```\n\n### Timeout\n```typescript\nimport { timeout } from '@lssm/lib.resilience/timeout';\n```\n\n### Fallback\n```typescript\nimport { fallback } from '@lssm/lib.resilience/fallback';\n```\n\n---\n\n## Enhanced: @lssm/lib.contracts\n\n### DataViews\n```typescript\nimport { DataViewQueryGenerator } from '@lssm/lib.contracts/data-views/query-generator';\nimport { DataViewRuntime } from '@lssm/lib.contracts/data-views/runtime';\n```\n\n### Workflows\n```typescript\nimport { SLAMonitor, type SLABreachEvent } from '@lssm/lib.contracts/workflow/sla-monitor';\nimport { PrismaStateStore } from '@lssm/lib.contracts/workflow/adapters/db-adapter';\n```\n\n---\n\n## Enhanced: @lssm/lib.design-system\n\n### DataView Components\n```typescript\nimport { DataViewRenderer } from '@lssm/lib.design-system/components/data-view/DataViewRenderer';\n// Also available: DataViewList, DataViewTable, DataViewDetail\n```\n\n---\n\n## Usage Examples\n\n### Complete Workflow with All Features\n\n```typescript\nimport { WorkflowRunner } from '@lssm/lib.contracts/workflow/runner';\nimport { PrismaStateStore } from '@lssm/lib.contracts/workflow/adapters/db-adapter';\nimport { SLAMonitor } from '@lssm/lib.contracts/workflow/sla-monitor';\nimport { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';\nimport { traceAsync } from '@lssm/lib.observability/tracing';\n\nconst runner = new WorkflowRunner({\n registry,\n stateStore: new PrismaStateStore(db),\n opExecutor: async (op, input, ctx) => {\n return traceAsync(`op.${op.name}`, async (span) => {\n span.setAttribute('operation', op.name);\n const breaker = getCircuitBreaker(op.name);\n return breaker.execute(() => executeOperation(op, input, ctx));\n });\n },\n eventEmitter: (event, payload) => {\n if (event.startsWith('workflow.')) {\n logger.info(event, payload);\n }\n },\n});\n\nconst monitor = new SLAMonitor((event, payload) => {\n logger.warn('SLA_BREACH', payload);\n alertOps(payload);\n});\n\n// Start workflow\nconst workflowId = await runner.start('payment.flow', 1);\n\n// Monitor SLA\nconst state = await runner.getState(workflowId);\nconst spec = registry.get('payment.flow', 1);\nmonitor.check(state, spec!);\n```\n\n### Complete DataView with Observability\n\n```typescript\nimport { DataViewRenderer } from '@lssm/lib.design-system';\nimport { DataViewQueryGenerator } from '@lssm/lib.contracts/data-views/query-generator';\nimport { traceAsync } from '@lssm/lib.observability/tracing';\nimport { MyDataView } from './specs/users.data-view';\n\nexport function UserListPage() {\n const [page, setPage] = useState(1);\n const [users, setUsers] = useState([]);\n\n const loadUsers = async () => {\n return traceAsync('load_users', async (span) => {\n const generator = new DataViewQueryGenerator(MyDataView);\n const query = generator.generate({ pagination: { page, pageSize: 20 } });\n \n span.setAttribute('page', page);\n const result = await api.execute(query);\n setUsers(result.data);\n });\n };\n\n return (\n <DataViewRenderer\n spec={MyDataView}\n items={users}\n pagination={{ page, pageSize: 20, total: users.length }}\n onPageChange={setPage}\n />\n );\n}\n```\n\n### Complete Multi-Tenant Setup\n\n```typescript\n// 1. RLS Middleware\nimport { createRlsMiddleware } from '@lssm/lib.multi-tenancy/rls';\ndb.$use(createRlsMiddleware(() => req.tenantId));\n\n// 2. Tenant Provisioning\nimport { TenantProvisioningService } from '@lssm/lib.multi-tenancy/provisioning';\nconst service = new TenantProvisioningService({ db });\n\n// 3. Create new tenant\nawait service.provision({\n id: 'acme',\n name: 'Acme Corp',\n slug: 'acme',\n ownerEmail: 'admin@acme.com',\n});\n\n// 4. Validate isolation in tests\nimport { IsolationValidator } from '@lssm/lib.multi-tenancy/isolation';\n\ntest('queries are isolated', () => {\n const isValid = IsolationValidator.validateQuery(\n 'User',\n 'findMany',\n { where: { tenantId: 'acme' } },\n 'acme'\n );\n expect(isValid).toBe(true);\n});\n```\n\n---\n\n## Testing\n\n### Test Circuit Breakers\n\n```typescript\nimport { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';\n\ntest('circuit opens after threshold', async () => {\n const breaker = new CircuitBreaker({\n failureThreshold: 3,\n resetTimeoutMs: 5000,\n });\n\n // Trigger failures\n for (let i = 0; i < 3; i++) {\n await expect(\n breaker.execute(() => Promise.reject('error'))\n ).rejects.toThrow();\n }\n\n // Circuit should be open\n await expect(\n breaker.execute(() => Promise.resolve('ok'))\n ).rejects.toThrow('CircuitBreaker is OPEN');\n});\n```\n\n### Test Workflow Retry\n\n```typescript\ntest('workflow retries on failure', async () => {\n let attempts = 0;\n const opExecutor = async () => {\n attempts++;\n if (attempts < 3) throw new Error('fail');\n return 'success';\n };\n\n const runner = new WorkflowRunner({ /* ... */ opExecutor });\n await runner.executeStep(workflowId);\n \n expect(attempts).toBe(3);\n});\n```\n\n---\n\n## Common Patterns\n\n### Pattern: Resilient External Call\n\n```typescript\nimport { CircuitBreaker } from '@lssm/lib.resilience/circuit-breaker';\nimport { retry } from '@lssm/lib.resilience/retry';\nimport { timeout } from '@lssm/lib.resilience/timeout';\nimport { traceAsync } from '@lssm/lib.observability/tracing';\n\nconst breaker = new CircuitBreaker({ failureThreshold: 5, resetTimeoutMs: 30000 });\n\nexport async function callExternalAPI(input: any) {\n return traceAsync('external_api_call', async (span) => {\n span.setAttribute('service', 'stripe');\n \n return breaker.execute(() =>\n retry(\n () => timeout(() => stripe.api.call(input), 5000),\n 3,\n 1000,\n true\n )\n );\n });\n}\n```\n\n**Benefits**: Circuit breaker + retry + timeout + tracing in one place.\n\n---\n\n### Pattern: Tenant-Aware Operation\n\n```typescript\nimport { traceAsync } from '@lssm/lib.observability/tracing';\n\nexport async function listUsers(tenantId: string) {\n return traceAsync('list_users', async (span) => {\n span.setAttribute('tenant_id', tenantId);\n \n // RLS middleware will inject WHERE tenantId = ?\n return db.user.findMany();\n });\n}\n```\n\n---\n\n### Pattern: Monitored Workflow\n\n```typescript\nimport { WorkflowRunner } from '@lssm/lib.contracts/workflow/runner';\nimport { SLAMonitor } from '@lssm/lib.contracts/workflow/sla-monitor';\nimport { logger } from '@lssm/lib.observability/logging';\n\nconst monitor = new SLAMonitor((event, payload) => {\n logger.warn('workflow.sla_breach', payload);\n});\n\n// In workflow poller\nconst state = await runner.getState(workflowId);\nconst spec = registry.get(state.workflowName, state.workflowVersion);\nif (spec) {\n monitor.check(state, spec);\n}\n```\n\n---\n\n## Next Steps\n\n1. **Implement one quick win** (30 minutes)\n2. **Add tests for new functionality** (1 hour)\n3. **Deploy to staging and verify observability** (1 hour)\n4. **Roll out to production** (monitor closely)\n5. **Read full documentation** at https://contractspec.lssm.tech/docs\n\n---\n\n**Questions?** See `/docs/guides/phase-1-migration` or reach out via https://contractspec.lssm.tech/contact\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
13
- }];
14
- registerDocBlocks(tech_PHASE_1_QUICKSTART_DocBlocks);
15
-
16
- //#endregion
@@ -1,16 +0,0 @@
1
- import { registerDocBlocks } from "../registry.js";
2
-
3
- //#region ../../libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js
4
- const tech_PHASE_2_AI_NATIVE_OPERATIONS_DocBlocks = [{
5
- id: "docs.tech.PHASE_2_AI_NATIVE_OPERATIONS",
6
- title: "Phase 2: AI-Native Operations",
7
- summary: "_Last updated: 2025-11-20_",
8
- kind: "reference",
9
- visibility: "public",
10
- route: "/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS",
11
- tags: ["tech", "PHASE_2_AI_NATIVE_OPERATIONS"],
12
- body: "# Phase 2: AI-Native Operations\n\n_Last updated: 2025-11-20_\n\nPhase 2 turns ContractSpec into an AI-first operations stack. The new libraries below are the building blocks used by support bots, growth agents, and human-in-the-loop flows.\n\n## Libraries\n\n### @lssm/lib.ai-agent\n\n- **Spec + Registry**: `defineAgent`, `AgentRegistry` keep agent definitions type-safe.\n- **Runner**: `AgentRunner` drives LLM conversations, tool calls, retries, escalation, and telemetry hooks.\n- **Tools**: `ToolExecutor` standardizes schema validation + timeouts.\n- **Memory**: `InMemoryAgentMemory` + interfaces for plugging persistent stores.\n- **Approvals**: new `ApprovalWorkflow` + `InMemoryApprovalStore` capture low-confidence decisions and surface them to reviewers.\n\n### @lssm/lib.support-bot\n\nComposable support automation primitives:\n\n- `TicketClassifier` → heuristics + optional LLM validation for category, priority, sentiment.\n- `TicketResolver` → RAG pipeline backed by knowledge spaces.\n- `AutoResponder` → tone-aware drafts with citations.\n- `SupportFeedbackLoop` → tracks resolution rates.\n- `createSupportTools` → ready-made tool definitions for AgentRunner.\n\n### @lssm/lib.content-gen\n\nContent generators that consume a `ContentBrief` and output production-ready assets:\n\n- `BlogGenerator`, `LandingPageGenerator`, `EmailCampaignGenerator`, `SocialPostGenerator`.\n- `SeoOptimizer` builds metadata + schema markup.\n\n### @lssm/lib.analytics\n\nQueryless analytics helpers:\n\n- `FunnelAnalyzer` – conversion/drop-off per step.\n- `CohortTracker` – retention + LTV per cohort.\n- `ChurnPredictor` – recency/frequency/error scoring.\n- `GrowthHypothesisGenerator` – surfaces experiment ideas from metric trends.\n\n### @lssm/lib.growth\n\nA/B testing toolkit:\n\n- `ExperimentRegistry` + `ExperimentRunner` – deterministic bucketing.\n- `ExperimentTracker` – persist exposures + metrics.\n- `StatsEngine` – Welch’s t-test + improvement calculations.\n\n### Human-in-the-loop UI\n\n`@lssm/lib.design-system` now exposes:\n\n- `ApprovalQueue` – list + act on pending approvals.\n- `AgentMonitor` – live view of agent sessions with confidence + status.\n\n## Examples\n\n- `examples/ai-support-bot/setup.ts` shows ticket classification → resolution → response draft.\n- `examples/content-generation/generate.ts` produces blog, landing, email, social, SEO output from one brief.\n\n## Next Steps\n\n1. Wire these libraries into vertical apps (H-Circle, ArtisanOS, etc.).\n2. Add background workers that consume the new analytics/growth trackers.\n3. Expand web-landing to highlight these Phase 2 capabilities (see separate TODO).\n"
13
- }];
14
- registerDocBlocks(tech_PHASE_2_AI_NATIVE_OPERATIONS_DocBlocks);
15
-
16
- //#endregion
@@ -1,16 +0,0 @@
1
- import { registerDocBlocks } from "../registry.js";
2
-
3
- //#region ../../libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js
4
- const tech_PHASE_3_AUTO_EVOLUTION_DocBlocks = [{
5
- id: "docs.tech.PHASE_3_AUTO_EVOLUTION",
6
- title: "Phase 3: Auto-Evolution Technical Notes",
7
- summary: "**Status**: In progress",
8
- kind: "reference",
9
- visibility: "public",
10
- route: "/docs/tech/PHASE_3_AUTO_EVOLUTION",
11
- tags: ["tech", "PHASE_3_AUTO_EVOLUTION"],
12
- body: "# Phase 3: Auto-Evolution Technical Notes\n\n**Status**: In progress \n**Last updated**: 2025-11-21 \n\nPhase 3 introduces self-learning capabilities that analyze production telemetry, suggest new specs, safely roll out variants, and generate golden tests from real traffic. This document captures the main building blocks delivered in this iteration.\n\n---\n\n## 1. Libraries\n\n### @lssm/lib.evolution\n\n- `SpecAnalyzer` converts raw telemetry samples into usage stats + anomalies.\n- `SpecGenerator` produces `SpecSuggestion` objects and validates confidence thresholds.\n- `SpecSuggestionOrchestrator` routes proposals through the AI approval workflow and writes approved specs to `packages/libs/contracts/src/generated`.\n- Storage adapters:\n - `InMemorySpecSuggestionRepository` for tests.\n - `PrismaSpecSuggestionRepository` persists to the new Prisma model (see §4).\n - `FileSystemSuggestionWriter` emits JSON envelopes for git review.\n\n### @lssm/lib.observability\n\n- Added intent detection modules:\n - `IntentAggregator` batches telemetry into rolling windows.\n - `IntentDetector` surfaces latency/error/throughput regressions and sequential intents.\n- `EvolutionPipeline` orchestrates aggregation → detection → intent events and exposes hooks for downstream orchestrators.\n- `createTracingMiddleware` now accepts `resolveOperation`/`onSample` hooks to feed telemetry samples into the pipeline.\n\n### @lssm/lib.growth\n\n- New `spec-experiments` module:\n - `SpecExperimentRegistry`, `SpecExperimentRunner`, `SpecExperimentAdapter`.\n - `SpecExperimentAnalyzer` + `SpecExperimentController` handle guardrails and staged rollouts.\n - Helper `createSpecVariantResolver` plugs directly into `HandlerCtx.specVariantResolver`.\n- `SpecVariantResolver` is now a first-class concept in `@lssm/lib.contracts`. The runtime will attempt to execute variant specs before falling back to the registered handler.\n\n### @lssm/lib.testing\n\n- `TrafficRecorder` + `TrafficStore` capture production requests with sampling and sanitization hooks.\n- `GoldenTestGenerator` converts `TrafficSnapshot`s into Vitest/Jest suites.\n- `generateVitestSuite` / `generateJestSuite` output self-contained test files, and `runGoldenTests` offers a programmatic harness for CI pipelines.\n\n---\n\n## 2. Telemetry → Intent → Spec Pipeline\n\n1. `createTracingMiddleware({ onSample })` emits `TelemetrySample`s for every HTTP request.\n2. `IntentAggregator` groups samples into statistical windows (default 15 minutes).\n3. `IntentDetector` raises signals for:\n - Error spikes\n - Latency regressions\n - Throughput drops\n - Sequential workflows that hint at missing specs\n4. `EvolutionPipeline` emits `intent.detected` events and hands them to `SpecGenerator`.\n5. `SpecSuggestionOrchestrator` persists suggestions, triggers approval workflows, and—upon approval—writes JSON envelopes to `packages/.../contracts/src/generated`.\n\n---\n\n## 3. Spec Experiments & Rollouts\n\n1. Register spec experiments in `SpecExperimentRegistry` with control + variant bindings.\n2. Expose bucketed specs by attaching `createSpecVariantResolver` to `HandlerCtx.specVariantResolver` inside adapters.\n3. Record outcomes via `SpecExperimentAdapter.trackOutcome()` (latency + error metrics).\n4. `SpecExperimentController` uses guardrails from config and `SpecExperimentAnalyzer` to:\n - Auto-rollback on error/latency breaches.\n - Advance rollout stages (1% → 10% → 50% → 100%) when metrics stay green.\n\n---\n\n## 4. Data Models (Prisma)\n\nFile: `packages/libs/database/prisma/schema.prisma`\n\n- `SpecSuggestion` – stores serialized suggestion payloads + statuses.\n- `IntentSnapshot` – captured detector output for auditing/training.\n- `TrafficSnapshot` – persisted production traffic (input/output/error blobs).\n- `SpecExperiment` / `SpecExperimentMetric` – rollout state + metrics for each variant.\n\n> Run `bun database generate` after pulling to refresh the Prisma client.\n\n---\n\n## 5. Golden Test Workflow\n\n1. Capture traffic via middleware or direct `TrafficRecorder.record`.\n2. Use the new CLI command to materialize suites:\n\n```bash\ncontractspec test generate \\\n --operation billing.createInvoice \\\n --output tests/billing.createInvoice.golden.test.ts \\\n --runner-import ./tests/run-operation \\\n --runner-fn runBillingCommand \\\n --from-production \\\n --days 7 \\\n --sample-rate 0.05\n```\n\n3. Generated files import your runner and assert against recorded outputs (or expected errors for negative paths).\n\n---\n\n## 6. Operational Notes\n\n- **Approvals**: By default, every suggestion still requires human approval. `EvolutionConfig.autoApproveThreshold` can be tuned per environment but should remain conservative (<0.3) until OverlaySpec tooling lands.\n- **Sampling**: Keep `TrafficRecorder.sampleRate` ≤ 0.05 in production to avoid sensitive payload storage; scrub PII through the `sanitize` callback before persistence.\n- **Rollouts**: Guardrails default to 5% error-rate and 750ms P99 latency. Override per experiment to match SLOs.\n\n---\n\n## 7. Next Steps\n\n1. Wire `SpecExperimentAdapter.trackOutcome` into adapters (REST, GraphQL, Workers) so every execution logs metrics automatically.\n2. Add a UI for reviewing `SpecSuggestion` objects alongside approval status.\n3. Expand `TrafficRecorder` to ship directly to the Prisma-backed store (currently in-memory by default).\n4. Integrate `EvolutionPipeline` events with the Regenerator to close the loop (auto-open proposals + attach evidence).\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
13
- }];
14
- registerDocBlocks(tech_PHASE_3_AUTO_EVOLUTION_DocBlocks);
15
-
16
- //#endregion
@@ -1,16 +0,0 @@
1
- import { registerDocBlocks } from "../registry.js";
2
-
3
- //#region ../../libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js
4
- const tech_PHASE_4_PERSONALIZATION_ENGINE_DocBlocks = [{
5
- id: "docs.tech.PHASE_4_PERSONALIZATION_ENGINE",
6
- title: "Phase 4: Personalization Engine",
7
- summary: "**Status**: Complete",
8
- kind: "reference",
9
- visibility: "public",
10
- route: "/docs/tech/PHASE_4_PERSONALIZATION_ENGINE",
11
- tags: ["tech", "PHASE_4_PERSONALIZATION_ENGINE"],
12
- body: "# Phase 4: Personalization Engine\n\n**Status**: Complete \n**Last updated**: 2025-11-21\n\nPhase 4 unlocks tenant-scoped personalization with zero bespoke code. We shipped three new libraries, a signing-aware Overlay editor, and the persistence layer required to observe usage and apply overlays safely.\n\n---\n\n## 1. Libraries\n\n### @lssm/lib.overlay-engine\n\n- OverlaySpec types + validator mirror the public spec.\n- Cryptographic signer (`ed25519`, `rsa-pss-sha256`) with canonical JSON serialization.\n- Registry that merges tenant/role/user/device overlays with predictable specificity.\n- React hooks (`useOverlay`, `useOverlayFields`) for client-side rendering.\n- Runtime engine audits every applied overlay for traceability.\n\n### @lssm/lib.personalization\n\n- Behavior tracker buffers field/feature/workflow events and exports OTel metrics.\n- Analyzer summarizes field usage and workflow drop-offs into actionable insights.\n- Adapter translates insights into overlay suggestions or workflow tweaks.\n- In-memory store implementation + interface for plugging Prisma/ClickHouse later.\n\n### @lssm/lib.workflow-composer\n\n- `WorkflowComposer` merges base workflows with tenant/role/device extensions.\n- Step injection utilities keep transitions intact and validate anchor steps.\n- Template helpers for common tenant review/approval, plus merge helpers for multi-scope extensions.\n\n---\n\n## 2. Overlay Editor App\n\nPath: `packages/apps/overlay-editor`\n\n- Next.js App Router UI for toggling field visibility, renaming labels, and reordering lists.\n- Live JSON preview powered by `defineOverlay`.\n- Server action that signs overlays via PEM private keys (Ed25519 by default) using the overlay engine signer.\n\n---\n\n## 3. Persistence\n\nAdded Prisma models (see `packages/libs/database/prisma/schema.prisma`):\n\n- `UserBehaviorEvent` – field/feature/workflow telemetry.\n- `OverlaySigningKey` – tenant managed signing keys with revocation timestamps.\n- `Overlay` – stored overlays (tenant/user/role/device scope) plus signature metadata.\n\n---\n\n## 4. Integration Steps\n\n1. Track usage inside apps via `createBehaviorTracker`.\n2. Periodically run `BehaviorAnalyzer.analyze` to generate insights.\n3. Convert insights into OverlaySpecs or Workflow extensions.\n4. Register tenant overlays in `OverlayRegistry` and serve via presentation runtimes.\n5. Compose workflows per tenant using `WorkflowComposer`.\n\nSee the `docs/tech/personalization/*` guides for concrete examples.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
13
- }];
14
- registerDocBlocks(tech_PHASE_4_PERSONALIZATION_ENGINE_DocBlocks);
15
-
16
- //#endregion
@@ -1,16 +0,0 @@
1
- import { registerDocBlocks } from "../registry.js";
2
-
3
- //#region ../../libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js
4
- const tech_PHASE_5_ZERO_TOUCH_OPERATIONS_DocBlocks = [{
5
- id: "docs.tech.PHASE_5_ZERO_TOUCH_OPERATIONS",
6
- title: "Phase 5: Zero-Touch Operations",
7
- summary: "**Status**: In progress",
8
- kind: "reference",
9
- visibility: "public",
10
- route: "/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS",
11
- tags: ["tech", "PHASE_5_ZERO_TOUCH_OPERATIONS"],
12
- body: "# Phase 5: Zero-Touch Operations\n\n**Status**: In progress \n**Last updated**: 2025-11-21\n\nPhase 5 delivers progressive delivery, SLO intelligence, cost attribution, and anomaly-driven remediation so the platform can deploy continuously without pager rotations.\n\n---\n\n## 1. New Libraries\n\n### @lssm/lib.progressive-delivery\n- `DeploymentStrategy` types capture canary vs blue-green rollouts.\n- `CanaryController` + `CanaryAnalyzer` orchestrate stage evaluation against telemetry thresholds.\n- `TrafficShifter` keeps stable/candidate splits in sync with feature-flag or router state.\n- `DeploymentCoordinator` drives stage progression, emits events, and triggers rollbacks.\n- `RollbackManager` encapsulates safe revert hooks (spec version revert, traffic shift, etc.).\n\n### @lssm/lib.slo\n- Declarative `SLODefinition` with latency + availability targets per capability/spec.\n- `SLOTracker` stores rolling snapshots + error budget positions.\n- `BurnRateCalculator` implements multi-window burn computations (fast vs slow burn).\n- `SLOMonitor` pushes incidents to Ops tooling automatically when burn exceeds thresholds.\n\n### @lssm/lib.cost-tracking\n- `CostTracker` normalizes DB/API/compute metrics into per-operation cost totals.\n- `BudgetAlertManager` raises tenant budget warnings (80% default) with contextual payloads.\n- `OptimizationRecommender` suggests batching, caching, or contract tweaks to cut spend.\n\n### Observability Anomaly Toolkit\n- `BaselineCalculator` establishes rolling intent metrics (latency, error rate, throughput).\n- `AnomalyDetector` flags spikes/drops via relative deltas after 10+ samples.\n- `RootCauseAnalyzer` correlates anomalies with recent deployments.\n- `AlertManager` deduplicates notifications and feeds MCP/SRE transports.\n\n---\n\n## 2. Data Model Additions\n\nFile: `packages/libs/database/prisma/schema.prisma`\n\n| Model | Purpose |\n| --- | --- |\n| `SLODefinition`, `SLOSnapshot`, `ErrorBudget`, `SLOIncident` | Persist definitions, rolling windows, and incidents. |\n| `OperationCost`, `TenantBudget`, `CostAlert`, `OptimizationSuggestion` | Track per-operation costs, budgets, and generated recommendations. |\n| `Deployment`, `DeploymentStage`, `RollbackEvent` | Audit progressive delivery runs and automated rollbacks. |\n| `MetricBaseline`, `AnomalyEvent` | Store computed baselines and anomaly evidence for training/analytics. |\n\nRun `bun database generate` after pulling to refresh the Prisma client.\n\n---\n\n## 3. Operational Flow\n\n1. **Deploy**: Define a `DeploymentStrategy` and feed telemetry via `@lssm/lib.observability`. Canary stages run automatically.\n2. **Protect**: `CanaryAnalyzer` evaluates error rate + latency thresholds. Failures trigger `RollbackManager`.\n3. **Observe**: `SLOMonitor` consumes snapshots and opens incidents when burn rate exceeds thresholds.\n4. **Optimize**: `CostTracker` aggregates spend per tenant + capability, while `OptimizationRecommender` surfaces fixes.\n5. **Detect**: Anomaly signals route to `RootCauseAnalyzer`, which links them to specific deployments for auto-rollback.\n\n---\n\n## 4. Integration Checklist\n\n1. Instrument adapters with `createTracingMiddleware({ onSample })` to feed metric points into `AnomalyDetector`.\n2. Register SLOs per critical operation (`billing.charge`, `knowledge.search`) and wire monitors to Ops notifications.\n3. Attach `CostTracker.recordSample` to workflow runners (DB instrumentation + external call wrappers).\n4. Store deployment metadata using the new Prisma models for auditing + UI surfacing.\n5. Update `@lssm/app.ops-console` (next iteration) to list deployments, SLO status, costs, and anomalies in one timeline.\n\n---\n\n## 5. Next Steps\n\n- Wire `DeploymentCoordinator` into the Contracts CLI so `contractspec deploy` can run staged rollouts.\n- Add UI for SLO dashboards (burn rate sparkline + incident feed).\n- Ship budget suggestions into Growth Agent for automated cost optimizations.\n- Connect `AnomalyEvent` stream to MCP agents for root-cause playbooks.\n"
13
- }];
14
- registerDocBlocks(tech_PHASE_5_ZERO_TOUCH_OPERATIONS_DocBlocks);
15
-
16
- //#endregion
@@ -1,2 +0,0 @@
1
- import "zod";
2
- import "graphql";
@@ -1,49 +0,0 @@
1
- import "zod";
2
- import { GraphQLScalarType } from "graphql";
3
-
4
- //#region ../../libs/contracts/dist/schema/dist/FieldType.js
5
- /**
6
- * GraphQL scalar wrapper that carries zod and JSON Schema metadata.
7
- *
8
- * TInternal is the runtime representation; TExternal is the GraphQL output.
9
- */
10
- var FieldType = class extends GraphQLScalarType {
11
- zodSchema;
12
- jsonSchemaDef;
13
- constructor(config) {
14
- super(config);
15
- this.zodSchema = config.zod;
16
- this.jsonSchemaDef = config.jsonSchema;
17
- }
18
- /** Return the attached zod schema for validation. */
19
- getZod() {
20
- return this.zodSchema;
21
- }
22
- /** GraphQL scalar instance usable by Pothos or vanilla GraphQL. */
23
- getPothos() {
24
- return this;
25
- }
26
- /** Return the JSON Schema (evaluates factory if provided). */
27
- getJson() {
28
- return typeof this.jsonSchemaDef === "function" ? this.jsonSchemaDef() : this.jsonSchemaDef;
29
- }
30
- getJsonSchemaDef() {
31
- return this.jsonSchemaDef;
32
- }
33
- getJsonSchema() {
34
- const deepResolve = (v) => {
35
- const value = typeof v === "function" ? v() : v;
36
- if (Array.isArray(value)) return value.map((item) => deepResolve(item));
37
- if (value && typeof value === "object") {
38
- const obj = {};
39
- for (const [k, val] of Object.entries(value)) obj[k] = deepResolve(val);
40
- return obj;
41
- }
42
- return value;
43
- };
44
- return deepResolve(this.getJson());
45
- }
46
- };
47
-
48
- //#endregion
49
- export { FieldType };