@contractspec/example.personalization 0.0.0-canary-20260113170453

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 (173) hide show
  1. package/.turbo/turbo-build$colon$bundle.log +319 -0
  2. package/.turbo/turbo-build.log +321 -0
  3. package/CHANGELOG.md +408 -0
  4. package/LICENSE +21 -0
  5. package/dist/behavior-tracking.d.ts +5 -0
  6. package/dist/behavior-tracking.d.ts.map +1 -0
  7. package/dist/behavior-tracking.js +48 -0
  8. package/dist/behavior-tracking.js.map +1 -0
  9. package/dist/docs/index.d.ts +1 -0
  10. package/dist/docs/index.js +1 -0
  11. package/dist/docs/personalization.docblock.d.ts +1 -0
  12. package/dist/docs/personalization.docblock.js +30 -0
  13. package/dist/docs/personalization.docblock.js.map +1 -0
  14. package/dist/example.d.ts +8 -0
  15. package/dist/example.d.ts.map +1 -0
  16. package/dist/example.js +46 -0
  17. package/dist/example.js.map +1 -0
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.js +7 -0
  20. package/dist/libs/contracts/src/app-config/branding.d.ts +20 -0
  21. package/dist/libs/contracts/src/app-config/branding.d.ts.map +1 -0
  22. package/dist/libs/contracts/src/app-config/lifecycle.d.ts +1 -0
  23. package/dist/libs/contracts/src/app-config/runtime.d.ts +9 -0
  24. package/dist/libs/contracts/src/app-config/spec.d.ts +92 -0
  25. package/dist/libs/contracts/src/app-config/spec.d.ts.map +1 -0
  26. package/dist/libs/contracts/src/app-config/validation.d.ts +7 -0
  27. package/dist/libs/contracts/src/capabilities/capabilities.d.ts +16 -0
  28. package/dist/libs/contracts/src/capabilities/capabilities.d.ts.map +1 -0
  29. package/dist/libs/contracts/src/client/index.d.ts +1 -0
  30. package/dist/libs/contracts/src/client/react/drivers/rn-reusables.d.ts +1 -0
  31. package/dist/libs/contracts/src/client/react/drivers/shadcn.d.ts +1 -0
  32. package/dist/libs/contracts/src/client/react/feature-render.d.ts +3 -0
  33. package/dist/libs/contracts/src/client/react/form-render.d.ts +2 -0
  34. package/dist/libs/contracts/src/client/react/index.d.ts +4 -0
  35. package/dist/libs/contracts/src/contract-registry/index.d.ts +1 -0
  36. package/dist/libs/contracts/src/contract-registry/schemas.d.ts +1 -0
  37. package/dist/libs/contracts/src/data-views/index.d.ts +3 -0
  38. package/dist/libs/contracts/src/data-views/registry.d.ts +2 -0
  39. package/dist/libs/contracts/src/data-views/spec.d.ts +1 -0
  40. package/dist/libs/contracts/src/data-views/types.d.ts +1 -0
  41. package/dist/libs/contracts/src/docs/registry.d.ts +8 -0
  42. package/dist/libs/contracts/src/docs/registry.d.ts.map +1 -0
  43. package/dist/libs/contracts/src/events.d.ts +1 -0
  44. package/dist/libs/contracts/src/examples/index.d.ts +4 -0
  45. package/dist/libs/contracts/src/examples/registry.d.ts +2 -0
  46. package/dist/libs/contracts/src/examples/schema.d.ts +2 -0
  47. package/dist/libs/contracts/src/examples/types.d.ts +138 -0
  48. package/dist/libs/contracts/src/examples/types.d.ts.map +1 -0
  49. package/dist/libs/contracts/src/examples/validation.d.ts +1 -0
  50. package/dist/libs/contracts/src/experiments/spec-resolver.d.ts +3 -0
  51. package/dist/libs/contracts/src/experiments/spec.d.ts +11 -0
  52. package/dist/libs/contracts/src/experiments/spec.d.ts.map +1 -0
  53. package/dist/libs/contracts/src/features/index.d.ts +4 -0
  54. package/dist/libs/contracts/src/features/install.d.ts +4 -0
  55. package/dist/libs/contracts/src/features/registry.d.ts +1 -0
  56. package/dist/libs/contracts/src/features/types.d.ts +88 -0
  57. package/dist/libs/contracts/src/features/types.d.ts.map +1 -0
  58. package/dist/libs/contracts/src/features/validation.d.ts +1 -0
  59. package/dist/libs/contracts/src/index.d.ts +43 -0
  60. package/dist/libs/contracts/src/install.d.ts +6 -0
  61. package/dist/libs/contracts/src/integrations/connection.d.ts +1 -0
  62. package/dist/libs/contracts/src/integrations/index.d.ts +5 -0
  63. package/dist/libs/contracts/src/integrations/openbanking/contracts/accounts.d.ts +3 -0
  64. package/dist/libs/contracts/src/integrations/openbanking/contracts/balances.d.ts +3 -0
  65. package/dist/libs/contracts/src/integrations/openbanking/contracts/index.d.ts +5 -0
  66. package/dist/libs/contracts/src/integrations/openbanking/contracts/transactions.d.ts +3 -0
  67. package/dist/libs/contracts/src/integrations/openbanking/guards.d.ts +1 -0
  68. package/dist/libs/contracts/src/integrations/openbanking/openbanking.feature.d.ts +1 -0
  69. package/dist/libs/contracts/src/integrations/operations.d.ts +3 -0
  70. package/dist/libs/contracts/src/integrations/providers/elevenlabs.d.ts +2 -0
  71. package/dist/libs/contracts/src/integrations/providers/gcs-storage.d.ts +2 -0
  72. package/dist/libs/contracts/src/integrations/providers/gmail.d.ts +2 -0
  73. package/dist/libs/contracts/src/integrations/providers/google-calendar.d.ts +2 -0
  74. package/dist/libs/contracts/src/integrations/providers/index.d.ts +11 -0
  75. package/dist/libs/contracts/src/integrations/providers/mistral.d.ts +2 -0
  76. package/dist/libs/contracts/src/integrations/providers/postmark.d.ts +2 -0
  77. package/dist/libs/contracts/src/integrations/providers/powens.d.ts +2 -0
  78. package/dist/libs/contracts/src/integrations/providers/qdrant.d.ts +2 -0
  79. package/dist/libs/contracts/src/integrations/providers/registry.d.ts +1 -0
  80. package/dist/libs/contracts/src/integrations/providers/stripe.d.ts +2 -0
  81. package/dist/libs/contracts/src/integrations/providers/twilio-sms.d.ts +2 -0
  82. package/dist/libs/contracts/src/integrations/spec.d.ts +8 -0
  83. package/dist/libs/contracts/src/integrations/spec.d.ts.map +1 -0
  84. package/dist/libs/contracts/src/jsonschema.d.ts +2 -0
  85. package/dist/libs/contracts/src/knowledge/index.d.ts +2 -0
  86. package/dist/libs/contracts/src/knowledge/operations.d.ts +3 -0
  87. package/dist/libs/contracts/src/knowledge/spaces/email-threads.d.ts +1 -0
  88. package/dist/libs/contracts/src/knowledge/spaces/financial-docs.d.ts +1 -0
  89. package/dist/libs/contracts/src/knowledge/spaces/financial-overview.d.ts +1 -0
  90. package/dist/libs/contracts/src/knowledge/spaces/index.d.ts +6 -0
  91. package/dist/libs/contracts/src/knowledge/spaces/product-canon.d.ts +1 -0
  92. package/dist/libs/contracts/src/knowledge/spaces/support-faq.d.ts +1 -0
  93. package/dist/libs/contracts/src/knowledge/spaces/uploaded-docs.d.ts +1 -0
  94. package/dist/libs/contracts/src/knowledge/spec.d.ts +1 -0
  95. package/dist/libs/contracts/src/llm/exporters.d.ts +6 -0
  96. package/dist/libs/contracts/src/llm/index.d.ts +3 -0
  97. package/dist/libs/contracts/src/llm/prompts.d.ts +2 -0
  98. package/dist/libs/contracts/src/llm/types.d.ts +3 -0
  99. package/dist/libs/contracts/src/onboarding-base.d.ts +1 -0
  100. package/dist/libs/contracts/src/openapi.d.ts +1 -0
  101. package/dist/libs/contracts/src/operations/index.d.ts +2 -0
  102. package/dist/libs/contracts/src/operations/operation.d.ts +24 -0
  103. package/dist/libs/contracts/src/operations/operation.d.ts.map +1 -0
  104. package/dist/libs/contracts/src/operations/registry.d.ts +5 -0
  105. package/dist/libs/contracts/src/ownership.d.ts +60 -0
  106. package/dist/libs/contracts/src/ownership.d.ts.map +1 -0
  107. package/dist/libs/contracts/src/policy/engine.d.ts +2 -0
  108. package/dist/libs/contracts/src/policy/index.d.ts +4 -0
  109. package/dist/libs/contracts/src/policy/opa-adapter.d.ts +2 -0
  110. package/dist/libs/contracts/src/policy/registry.d.ts +1 -0
  111. package/dist/libs/contracts/src/policy/spec.d.ts +9 -0
  112. package/dist/libs/contracts/src/policy/spec.d.ts.map +1 -0
  113. package/dist/libs/contracts/src/presentations/index.d.ts +3 -0
  114. package/dist/libs/contracts/src/presentations/presentations.d.ts +7 -0
  115. package/dist/libs/contracts/src/presentations/presentations.d.ts.map +1 -0
  116. package/dist/libs/contracts/src/presentations/registry.d.ts +1 -0
  117. package/dist/libs/contracts/src/presentations/transform-engine.d.ts +1 -0
  118. package/dist/libs/contracts/src/prompt.d.ts +1 -0
  119. package/dist/libs/contracts/src/promptRegistry.d.ts +2 -0
  120. package/dist/libs/contracts/src/regenerator/adapters.d.ts +1 -0
  121. package/dist/libs/contracts/src/regenerator/executor.d.ts +1 -0
  122. package/dist/libs/contracts/src/regenerator/index.d.ts +6 -0
  123. package/dist/libs/contracts/src/regenerator/service.d.ts +2 -0
  124. package/dist/libs/contracts/src/regenerator/sinks.d.ts +2 -0
  125. package/dist/libs/contracts/src/regenerator/types.d.ts +2 -0
  126. package/dist/libs/contracts/src/regenerator/utils.d.ts +1 -0
  127. package/dist/libs/contracts/src/registry.d.ts +1 -0
  128. package/dist/libs/contracts/src/resources.d.ts +1 -0
  129. package/dist/libs/contracts/src/server/graphql-pothos.d.ts +7 -0
  130. package/dist/libs/contracts/src/server/index.d.ts +7 -0
  131. package/dist/libs/contracts/src/server/mcp/createMcpServer.d.ts +5 -0
  132. package/dist/libs/contracts/src/server/mcp/mcpTypes.d.ts +3 -0
  133. package/dist/libs/contracts/src/server/provider-mcp.d.ts +1 -0
  134. package/dist/libs/contracts/src/server/rest-elysia.d.ts +3 -0
  135. package/dist/libs/contracts/src/server/rest-express.d.ts +3 -0
  136. package/dist/libs/contracts/src/server/rest-generic.d.ts +2 -0
  137. package/dist/libs/contracts/src/server/rest-next-app.d.ts +3 -0
  138. package/dist/libs/contracts/src/server/rest-next-pages.d.ts +3 -0
  139. package/dist/libs/contracts/src/tests/index.d.ts +1 -0
  140. package/dist/libs/contracts/src/tests/runner.d.ts +2 -0
  141. package/dist/libs/contracts/src/themes.d.ts +11 -0
  142. package/dist/libs/contracts/src/themes.d.ts.map +1 -0
  143. package/dist/libs/contracts/src/types.d.ts +3 -0
  144. package/dist/libs/contracts/src/workflow/adapters/db-adapter.d.ts +1 -0
  145. package/dist/libs/contracts/src/workflow/adapters/file-adapter.d.ts +1 -0
  146. package/dist/libs/contracts/src/workflow/adapters/index.d.ts +3 -0
  147. package/dist/libs/contracts/src/workflow/adapters/memory-store.d.ts +1 -0
  148. package/dist/libs/contracts/src/workflow/index.d.ts +5 -0
  149. package/dist/libs/contracts/src/workflow/runner.d.ts +5 -0
  150. package/dist/libs/contracts/src/workflow/spec.d.ts +89 -0
  151. package/dist/libs/contracts/src/workflow/spec.d.ts.map +1 -0
  152. package/dist/libs/contracts/src/workflow/state.d.ts +1 -0
  153. package/dist/libs/contracts/src/workflow/validation.d.ts +2 -0
  154. package/dist/libs/contracts/src/workspace-config/contractsrc-schema.d.ts +1 -0
  155. package/dist/libs/contracts/src/workspace-config/index.d.ts +1 -0
  156. package/dist/overlay-customization.d.ts +5 -0
  157. package/dist/overlay-customization.d.ts.map +1 -0
  158. package/dist/overlay-customization.js +50 -0
  159. package/dist/overlay-customization.js.map +1 -0
  160. package/dist/workflow-extension.d.ts +8 -0
  161. package/dist/workflow-extension.d.ts.map +1 -0
  162. package/dist/workflow-extension.js +67 -0
  163. package/dist/workflow-extension.js.map +1 -0
  164. package/package.json +64 -0
  165. package/src/behavior-tracking.ts +47 -0
  166. package/src/docs/index.ts +1 -0
  167. package/src/docs/personalization.docblock.ts +28 -0
  168. package/src/example.ts +32 -0
  169. package/src/index.ts +5 -0
  170. package/src/overlay-customization.ts +57 -0
  171. package/src/workflow-extension.ts +63 -0
  172. package/tsconfig.json +17 -0
  173. package/tsdown.config.js +6 -0
@@ -0,0 +1,67 @@
1
+ import { LogLevel, Logger } from "@contractspec/lib.logger";
2
+ import { StabilityEnum } from "@contractspec/lib.contracts";
3
+ import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
4
+
5
+ //#region src/workflow-extension.ts
6
+ const logger = new Logger({
7
+ level: process.env.NODE_ENV === "production" ? LogLevel.INFO : LogLevel.DEBUG,
8
+ environment: process.env.NODE_ENV || "development",
9
+ enableColors: process.env.NODE_ENV !== "production"
10
+ });
11
+ const BaseWorkflow = {
12
+ meta: {
13
+ key: "billing.invoiceApproval",
14
+ version: "1.0.0",
15
+ title: "Invoice Approval",
16
+ owners: [],
17
+ tags: [],
18
+ description: "",
19
+ domain: "billing",
20
+ stability: StabilityEnum.Stable
21
+ },
22
+ definition: {
23
+ steps: [{
24
+ id: "validate-invoice",
25
+ type: "automation",
26
+ label: "Validate Invoice"
27
+ }, {
28
+ id: "final-approval",
29
+ type: "human",
30
+ label: "Final Approval"
31
+ }],
32
+ transitions: [{
33
+ from: "validate-invoice",
34
+ to: "final-approval"
35
+ }]
36
+ }
37
+ };
38
+ function composeTenantWorkflowExample() {
39
+ const composer = new WorkflowComposer();
40
+ composer.register({
41
+ workflow: "billing.invoiceApproval",
42
+ tenantId: "acme",
43
+ customSteps: [{
44
+ after: "validate-invoice",
45
+ inject: {
46
+ id: "acme-legal",
47
+ type: "human",
48
+ label: "ACME Legal Review"
49
+ },
50
+ transitionTo: "final-approval"
51
+ }]
52
+ });
53
+ return composer.compose({
54
+ base: BaseWorkflow,
55
+ tenantId: "acme"
56
+ });
57
+ }
58
+ function logTenantWorkflowSteps(workflow) {
59
+ logger.info("Tenant workflow composed", {
60
+ workflow: workflow.meta.key,
61
+ steps: workflow.definition.steps.map((step) => step.id)
62
+ });
63
+ }
64
+
65
+ //#endregion
66
+ export { composeTenantWorkflowExample, logTenantWorkflowSteps };
67
+ //# sourceMappingURL=workflow-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-extension.js","names":[],"sources":["../src/workflow-extension.ts"],"sourcesContent":["import { StabilityEnum } from '@contractspec/lib.contracts';\nimport type { WorkflowSpec } from '@contractspec/lib.contracts/workflow/spec';\nimport { WorkflowComposer } from '@contractspec/lib.workflow-composer';\nimport { Logger, LogLevel } from '@contractspec/lib.logger';\n\nconst logger = new Logger({\n level: process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG,\n environment:\n (process.env.NODE_ENV as 'production' | 'development' | 'test') ||\n 'development',\n enableColors: process.env.NODE_ENV !== 'production',\n});\n\nconst BaseWorkflow: WorkflowSpec = {\n meta: {\n key: 'billing.invoiceApproval',\n version: '1.0.0',\n title: 'Invoice Approval',\n owners: [],\n tags: [],\n description: '',\n domain: 'billing',\n stability: StabilityEnum.Stable,\n },\n definition: {\n steps: [\n { id: 'validate-invoice', type: 'automation', label: 'Validate Invoice' },\n { id: 'final-approval', type: 'human', label: 'Final Approval' },\n ],\n transitions: [{ from: 'validate-invoice', to: 'final-approval' }],\n },\n};\n\nexport function composeTenantWorkflowExample(): WorkflowSpec {\n const composer = new WorkflowComposer();\n composer.register({\n workflow: 'billing.invoiceApproval',\n tenantId: 'acme',\n customSteps: [\n {\n after: 'validate-invoice',\n inject: {\n id: 'acme-legal',\n type: 'human',\n label: 'ACME Legal Review',\n },\n transitionTo: 'final-approval',\n },\n ],\n });\n\n return composer.compose({\n base: BaseWorkflow,\n tenantId: 'acme',\n });\n}\n\nexport function logTenantWorkflowSteps(workflow: WorkflowSpec): void {\n logger.info('Tenant workflow composed', {\n workflow: workflow.meta.key,\n steps: workflow.definition.steps.map((step) => step.id),\n });\n}\n"],"mappings":";;;;;AAKA,MAAM,SAAS,IAAI,OAAO;CACxB,OAAO,QAAQ,IAAI,aAAa,eAAe,SAAS,OAAO,SAAS;CACxE,aACG,QAAQ,IAAI,YACb;CACF,cAAc,QAAQ,IAAI,aAAa;CACxC,CAAC;AAEF,MAAM,eAA6B;CACjC,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,QAAQ,EAAE;EACV,MAAM,EAAE;EACR,aAAa;EACb,QAAQ;EACR,WAAW,cAAc;EAC1B;CACD,YAAY;EACV,OAAO,CACL;GAAE,IAAI;GAAoB,MAAM;GAAc,OAAO;GAAoB,EACzE;GAAE,IAAI;GAAkB,MAAM;GAAS,OAAO;GAAkB,CACjE;EACD,aAAa,CAAC;GAAE,MAAM;GAAoB,IAAI;GAAkB,CAAC;EAClE;CACF;AAED,SAAgB,+BAA6C;CAC3D,MAAM,WAAW,IAAI,kBAAkB;AACvC,UAAS,SAAS;EAChB,UAAU;EACV,UAAU;EACV,aAAa,CACX;GACE,OAAO;GACP,QAAQ;IACN,IAAI;IACJ,MAAM;IACN,OAAO;IACR;GACD,cAAc;GACf,CACF;EACF,CAAC;AAEF,QAAO,SAAS,QAAQ;EACtB,MAAM;EACN,UAAU;EACX,CAAC;;AAGJ,SAAgB,uBAAuB,UAA8B;AACnE,QAAO,KAAK,4BAA4B;EACtC,UAAU,SAAS,KAAK;EACxB,OAAO,SAAS,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;EACxD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@contractspec/example.personalization",
3
+ "version": "0.0.0-canary-20260113170453",
4
+ "description": "Personalization examples: behavior tracking, overlay customization, workflow extension.",
5
+ "type": "module",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./behavior-tracking": "./dist/behavior-tracking.js",
10
+ "./docs": "./dist/docs/index.js",
11
+ "./docs/personalization.docblock": "./dist/docs/personalization.docblock.js",
12
+ "./example": "./dist/example.js",
13
+ "./overlay-customization": "./dist/overlay-customization.js",
14
+ "./workflow-extension": "./dist/workflow-extension.js",
15
+ "./*": "./*"
16
+ },
17
+ "scripts": {
18
+ "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
19
+ "publish:pkg:canary": "bun publish:pkg --tag canary",
20
+ "build": "bun build:types && bun build:bundle",
21
+ "build:bundle": "tsdown",
22
+ "build:types": "tsc --noEmit",
23
+ "dev": "bun build:bundle --watch",
24
+ "clean": "rimraf dist .turbo",
25
+ "lint": "bun lint:fix",
26
+ "lint:fix": "eslint src --fix",
27
+ "lint:check": "eslint src",
28
+ "test": "bun test"
29
+ },
30
+ "dependencies": {
31
+ "@contractspec/lib.personalization": "0.0.0-canary-20260113170453",
32
+ "@contractspec/lib.overlay-engine": "0.0.0-canary-20260113170453",
33
+ "@contractspec/lib.workflow-composer": "0.0.0-canary-20260113170453",
34
+ "@contractspec/lib.contracts": "0.0.0-canary-20260113170453",
35
+ "@contractspec/lib.logger": "0.0.0-canary-20260113170453"
36
+ },
37
+ "devDependencies": {
38
+ "@contractspec/tool.tsdown": "0.0.0-canary-20260113170453",
39
+ "@contractspec/tool.typescript": "0.0.0-canary-20260113170453",
40
+ "tsdown": "^0.19.0",
41
+ "typescript": "^5.9.3"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public",
45
+ "exports": {
46
+ ".": "./dist/index.js",
47
+ "./behavior-tracking": "./dist/behavior-tracking.js",
48
+ "./docs": "./dist/docs/index.js",
49
+ "./docs/personalization.docblock": "./dist/docs/personalization.docblock.js",
50
+ "./example": "./dist/example.js",
51
+ "./overlay-customization": "./dist/overlay-customization.js",
52
+ "./workflow-extension": "./dist/workflow-extension.js",
53
+ "./*": "./*"
54
+ },
55
+ "registry": "https://registry.npmjs.org/"
56
+ },
57
+ "license": "MIT",
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "https://github.com/lssm-tech/contractspec.git",
61
+ "directory": "packages/examples/personalization"
62
+ },
63
+ "homepage": "https://contractspec.io"
64
+ }
@@ -0,0 +1,47 @@
1
+ import { createBehaviorTracker } from '@contractspec/lib.personalization/tracker';
2
+ import { InMemoryBehaviorStore } from '@contractspec/lib.personalization/store';
3
+ import { BehaviorAnalyzer } from '@contractspec/lib.personalization/analyzer';
4
+ import { Logger, LogLevel } from '@contractspec/lib.logger';
5
+
6
+ const logger = new Logger({
7
+ level: process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG,
8
+ environment:
9
+ (process.env.NODE_ENV as 'production' | 'development' | 'test') ||
10
+ 'development',
11
+ enableColors: process.env.NODE_ENV !== 'production',
12
+ });
13
+
14
+ export async function runBehaviorTrackingExample(): Promise<void> {
15
+ const store = new InMemoryBehaviorStore();
16
+ const tracker = createBehaviorTracker({
17
+ store,
18
+ context: {
19
+ tenantId: 'acme',
20
+ userId: 'user-123',
21
+ },
22
+ });
23
+
24
+ tracker.trackFieldAccess({
25
+ operation: 'billing.createOrder',
26
+ field: 'internalNotes',
27
+ });
28
+ tracker.trackFieldAccess({
29
+ operation: 'billing.createOrder',
30
+ field: 'customerReference',
31
+ });
32
+ tracker.trackFeatureUsage({ feature: 'workflow-editor', action: 'opened' });
33
+ tracker.trackWorkflowStep({
34
+ workflow: 'invoice-approval',
35
+ step: 'review',
36
+ status: 'entered',
37
+ });
38
+ await tracker.flush();
39
+
40
+ const analyzer = new BehaviorAnalyzer(store);
41
+ const insights = await analyzer.analyze({
42
+ tenantId: 'acme',
43
+ userId: 'user-123',
44
+ });
45
+
46
+ logger.info('Behavior insights computed', { insights });
47
+ }
@@ -0,0 +1 @@
1
+ import './personalization.docblock';
@@ -0,0 +1,28 @@
1
+ import type { DocBlock } from '@contractspec/lib.contracts/docs';
2
+ import { registerDocBlocks } from '@contractspec/lib.contracts/docs';
3
+
4
+ const blocks: DocBlock[] = [
5
+ {
6
+ id: 'docs.examples.personalization',
7
+ title: 'Personalization Patterns (example)',
8
+ summary:
9
+ 'Behavior tracking, overlay-driven UI tweaks, and tenant workflow extension patterns.',
10
+ kind: 'reference',
11
+ visibility: 'public',
12
+ route: '/docs/examples/personalization',
13
+ tags: ['personalization', 'overlays', 'workflows', 'example'],
14
+ body: `## Includes\n- Behavior tracking + insight analysis.\n- Overlay customization (hide fields, rename labels).\n- Workflow extension (inject tenant-specific steps).\n\n## Guardrails\n- Keep tracking events structured and non-PII.\n- Keep overlays signed and scoped.\n- Keep workflow composition deterministic.`,
15
+ },
16
+ {
17
+ id: 'docs.examples.personalization.usage',
18
+ title: 'Personalization — Usage',
19
+ summary: 'How to run the small examples and swap adapters.',
20
+ kind: 'usage',
21
+ visibility: 'public',
22
+ route: '/docs/examples/personalization/usage',
23
+ tags: ['personalization', 'usage'],
24
+ body: `## Usage\n- Call \`runBehaviorTrackingExample()\` for insights.\n- Call \`runOverlayCustomizationExample()\` to apply overlays.\n- Call \`composeTenantWorkflowExample()\` and \`logTenantWorkflowSteps()\` to inspect steps.\n\n## Notes\n- Replace in-memory stores with app-layer storage.\n- Keep PII out of logs and markdown outputs.`,
25
+ },
26
+ ];
27
+
28
+ registerDocBlocks(blocks);
package/src/example.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { defineExample } from '@contractspec/lib.contracts';
2
+
3
+ const example = defineExample({
4
+ meta: {
5
+ key: 'personalization',
6
+ version: '1.0.0',
7
+ title: 'Personalization Patterns',
8
+ description:
9
+ 'Small examples for behavior tracking, overlay-based UI customization, and tenant workflow extension.',
10
+ kind: 'library',
11
+ visibility: 'public',
12
+ stability: 'experimental',
13
+ owners: ['@platform.core'],
14
+ tags: ['personalization', 'overlays', 'behavior', 'workflows'],
15
+ },
16
+ docs: {
17
+ rootDocId: 'docs.examples.personalization',
18
+ usageDocId: 'docs.examples.personalization.usage',
19
+ },
20
+ entrypoints: {
21
+ packageName: '@contractspec/example.personalization',
22
+ docs: './docs',
23
+ },
24
+ surfaces: {
25
+ templates: true,
26
+ sandbox: { enabled: true, modes: ['markdown', 'specs'] },
27
+ studio: { enabled: true, installable: true },
28
+ mcp: { enabled: true },
29
+ },
30
+ });
31
+
32
+ export default example;
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './behavior-tracking';
2
+ export * from './overlay-customization';
3
+ export * from './workflow-extension';
4
+ export { default as example } from './example';
5
+ import './docs';
@@ -0,0 +1,57 @@
1
+ import { defineOverlay } from '@contractspec/lib.overlay-engine/spec';
2
+ import { signOverlay } from '@contractspec/lib.overlay-engine/signer';
3
+ import {
4
+ OverlayEngine,
5
+ OverlayRegistry,
6
+ } from '@contractspec/lib.overlay-engine';
7
+ import { Logger, LogLevel } from '@contractspec/lib.logger';
8
+
9
+ const logger = new Logger({
10
+ level: process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG,
11
+ environment:
12
+ (process.env.NODE_ENV as 'production' | 'development' | 'test') ||
13
+ 'development',
14
+ enableColors: process.env.NODE_ENV !== 'production',
15
+ });
16
+
17
+ export async function runOverlayCustomizationExample(): Promise<void> {
18
+ const registry = new OverlayRegistry({ allowUnsigned: true });
19
+ const engine = new OverlayEngine({ registry });
20
+
21
+ const overlay = defineOverlay({
22
+ overlayId: 'demo-overlay',
23
+ version: '1.0.0',
24
+ appliesTo: {
25
+ capability: 'billing.createOrder',
26
+ tenantId: 'demo',
27
+ },
28
+ modifications: [
29
+ { type: 'hideField', field: 'internalNotes' },
30
+ {
31
+ type: 'renameLabel',
32
+ field: 'customerReference',
33
+ newLabel: 'PO Number',
34
+ },
35
+ ],
36
+ });
37
+
38
+ const signed = await signOverlay(overlay, process.env.PRIVATE_KEY_PEM ?? '');
39
+ registry.register(signed);
40
+
41
+ const result = engine.apply({
42
+ target: {
43
+ fields: [
44
+ {
45
+ key: 'customerReference',
46
+ label: 'Customer Reference',
47
+ visible: true,
48
+ },
49
+ { key: 'internalNotes', label: 'Internal Notes', visible: true },
50
+ ],
51
+ },
52
+ capability: 'billing.createOrder',
53
+ tenantId: 'demo',
54
+ });
55
+
56
+ logger.info('Overlay applied', { fields: result.target.fields });
57
+ }
@@ -0,0 +1,63 @@
1
+ import { StabilityEnum } from '@contractspec/lib.contracts';
2
+ import type { WorkflowSpec } from '@contractspec/lib.contracts/workflow/spec';
3
+ import { WorkflowComposer } from '@contractspec/lib.workflow-composer';
4
+ import { Logger, LogLevel } from '@contractspec/lib.logger';
5
+
6
+ const logger = new Logger({
7
+ level: process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG,
8
+ environment:
9
+ (process.env.NODE_ENV as 'production' | 'development' | 'test') ||
10
+ 'development',
11
+ enableColors: process.env.NODE_ENV !== 'production',
12
+ });
13
+
14
+ const BaseWorkflow: WorkflowSpec = {
15
+ meta: {
16
+ key: 'billing.invoiceApproval',
17
+ version: '1.0.0',
18
+ title: 'Invoice Approval',
19
+ owners: [],
20
+ tags: [],
21
+ description: '',
22
+ domain: 'billing',
23
+ stability: StabilityEnum.Stable,
24
+ },
25
+ definition: {
26
+ steps: [
27
+ { id: 'validate-invoice', type: 'automation', label: 'Validate Invoice' },
28
+ { id: 'final-approval', type: 'human', label: 'Final Approval' },
29
+ ],
30
+ transitions: [{ from: 'validate-invoice', to: 'final-approval' }],
31
+ },
32
+ };
33
+
34
+ export function composeTenantWorkflowExample(): WorkflowSpec {
35
+ const composer = new WorkflowComposer();
36
+ composer.register({
37
+ workflow: 'billing.invoiceApproval',
38
+ tenantId: 'acme',
39
+ customSteps: [
40
+ {
41
+ after: 'validate-invoice',
42
+ inject: {
43
+ id: 'acme-legal',
44
+ type: 'human',
45
+ label: 'ACME Legal Review',
46
+ },
47
+ transitionTo: 'final-approval',
48
+ },
49
+ ],
50
+ });
51
+
52
+ return composer.compose({
53
+ base: BaseWorkflow,
54
+ tenantId: 'acme',
55
+ });
56
+ }
57
+
58
+ export function logTenantWorkflowSteps(workflow: WorkflowSpec): void {
59
+ logger.info('Tenant workflow composed', {
60
+ workflow: workflow.meta.key,
61
+ steps: workflow.definition.steps.map((step) => step.id),
62
+ });
63
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "@contractspec/tool.typescript/react-library.json",
3
+ "include": ["src"],
4
+ "exclude": ["node_modules", "dist"],
5
+ "compilerOptions": {
6
+ "outDir": "dist",
7
+ "paths": {
8
+ "@contractspec/lib.personalization/*": ["../../libs/personalization/src/*"],
9
+ "@contractspec/lib.contracts/*": ["../../libs/contracts/src/*"],
10
+ "@contractspec/lib.contracts": ["../../libs/contracts/src/index.ts"],
11
+ "@contractspec/lib.overlay-engine/*": ["../../libs/overlay-engine/src/*"],
12
+ "@contractspec/lib.overlay-engine": ["../../libs/overlay-engine/src/index.ts"]
13
+ }
14
+ }
15
+ }
16
+
17
+
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from 'tsdown';
2
+ import { moduleLibrary } from '@contractspec/tool.tsdown';
3
+
4
+ export default defineConfig(() => ({
5
+ ...moduleLibrary,
6
+ }));