@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.
- package/.turbo/turbo-build$colon$bundle.log +319 -0
- package/.turbo/turbo-build.log +321 -0
- package/CHANGELOG.md +408 -0
- package/LICENSE +21 -0
- package/dist/behavior-tracking.d.ts +5 -0
- package/dist/behavior-tracking.d.ts.map +1 -0
- package/dist/behavior-tracking.js +48 -0
- package/dist/behavior-tracking.js.map +1 -0
- package/dist/docs/index.d.ts +1 -0
- package/dist/docs/index.js +1 -0
- package/dist/docs/personalization.docblock.d.ts +1 -0
- package/dist/docs/personalization.docblock.js +30 -0
- package/dist/docs/personalization.docblock.js.map +1 -0
- package/dist/example.d.ts +8 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +46 -0
- package/dist/example.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +7 -0
- package/dist/libs/contracts/src/app-config/branding.d.ts +20 -0
- package/dist/libs/contracts/src/app-config/branding.d.ts.map +1 -0
- package/dist/libs/contracts/src/app-config/lifecycle.d.ts +1 -0
- package/dist/libs/contracts/src/app-config/runtime.d.ts +9 -0
- package/dist/libs/contracts/src/app-config/spec.d.ts +92 -0
- package/dist/libs/contracts/src/app-config/spec.d.ts.map +1 -0
- package/dist/libs/contracts/src/app-config/validation.d.ts +7 -0
- package/dist/libs/contracts/src/capabilities/capabilities.d.ts +16 -0
- package/dist/libs/contracts/src/capabilities/capabilities.d.ts.map +1 -0
- package/dist/libs/contracts/src/client/index.d.ts +1 -0
- package/dist/libs/contracts/src/client/react/drivers/rn-reusables.d.ts +1 -0
- package/dist/libs/contracts/src/client/react/drivers/shadcn.d.ts +1 -0
- package/dist/libs/contracts/src/client/react/feature-render.d.ts +3 -0
- package/dist/libs/contracts/src/client/react/form-render.d.ts +2 -0
- package/dist/libs/contracts/src/client/react/index.d.ts +4 -0
- package/dist/libs/contracts/src/contract-registry/index.d.ts +1 -0
- package/dist/libs/contracts/src/contract-registry/schemas.d.ts +1 -0
- package/dist/libs/contracts/src/data-views/index.d.ts +3 -0
- package/dist/libs/contracts/src/data-views/registry.d.ts +2 -0
- package/dist/libs/contracts/src/data-views/spec.d.ts +1 -0
- package/dist/libs/contracts/src/data-views/types.d.ts +1 -0
- package/dist/libs/contracts/src/docs/registry.d.ts +8 -0
- package/dist/libs/contracts/src/docs/registry.d.ts.map +1 -0
- package/dist/libs/contracts/src/events.d.ts +1 -0
- package/dist/libs/contracts/src/examples/index.d.ts +4 -0
- package/dist/libs/contracts/src/examples/registry.d.ts +2 -0
- package/dist/libs/contracts/src/examples/schema.d.ts +2 -0
- package/dist/libs/contracts/src/examples/types.d.ts +138 -0
- package/dist/libs/contracts/src/examples/types.d.ts.map +1 -0
- package/dist/libs/contracts/src/examples/validation.d.ts +1 -0
- package/dist/libs/contracts/src/experiments/spec-resolver.d.ts +3 -0
- package/dist/libs/contracts/src/experiments/spec.d.ts +11 -0
- package/dist/libs/contracts/src/experiments/spec.d.ts.map +1 -0
- package/dist/libs/contracts/src/features/index.d.ts +4 -0
- package/dist/libs/contracts/src/features/install.d.ts +4 -0
- package/dist/libs/contracts/src/features/registry.d.ts +1 -0
- package/dist/libs/contracts/src/features/types.d.ts +88 -0
- package/dist/libs/contracts/src/features/types.d.ts.map +1 -0
- package/dist/libs/contracts/src/features/validation.d.ts +1 -0
- package/dist/libs/contracts/src/index.d.ts +43 -0
- package/dist/libs/contracts/src/install.d.ts +6 -0
- package/dist/libs/contracts/src/integrations/connection.d.ts +1 -0
- package/dist/libs/contracts/src/integrations/index.d.ts +5 -0
- package/dist/libs/contracts/src/integrations/openbanking/contracts/accounts.d.ts +3 -0
- package/dist/libs/contracts/src/integrations/openbanking/contracts/balances.d.ts +3 -0
- package/dist/libs/contracts/src/integrations/openbanking/contracts/index.d.ts +5 -0
- package/dist/libs/contracts/src/integrations/openbanking/contracts/transactions.d.ts +3 -0
- package/dist/libs/contracts/src/integrations/openbanking/guards.d.ts +1 -0
- package/dist/libs/contracts/src/integrations/openbanking/openbanking.feature.d.ts +1 -0
- package/dist/libs/contracts/src/integrations/operations.d.ts +3 -0
- package/dist/libs/contracts/src/integrations/providers/elevenlabs.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/gcs-storage.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/gmail.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/google-calendar.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/index.d.ts +11 -0
- package/dist/libs/contracts/src/integrations/providers/mistral.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/postmark.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/powens.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/qdrant.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/registry.d.ts +1 -0
- package/dist/libs/contracts/src/integrations/providers/stripe.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/providers/twilio-sms.d.ts +2 -0
- package/dist/libs/contracts/src/integrations/spec.d.ts +8 -0
- package/dist/libs/contracts/src/integrations/spec.d.ts.map +1 -0
- package/dist/libs/contracts/src/jsonschema.d.ts +2 -0
- package/dist/libs/contracts/src/knowledge/index.d.ts +2 -0
- package/dist/libs/contracts/src/knowledge/operations.d.ts +3 -0
- package/dist/libs/contracts/src/knowledge/spaces/email-threads.d.ts +1 -0
- package/dist/libs/contracts/src/knowledge/spaces/financial-docs.d.ts +1 -0
- package/dist/libs/contracts/src/knowledge/spaces/financial-overview.d.ts +1 -0
- package/dist/libs/contracts/src/knowledge/spaces/index.d.ts +6 -0
- package/dist/libs/contracts/src/knowledge/spaces/product-canon.d.ts +1 -0
- package/dist/libs/contracts/src/knowledge/spaces/support-faq.d.ts +1 -0
- package/dist/libs/contracts/src/knowledge/spaces/uploaded-docs.d.ts +1 -0
- package/dist/libs/contracts/src/knowledge/spec.d.ts +1 -0
- package/dist/libs/contracts/src/llm/exporters.d.ts +6 -0
- package/dist/libs/contracts/src/llm/index.d.ts +3 -0
- package/dist/libs/contracts/src/llm/prompts.d.ts +2 -0
- package/dist/libs/contracts/src/llm/types.d.ts +3 -0
- package/dist/libs/contracts/src/onboarding-base.d.ts +1 -0
- package/dist/libs/contracts/src/openapi.d.ts +1 -0
- package/dist/libs/contracts/src/operations/index.d.ts +2 -0
- package/dist/libs/contracts/src/operations/operation.d.ts +24 -0
- package/dist/libs/contracts/src/operations/operation.d.ts.map +1 -0
- package/dist/libs/contracts/src/operations/registry.d.ts +5 -0
- package/dist/libs/contracts/src/ownership.d.ts +60 -0
- package/dist/libs/contracts/src/ownership.d.ts.map +1 -0
- package/dist/libs/contracts/src/policy/engine.d.ts +2 -0
- package/dist/libs/contracts/src/policy/index.d.ts +4 -0
- package/dist/libs/contracts/src/policy/opa-adapter.d.ts +2 -0
- package/dist/libs/contracts/src/policy/registry.d.ts +1 -0
- package/dist/libs/contracts/src/policy/spec.d.ts +9 -0
- package/dist/libs/contracts/src/policy/spec.d.ts.map +1 -0
- package/dist/libs/contracts/src/presentations/index.d.ts +3 -0
- package/dist/libs/contracts/src/presentations/presentations.d.ts +7 -0
- package/dist/libs/contracts/src/presentations/presentations.d.ts.map +1 -0
- package/dist/libs/contracts/src/presentations/registry.d.ts +1 -0
- package/dist/libs/contracts/src/presentations/transform-engine.d.ts +1 -0
- package/dist/libs/contracts/src/prompt.d.ts +1 -0
- package/dist/libs/contracts/src/promptRegistry.d.ts +2 -0
- package/dist/libs/contracts/src/regenerator/adapters.d.ts +1 -0
- package/dist/libs/contracts/src/regenerator/executor.d.ts +1 -0
- package/dist/libs/contracts/src/regenerator/index.d.ts +6 -0
- package/dist/libs/contracts/src/regenerator/service.d.ts +2 -0
- package/dist/libs/contracts/src/regenerator/sinks.d.ts +2 -0
- package/dist/libs/contracts/src/regenerator/types.d.ts +2 -0
- package/dist/libs/contracts/src/regenerator/utils.d.ts +1 -0
- package/dist/libs/contracts/src/registry.d.ts +1 -0
- package/dist/libs/contracts/src/resources.d.ts +1 -0
- package/dist/libs/contracts/src/server/graphql-pothos.d.ts +7 -0
- package/dist/libs/contracts/src/server/index.d.ts +7 -0
- package/dist/libs/contracts/src/server/mcp/createMcpServer.d.ts +5 -0
- package/dist/libs/contracts/src/server/mcp/mcpTypes.d.ts +3 -0
- package/dist/libs/contracts/src/server/provider-mcp.d.ts +1 -0
- package/dist/libs/contracts/src/server/rest-elysia.d.ts +3 -0
- package/dist/libs/contracts/src/server/rest-express.d.ts +3 -0
- package/dist/libs/contracts/src/server/rest-generic.d.ts +2 -0
- package/dist/libs/contracts/src/server/rest-next-app.d.ts +3 -0
- package/dist/libs/contracts/src/server/rest-next-pages.d.ts +3 -0
- package/dist/libs/contracts/src/tests/index.d.ts +1 -0
- package/dist/libs/contracts/src/tests/runner.d.ts +2 -0
- package/dist/libs/contracts/src/themes.d.ts +11 -0
- package/dist/libs/contracts/src/themes.d.ts.map +1 -0
- package/dist/libs/contracts/src/types.d.ts +3 -0
- package/dist/libs/contracts/src/workflow/adapters/db-adapter.d.ts +1 -0
- package/dist/libs/contracts/src/workflow/adapters/file-adapter.d.ts +1 -0
- package/dist/libs/contracts/src/workflow/adapters/index.d.ts +3 -0
- package/dist/libs/contracts/src/workflow/adapters/memory-store.d.ts +1 -0
- package/dist/libs/contracts/src/workflow/index.d.ts +5 -0
- package/dist/libs/contracts/src/workflow/runner.d.ts +5 -0
- package/dist/libs/contracts/src/workflow/spec.d.ts +89 -0
- package/dist/libs/contracts/src/workflow/spec.d.ts.map +1 -0
- package/dist/libs/contracts/src/workflow/state.d.ts +1 -0
- package/dist/libs/contracts/src/workflow/validation.d.ts +2 -0
- package/dist/libs/contracts/src/workspace-config/contractsrc-schema.d.ts +1 -0
- package/dist/libs/contracts/src/workspace-config/index.d.ts +1 -0
- package/dist/overlay-customization.d.ts +5 -0
- package/dist/overlay-customization.d.ts.map +1 -0
- package/dist/overlay-customization.js +50 -0
- package/dist/overlay-customization.js.map +1 -0
- package/dist/workflow-extension.d.ts +8 -0
- package/dist/workflow-extension.d.ts.map +1 -0
- package/dist/workflow-extension.js +67 -0
- package/dist/workflow-extension.js.map +1 -0
- package/package.json +64 -0
- package/src/behavior-tracking.ts +47 -0
- package/src/docs/index.ts +1 -0
- package/src/docs/personalization.docblock.ts +28 -0
- package/src/example.ts +32 -0
- package/src/index.ts +5 -0
- package/src/overlay-customization.ts +57 -0
- package/src/workflow-extension.ts +63 -0
- package/tsconfig.json +17 -0
- 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,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
|
+
|