@contractspec/example.personalization 3.7.6 → 3.7.10
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.log +36 -30
- package/AGENTS.md +43 -19
- package/CHANGELOG.md +28 -0
- package/README.md +67 -16
- package/dist/behavior-tracking.js +3 -3
- package/dist/browser/behavior-tracking.js +3 -3
- package/dist/browser/index.js +154 -30
- package/dist/browser/overlay-customization.js +3 -3
- package/dist/browser/personalization.experiment.js +62 -0
- package/dist/browser/personalization.theme.js +64 -0
- package/dist/browser/workflow-extension.js +1 -1
- package/dist/contracts.test.d.ts +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +154 -30
- package/dist/node/behavior-tracking.js +3 -3
- package/dist/node/index.js +154 -30
- package/dist/node/overlay-customization.js +3 -3
- package/dist/node/personalization.experiment.js +62 -0
- package/dist/node/personalization.theme.js +64 -0
- package/dist/node/workflow-extension.js +1 -1
- package/dist/overlay-customization.js +3 -3
- package/dist/personalization.experiment.d.ts +2 -0
- package/dist/personalization.experiment.js +63 -0
- package/dist/personalization.theme.d.ts +2 -0
- package/dist/personalization.theme.js +65 -0
- package/dist/workflow-extension.js +1 -1
- package/package.json +38 -10
- package/src/behavior-tracking.ts +37 -37
- package/src/contracts.test.ts +20 -0
- package/src/docs/personalization.docblock.ts +21 -21
- package/src/example.ts +26 -26
- package/src/index.ts +4 -2
- package/src/overlay-customization.ts +45 -45
- package/src/personalization.experiment.ts +61 -0
- package/src/personalization.feature.ts +16 -16
- package/src/personalization.theme.ts +63 -0
- package/src/workflow-extension.ts +47 -47
- package/tsconfig.json +17 -15
- package/tsdown.config.js +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// src/personalization.theme.ts
|
|
2
|
+
import {
|
|
3
|
+
OwnersEnum,
|
|
4
|
+
StabilityEnum
|
|
5
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
6
|
+
var PersonalizationTheme = {
|
|
7
|
+
meta: {
|
|
8
|
+
key: "personalization.theme.guided-onboarding",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
title: "Guided Onboarding Theme",
|
|
11
|
+
description: "Theme tokens used when the personalized onboarding experience is active.",
|
|
12
|
+
domain: "personalization",
|
|
13
|
+
owners: [OwnersEnum.PlatformCore],
|
|
14
|
+
tags: ["personalization", "theme", "onboarding"],
|
|
15
|
+
stability: StabilityEnum.Experimental,
|
|
16
|
+
scopes: ["tenant", "user"]
|
|
17
|
+
},
|
|
18
|
+
tokens: {
|
|
19
|
+
colors: {
|
|
20
|
+
surface: { value: "#FCF6E8" },
|
|
21
|
+
accent: { value: "#C8742A" },
|
|
22
|
+
text: { value: "#2F2419" }
|
|
23
|
+
},
|
|
24
|
+
radii: {
|
|
25
|
+
card: { value: 18 }
|
|
26
|
+
},
|
|
27
|
+
space: {
|
|
28
|
+
panel: { value: 24 }
|
|
29
|
+
},
|
|
30
|
+
typography: {
|
|
31
|
+
body: { value: 16 },
|
|
32
|
+
title: { value: 28 }
|
|
33
|
+
},
|
|
34
|
+
motion: {
|
|
35
|
+
stagger: { value: "180ms" }
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
components: [
|
|
39
|
+
{
|
|
40
|
+
component: "OnboardingChecklist",
|
|
41
|
+
variants: {
|
|
42
|
+
guided: {
|
|
43
|
+
props: {
|
|
44
|
+
emphasis: "warm"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
overrides: [
|
|
51
|
+
{
|
|
52
|
+
scope: "tenant",
|
|
53
|
+
target: "tenant:acme",
|
|
54
|
+
tokens: {
|
|
55
|
+
colors: {
|
|
56
|
+
accent: { value: "#8A4B12" }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
PersonalizationTheme
|
|
64
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/workflow-extension.ts
|
|
2
2
|
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
3
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
4
3
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
4
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
5
5
|
var logger = new Logger({
|
|
6
6
|
level: LogLevel.INFO,
|
|
7
7
|
environment: "production",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './behavior-tracking';
|
|
2
|
+
export { default as example } from './example';
|
|
2
3
|
export * from './overlay-customization';
|
|
3
|
-
export * from './
|
|
4
|
+
export * from './personalization.experiment';
|
|
4
5
|
export * from './personalization.feature';
|
|
5
|
-
export
|
|
6
|
+
export * from './personalization.theme';
|
|
7
|
+
export * from './workflow-extension';
|
|
6
8
|
import './docs';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/behavior-tracking.ts
|
|
3
|
-
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
4
|
-
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
5
|
-
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
6
3
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
4
|
+
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
5
|
+
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
6
|
+
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
7
7
|
var logger = new Logger({
|
|
8
8
|
level: LogLevel.INFO,
|
|
9
9
|
environment: "production",
|
|
@@ -113,13 +113,13 @@ var example = defineExample({
|
|
|
113
113
|
var example_default = example;
|
|
114
114
|
|
|
115
115
|
// src/overlay-customization.ts
|
|
116
|
-
import {
|
|
117
|
-
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
116
|
+
import { Logger as Logger2, LogLevel as LogLevel2 } from "@contractspec/lib.logger";
|
|
118
117
|
import {
|
|
119
118
|
OverlayEngine,
|
|
120
119
|
OverlayRegistry
|
|
121
120
|
} from "@contractspec/lib.overlay-engine";
|
|
122
|
-
import {
|
|
121
|
+
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
122
|
+
import { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
|
|
123
123
|
var logger2 = new Logger2({
|
|
124
124
|
level: LogLevel2.INFO,
|
|
125
125
|
environment: "production",
|
|
@@ -163,10 +163,152 @@ async function runOverlayCustomizationExample() {
|
|
|
163
163
|
logger2.info("Overlay applied", { fields: result.target.fields });
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
+
// src/personalization.experiment.ts
|
|
167
|
+
import {
|
|
168
|
+
OwnersEnum,
|
|
169
|
+
StabilityEnum
|
|
170
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
171
|
+
var PersonalizationExperiment = {
|
|
172
|
+
meta: {
|
|
173
|
+
key: "personalization.experiment.overlay-copy",
|
|
174
|
+
version: "1.0.0",
|
|
175
|
+
title: "Personalization Overlay Copy Experiment",
|
|
176
|
+
description: "Tests a control onboarding copy against a personalized overlay variant.",
|
|
177
|
+
domain: "personalization",
|
|
178
|
+
owners: [OwnersEnum.PlatformCore],
|
|
179
|
+
tags: ["personalization", "experiment", "overlay"],
|
|
180
|
+
stability: StabilityEnum.Experimental
|
|
181
|
+
},
|
|
182
|
+
controlVariant: "control",
|
|
183
|
+
variants: [
|
|
184
|
+
{
|
|
185
|
+
id: "control",
|
|
186
|
+
key: "control",
|
|
187
|
+
description: "Default onboarding copy and standard workflow."
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: "personalized-overlay",
|
|
191
|
+
key: "personalized-overlay",
|
|
192
|
+
description: "Personalized copy with a branded theme override.",
|
|
193
|
+
overrides: [
|
|
194
|
+
{
|
|
195
|
+
type: "theme",
|
|
196
|
+
target: "personalization.theme.guided-onboarding",
|
|
197
|
+
version: "1.0.0"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
type: "workflow",
|
|
201
|
+
target: "billing.invoiceApproval",
|
|
202
|
+
version: "1.0.0"
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
],
|
|
207
|
+
allocation: {
|
|
208
|
+
type: "sticky",
|
|
209
|
+
attribute: "userId",
|
|
210
|
+
salt: "personalization-overlay-copy"
|
|
211
|
+
},
|
|
212
|
+
successMetrics: [
|
|
213
|
+
{
|
|
214
|
+
key: "checklist-completion-rate",
|
|
215
|
+
telemetryEvent: {
|
|
216
|
+
key: "personalization.assignment.completed",
|
|
217
|
+
version: "1.0.0"
|
|
218
|
+
},
|
|
219
|
+
aggregation: "count",
|
|
220
|
+
target: 1
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
tags: ["personalization", "experiment"]
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
// src/personalization.feature.ts
|
|
227
|
+
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
228
|
+
var PersonalizationFeature = defineFeature({
|
|
229
|
+
meta: {
|
|
230
|
+
key: "personalization",
|
|
231
|
+
version: "1.0.0",
|
|
232
|
+
title: "Personalization Patterns",
|
|
233
|
+
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
234
|
+
domain: "personalization",
|
|
235
|
+
owners: ["@examples"],
|
|
236
|
+
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
237
|
+
stability: "experimental"
|
|
238
|
+
},
|
|
239
|
+
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
240
|
+
docs: [
|
|
241
|
+
"docs.examples.personalization",
|
|
242
|
+
"docs.examples.personalization.usage"
|
|
243
|
+
]
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
// src/personalization.theme.ts
|
|
247
|
+
import {
|
|
248
|
+
OwnersEnum as OwnersEnum2,
|
|
249
|
+
StabilityEnum as StabilityEnum2
|
|
250
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
251
|
+
var PersonalizationTheme = {
|
|
252
|
+
meta: {
|
|
253
|
+
key: "personalization.theme.guided-onboarding",
|
|
254
|
+
version: "1.0.0",
|
|
255
|
+
title: "Guided Onboarding Theme",
|
|
256
|
+
description: "Theme tokens used when the personalized onboarding experience is active.",
|
|
257
|
+
domain: "personalization",
|
|
258
|
+
owners: [OwnersEnum2.PlatformCore],
|
|
259
|
+
tags: ["personalization", "theme", "onboarding"],
|
|
260
|
+
stability: StabilityEnum2.Experimental,
|
|
261
|
+
scopes: ["tenant", "user"]
|
|
262
|
+
},
|
|
263
|
+
tokens: {
|
|
264
|
+
colors: {
|
|
265
|
+
surface: { value: "#FCF6E8" },
|
|
266
|
+
accent: { value: "#C8742A" },
|
|
267
|
+
text: { value: "#2F2419" }
|
|
268
|
+
},
|
|
269
|
+
radii: {
|
|
270
|
+
card: { value: 18 }
|
|
271
|
+
},
|
|
272
|
+
space: {
|
|
273
|
+
panel: { value: 24 }
|
|
274
|
+
},
|
|
275
|
+
typography: {
|
|
276
|
+
body: { value: 16 },
|
|
277
|
+
title: { value: 28 }
|
|
278
|
+
},
|
|
279
|
+
motion: {
|
|
280
|
+
stagger: { value: "180ms" }
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
components: [
|
|
284
|
+
{
|
|
285
|
+
component: "OnboardingChecklist",
|
|
286
|
+
variants: {
|
|
287
|
+
guided: {
|
|
288
|
+
props: {
|
|
289
|
+
emphasis: "warm"
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
],
|
|
295
|
+
overrides: [
|
|
296
|
+
{
|
|
297
|
+
scope: "tenant",
|
|
298
|
+
target: "tenant:acme",
|
|
299
|
+
tokens: {
|
|
300
|
+
colors: {
|
|
301
|
+
accent: { value: "#8A4B12" }
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
]
|
|
306
|
+
};
|
|
307
|
+
|
|
166
308
|
// src/workflow-extension.ts
|
|
167
|
-
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
168
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
309
|
+
import { StabilityEnum as StabilityEnum3 } from "@contractspec/lib.contracts-spec";
|
|
169
310
|
import { Logger as Logger3, LogLevel as LogLevel3 } from "@contractspec/lib.logger";
|
|
311
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
170
312
|
var logger3 = new Logger3({
|
|
171
313
|
level: LogLevel3.INFO,
|
|
172
314
|
environment: "production",
|
|
@@ -181,7 +323,7 @@ var BaseWorkflow = {
|
|
|
181
323
|
tags: [],
|
|
182
324
|
description: "",
|
|
183
325
|
domain: "billing",
|
|
184
|
-
stability:
|
|
326
|
+
stability: StabilityEnum3.Stable
|
|
185
327
|
},
|
|
186
328
|
definition: {
|
|
187
329
|
steps: [
|
|
@@ -219,31 +361,13 @@ function logTenantWorkflowSteps(workflow) {
|
|
|
219
361
|
steps: workflow.definition.steps.map((step) => step.id)
|
|
220
362
|
});
|
|
221
363
|
}
|
|
222
|
-
|
|
223
|
-
// src/personalization.feature.ts
|
|
224
|
-
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
225
|
-
var PersonalizationFeature = defineFeature({
|
|
226
|
-
meta: {
|
|
227
|
-
key: "personalization",
|
|
228
|
-
version: "1.0.0",
|
|
229
|
-
title: "Personalization Patterns",
|
|
230
|
-
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
231
|
-
domain: "personalization",
|
|
232
|
-
owners: ["@examples"],
|
|
233
|
-
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
234
|
-
stability: "experimental"
|
|
235
|
-
},
|
|
236
|
-
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
237
|
-
docs: [
|
|
238
|
-
"docs.examples.personalization",
|
|
239
|
-
"docs.examples.personalization.usage"
|
|
240
|
-
]
|
|
241
|
-
});
|
|
242
364
|
export {
|
|
243
365
|
runOverlayCustomizationExample,
|
|
244
366
|
runBehaviorTrackingExample,
|
|
245
367
|
logTenantWorkflowSteps,
|
|
246
368
|
example_default as example,
|
|
247
369
|
composeTenantWorkflowExample,
|
|
248
|
-
|
|
370
|
+
PersonalizationTheme,
|
|
371
|
+
PersonalizationFeature,
|
|
372
|
+
PersonalizationExperiment
|
|
249
373
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/behavior-tracking.ts
|
|
2
|
-
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
3
|
-
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
4
|
-
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
5
2
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
3
|
+
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
4
|
+
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
5
|
+
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
6
6
|
var logger = new Logger({
|
|
7
7
|
level: LogLevel.INFO,
|
|
8
8
|
environment: "production",
|
package/dist/node/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/behavior-tracking.ts
|
|
2
|
-
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
3
|
-
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
4
|
-
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
5
2
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
3
|
+
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
4
|
+
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
5
|
+
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
6
6
|
var logger = new Logger({
|
|
7
7
|
level: LogLevel.INFO,
|
|
8
8
|
environment: "production",
|
|
@@ -112,13 +112,13 @@ var example = defineExample({
|
|
|
112
112
|
var example_default = example;
|
|
113
113
|
|
|
114
114
|
// src/overlay-customization.ts
|
|
115
|
-
import {
|
|
116
|
-
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
115
|
+
import { Logger as Logger2, LogLevel as LogLevel2 } from "@contractspec/lib.logger";
|
|
117
116
|
import {
|
|
118
117
|
OverlayEngine,
|
|
119
118
|
OverlayRegistry
|
|
120
119
|
} from "@contractspec/lib.overlay-engine";
|
|
121
|
-
import {
|
|
120
|
+
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
121
|
+
import { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
|
|
122
122
|
var logger2 = new Logger2({
|
|
123
123
|
level: LogLevel2.INFO,
|
|
124
124
|
environment: "production",
|
|
@@ -162,10 +162,152 @@ async function runOverlayCustomizationExample() {
|
|
|
162
162
|
logger2.info("Overlay applied", { fields: result.target.fields });
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
// src/personalization.experiment.ts
|
|
166
|
+
import {
|
|
167
|
+
OwnersEnum,
|
|
168
|
+
StabilityEnum
|
|
169
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
170
|
+
var PersonalizationExperiment = {
|
|
171
|
+
meta: {
|
|
172
|
+
key: "personalization.experiment.overlay-copy",
|
|
173
|
+
version: "1.0.0",
|
|
174
|
+
title: "Personalization Overlay Copy Experiment",
|
|
175
|
+
description: "Tests a control onboarding copy against a personalized overlay variant.",
|
|
176
|
+
domain: "personalization",
|
|
177
|
+
owners: [OwnersEnum.PlatformCore],
|
|
178
|
+
tags: ["personalization", "experiment", "overlay"],
|
|
179
|
+
stability: StabilityEnum.Experimental
|
|
180
|
+
},
|
|
181
|
+
controlVariant: "control",
|
|
182
|
+
variants: [
|
|
183
|
+
{
|
|
184
|
+
id: "control",
|
|
185
|
+
key: "control",
|
|
186
|
+
description: "Default onboarding copy and standard workflow."
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
id: "personalized-overlay",
|
|
190
|
+
key: "personalized-overlay",
|
|
191
|
+
description: "Personalized copy with a branded theme override.",
|
|
192
|
+
overrides: [
|
|
193
|
+
{
|
|
194
|
+
type: "theme",
|
|
195
|
+
target: "personalization.theme.guided-onboarding",
|
|
196
|
+
version: "1.0.0"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
type: "workflow",
|
|
200
|
+
target: "billing.invoiceApproval",
|
|
201
|
+
version: "1.0.0"
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
allocation: {
|
|
207
|
+
type: "sticky",
|
|
208
|
+
attribute: "userId",
|
|
209
|
+
salt: "personalization-overlay-copy"
|
|
210
|
+
},
|
|
211
|
+
successMetrics: [
|
|
212
|
+
{
|
|
213
|
+
key: "checklist-completion-rate",
|
|
214
|
+
telemetryEvent: {
|
|
215
|
+
key: "personalization.assignment.completed",
|
|
216
|
+
version: "1.0.0"
|
|
217
|
+
},
|
|
218
|
+
aggregation: "count",
|
|
219
|
+
target: 1
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
tags: ["personalization", "experiment"]
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// src/personalization.feature.ts
|
|
226
|
+
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
227
|
+
var PersonalizationFeature = defineFeature({
|
|
228
|
+
meta: {
|
|
229
|
+
key: "personalization",
|
|
230
|
+
version: "1.0.0",
|
|
231
|
+
title: "Personalization Patterns",
|
|
232
|
+
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
233
|
+
domain: "personalization",
|
|
234
|
+
owners: ["@examples"],
|
|
235
|
+
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
236
|
+
stability: "experimental"
|
|
237
|
+
},
|
|
238
|
+
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
239
|
+
docs: [
|
|
240
|
+
"docs.examples.personalization",
|
|
241
|
+
"docs.examples.personalization.usage"
|
|
242
|
+
]
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
// src/personalization.theme.ts
|
|
246
|
+
import {
|
|
247
|
+
OwnersEnum as OwnersEnum2,
|
|
248
|
+
StabilityEnum as StabilityEnum2
|
|
249
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
250
|
+
var PersonalizationTheme = {
|
|
251
|
+
meta: {
|
|
252
|
+
key: "personalization.theme.guided-onboarding",
|
|
253
|
+
version: "1.0.0",
|
|
254
|
+
title: "Guided Onboarding Theme",
|
|
255
|
+
description: "Theme tokens used when the personalized onboarding experience is active.",
|
|
256
|
+
domain: "personalization",
|
|
257
|
+
owners: [OwnersEnum2.PlatformCore],
|
|
258
|
+
tags: ["personalization", "theme", "onboarding"],
|
|
259
|
+
stability: StabilityEnum2.Experimental,
|
|
260
|
+
scopes: ["tenant", "user"]
|
|
261
|
+
},
|
|
262
|
+
tokens: {
|
|
263
|
+
colors: {
|
|
264
|
+
surface: { value: "#FCF6E8" },
|
|
265
|
+
accent: { value: "#C8742A" },
|
|
266
|
+
text: { value: "#2F2419" }
|
|
267
|
+
},
|
|
268
|
+
radii: {
|
|
269
|
+
card: { value: 18 }
|
|
270
|
+
},
|
|
271
|
+
space: {
|
|
272
|
+
panel: { value: 24 }
|
|
273
|
+
},
|
|
274
|
+
typography: {
|
|
275
|
+
body: { value: 16 },
|
|
276
|
+
title: { value: 28 }
|
|
277
|
+
},
|
|
278
|
+
motion: {
|
|
279
|
+
stagger: { value: "180ms" }
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
components: [
|
|
283
|
+
{
|
|
284
|
+
component: "OnboardingChecklist",
|
|
285
|
+
variants: {
|
|
286
|
+
guided: {
|
|
287
|
+
props: {
|
|
288
|
+
emphasis: "warm"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
overrides: [
|
|
295
|
+
{
|
|
296
|
+
scope: "tenant",
|
|
297
|
+
target: "tenant:acme",
|
|
298
|
+
tokens: {
|
|
299
|
+
colors: {
|
|
300
|
+
accent: { value: "#8A4B12" }
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
};
|
|
306
|
+
|
|
165
307
|
// src/workflow-extension.ts
|
|
166
|
-
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
167
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
308
|
+
import { StabilityEnum as StabilityEnum3 } from "@contractspec/lib.contracts-spec";
|
|
168
309
|
import { Logger as Logger3, LogLevel as LogLevel3 } from "@contractspec/lib.logger";
|
|
310
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
169
311
|
var logger3 = new Logger3({
|
|
170
312
|
level: LogLevel3.INFO,
|
|
171
313
|
environment: "production",
|
|
@@ -180,7 +322,7 @@ var BaseWorkflow = {
|
|
|
180
322
|
tags: [],
|
|
181
323
|
description: "",
|
|
182
324
|
domain: "billing",
|
|
183
|
-
stability:
|
|
325
|
+
stability: StabilityEnum3.Stable
|
|
184
326
|
},
|
|
185
327
|
definition: {
|
|
186
328
|
steps: [
|
|
@@ -218,31 +360,13 @@ function logTenantWorkflowSteps(workflow) {
|
|
|
218
360
|
steps: workflow.definition.steps.map((step) => step.id)
|
|
219
361
|
});
|
|
220
362
|
}
|
|
221
|
-
|
|
222
|
-
// src/personalization.feature.ts
|
|
223
|
-
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
224
|
-
var PersonalizationFeature = defineFeature({
|
|
225
|
-
meta: {
|
|
226
|
-
key: "personalization",
|
|
227
|
-
version: "1.0.0",
|
|
228
|
-
title: "Personalization Patterns",
|
|
229
|
-
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
230
|
-
domain: "personalization",
|
|
231
|
-
owners: ["@examples"],
|
|
232
|
-
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
233
|
-
stability: "experimental"
|
|
234
|
-
},
|
|
235
|
-
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
236
|
-
docs: [
|
|
237
|
-
"docs.examples.personalization",
|
|
238
|
-
"docs.examples.personalization.usage"
|
|
239
|
-
]
|
|
240
|
-
});
|
|
241
363
|
export {
|
|
242
364
|
runOverlayCustomizationExample,
|
|
243
365
|
runBehaviorTrackingExample,
|
|
244
366
|
logTenantWorkflowSteps,
|
|
245
367
|
example_default as example,
|
|
246
368
|
composeTenantWorkflowExample,
|
|
247
|
-
|
|
369
|
+
PersonalizationTheme,
|
|
370
|
+
PersonalizationFeature,
|
|
371
|
+
PersonalizationExperiment
|
|
248
372
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// src/overlay-customization.ts
|
|
2
|
-
import {
|
|
3
|
-
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
2
|
+
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
4
3
|
import {
|
|
5
4
|
OverlayEngine,
|
|
6
5
|
OverlayRegistry
|
|
7
6
|
} from "@contractspec/lib.overlay-engine";
|
|
8
|
-
import {
|
|
7
|
+
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
8
|
+
import { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
|
|
9
9
|
var logger = new Logger({
|
|
10
10
|
level: LogLevel.INFO,
|
|
11
11
|
environment: "production",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/personalization.experiment.ts
|
|
2
|
+
import {
|
|
3
|
+
OwnersEnum,
|
|
4
|
+
StabilityEnum
|
|
5
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
6
|
+
var PersonalizationExperiment = {
|
|
7
|
+
meta: {
|
|
8
|
+
key: "personalization.experiment.overlay-copy",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
title: "Personalization Overlay Copy Experiment",
|
|
11
|
+
description: "Tests a control onboarding copy against a personalized overlay variant.",
|
|
12
|
+
domain: "personalization",
|
|
13
|
+
owners: [OwnersEnum.PlatformCore],
|
|
14
|
+
tags: ["personalization", "experiment", "overlay"],
|
|
15
|
+
stability: StabilityEnum.Experimental
|
|
16
|
+
},
|
|
17
|
+
controlVariant: "control",
|
|
18
|
+
variants: [
|
|
19
|
+
{
|
|
20
|
+
id: "control",
|
|
21
|
+
key: "control",
|
|
22
|
+
description: "Default onboarding copy and standard workflow."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "personalized-overlay",
|
|
26
|
+
key: "personalized-overlay",
|
|
27
|
+
description: "Personalized copy with a branded theme override.",
|
|
28
|
+
overrides: [
|
|
29
|
+
{
|
|
30
|
+
type: "theme",
|
|
31
|
+
target: "personalization.theme.guided-onboarding",
|
|
32
|
+
version: "1.0.0"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
type: "workflow",
|
|
36
|
+
target: "billing.invoiceApproval",
|
|
37
|
+
version: "1.0.0"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
allocation: {
|
|
43
|
+
type: "sticky",
|
|
44
|
+
attribute: "userId",
|
|
45
|
+
salt: "personalization-overlay-copy"
|
|
46
|
+
},
|
|
47
|
+
successMetrics: [
|
|
48
|
+
{
|
|
49
|
+
key: "checklist-completion-rate",
|
|
50
|
+
telemetryEvent: {
|
|
51
|
+
key: "personalization.assignment.completed",
|
|
52
|
+
version: "1.0.0"
|
|
53
|
+
},
|
|
54
|
+
aggregation: "count",
|
|
55
|
+
target: 1
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
tags: ["personalization", "experiment"]
|
|
59
|
+
};
|
|
60
|
+
export {
|
|
61
|
+
PersonalizationExperiment
|
|
62
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// src/personalization.theme.ts
|
|
2
|
+
import {
|
|
3
|
+
OwnersEnum,
|
|
4
|
+
StabilityEnum
|
|
5
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
6
|
+
var PersonalizationTheme = {
|
|
7
|
+
meta: {
|
|
8
|
+
key: "personalization.theme.guided-onboarding",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
title: "Guided Onboarding Theme",
|
|
11
|
+
description: "Theme tokens used when the personalized onboarding experience is active.",
|
|
12
|
+
domain: "personalization",
|
|
13
|
+
owners: [OwnersEnum.PlatformCore],
|
|
14
|
+
tags: ["personalization", "theme", "onboarding"],
|
|
15
|
+
stability: StabilityEnum.Experimental,
|
|
16
|
+
scopes: ["tenant", "user"]
|
|
17
|
+
},
|
|
18
|
+
tokens: {
|
|
19
|
+
colors: {
|
|
20
|
+
surface: { value: "#FCF6E8" },
|
|
21
|
+
accent: { value: "#C8742A" },
|
|
22
|
+
text: { value: "#2F2419" }
|
|
23
|
+
},
|
|
24
|
+
radii: {
|
|
25
|
+
card: { value: 18 }
|
|
26
|
+
},
|
|
27
|
+
space: {
|
|
28
|
+
panel: { value: 24 }
|
|
29
|
+
},
|
|
30
|
+
typography: {
|
|
31
|
+
body: { value: 16 },
|
|
32
|
+
title: { value: 28 }
|
|
33
|
+
},
|
|
34
|
+
motion: {
|
|
35
|
+
stagger: { value: "180ms" }
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
components: [
|
|
39
|
+
{
|
|
40
|
+
component: "OnboardingChecklist",
|
|
41
|
+
variants: {
|
|
42
|
+
guided: {
|
|
43
|
+
props: {
|
|
44
|
+
emphasis: "warm"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
overrides: [
|
|
51
|
+
{
|
|
52
|
+
scope: "tenant",
|
|
53
|
+
target: "tenant:acme",
|
|
54
|
+
tokens: {
|
|
55
|
+
colors: {
|
|
56
|
+
accent: { value: "#8A4B12" }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
PersonalizationTheme
|
|
64
|
+
};
|