@voltro/plugin-progression 0.0.0-stage → 0.87.0

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 (97) hide show
  1. package/CHANGELOG.md +24329 -0
  2. package/LICENSE +61 -0
  3. package/README.md +478 -2
  4. package/SECURITY.md +56 -0
  5. package/THIRD-PARTY-NOTICES.md +9189 -0
  6. package/dist/achievementComponents.js +92 -0
  7. package/dist/achievementStore.js +603 -0
  8. package/dist/achievementTables.entity.js +98 -0
  9. package/dist/achievements.d.ts +188 -0
  10. package/dist/achievements.js +205 -0
  11. package/dist/capture.js +64 -0
  12. package/dist/cmsQuests.d.ts +91 -0
  13. package/dist/cmsQuests.js +83 -0
  14. package/dist/components.d.ts +172 -0
  15. package/dist/components.js +4 -0
  16. package/dist/curve.d.ts +27 -0
  17. package/dist/curve.js +38 -0
  18. package/dist/daily.d.ts +152 -0
  19. package/dist/daily.js +126 -0
  20. package/dist/dailyStore.js +421 -0
  21. package/dist/dailySystem.fixture.js +138 -0
  22. package/dist/dailyTables.entity.js +90 -0
  23. package/dist/declarationFixtures.js +143 -0
  24. package/dist/errors.d.ts +13 -0
  25. package/dist/errors.js +20 -0
  26. package/dist/index.d.ts +1833 -0
  27. package/dist/index.js +19 -0
  28. package/dist/pass.d.ts +186 -0
  29. package/dist/pass.js +122 -0
  30. package/dist/passRules.js +96 -0
  31. package/dist/passStore.js +485 -0
  32. package/dist/passTables.entity.js +96 -0
  33. package/dist/plugin.js +1086 -0
  34. package/dist/port.js +5 -0
  35. package/dist/progressionStore.js +706 -0
  36. package/dist/questComponents.js +163 -0
  37. package/dist/questPort.d.ts +126 -0
  38. package/dist/questPort.js +5 -0
  39. package/dist/questRefresh.js +56 -0
  40. package/dist/questRefresh.server.js +126 -0
  41. package/dist/questRerollJournal.js +77 -0
  42. package/dist/questStore.js +592 -0
  43. package/dist/questTables.entity.js +117 -0
  44. package/dist/quests.d.ts +142 -0
  45. package/dist/quests.js +153 -0
  46. package/dist/rank-app/schedules/progression.dispatchRankClosures.cron.tsx +19 -0
  47. package/dist/rank-app/workflows/progression.closeRankSeason.workflow.server.tsx +10 -0
  48. package/dist/rank-app/workflows/progression.closeRankSeason.workflow.tsx +1 -0
  49. package/dist/rankClosure.d.ts +69 -0
  50. package/dist/rankClosure.js +35 -0
  51. package/dist/rankClosure.server.js +139 -0
  52. package/dist/rankClosureWorkflow.d.ts +34 -0
  53. package/dist/rankClosureWorkflow.js +16 -0
  54. package/dist/rankReader.server.js +57 -0
  55. package/dist/rankRewardParent.server.js +65 -0
  56. package/dist/rankSeasons.d.ts +144 -0
  57. package/dist/rankSeasons.js +91 -0
  58. package/dist/rankStore.js +521 -0
  59. package/dist/rankSystem.fixture.js +170 -0
  60. package/dist/rankTables.entity.js +101 -0
  61. package/dist/ranks.d.ts +167 -0
  62. package/dist/ranks.js +219 -0
  63. package/dist/resourceStore.js +464 -0
  64. package/dist/resourceTables.entity.js +89 -0
  65. package/dist/resources.d.ts +105 -0
  66. package/dist/resources.js +60 -0
  67. package/dist/reward-app/schedules/progression.dispatchRewards.cron.tsx +19 -0
  68. package/dist/reward-app/workflows/progression.deliverReward.workflow.server.tsx +10 -0
  69. package/dist/reward-app/workflows/progression.deliverReward.workflow.tsx +1 -0
  70. package/dist/reward.d.ts +27 -0
  71. package/dist/reward.js +39 -0
  72. package/dist/rewardDelivery.d.ts +163 -0
  73. package/dist/rewardDelivery.js +38 -0
  74. package/dist/rewardDelivery.server.js +430 -0
  75. package/dist/rewardDeliveryRecord.js +48 -0
  76. package/dist/rewardDeliveryWorkflow.d.ts +36 -0
  77. package/dist/rewardDeliveryWorkflow.js +16 -0
  78. package/dist/rpc.d.ts +880 -0
  79. package/dist/rpc.js +498 -0
  80. package/dist/server.d.ts +2812 -0
  81. package/dist/server.js +21 -0
  82. package/dist/stats.js +45 -0
  83. package/dist/strategies.d.ts +131 -0
  84. package/dist/strategies.js +4 -0
  85. package/dist/systemFixtures.js +474 -0
  86. package/dist/tables.entity.js +155 -0
  87. package/dist/testing.d.ts +1566 -0
  88. package/dist/testing.js +11 -0
  89. package/dist/track.js +72 -0
  90. package/dist/tutorial.d.ts +157 -0
  91. package/dist/tutorial.js +110 -0
  92. package/dist/tutorialStore.js +496 -0
  93. package/dist/tutorialSystem.fixture.js +100 -0
  94. package/dist/tutorialTables.entity.js +91 -0
  95. package/dist/web.d.ts +363 -0
  96. package/dist/web.js +7 -0
  97. package/package.json +167 -4
@@ -0,0 +1,11 @@
1
+ import { defaultRankDecay as e, defaultRankGrade as t, defaultRankScore as n, defaultRankSeasonReset as r } from "./ranks.js";
2
+ import { defaultTutorialStepPolicy as i, resolveTutorialStep as a } from "./tutorial.js";
3
+ import { defaultPassCatchUp as o, resolvePassCatchUp as s } from "./pass.js";
4
+ import { defaultQuestProgressResolver as c, defaultQuestSelector as l, defineQuestPool as u, resolveQuestProgress as d, selectQuests as f, staticQuestSource as p } from "./quests.js";
5
+ import { defaultResourceRegen as m, defineRegenResource as h, resolveResourceRegen as g } from "./resources.js";
6
+ import { passFixture as _, progressionFixture as v, rankFixture as y, rankSeasonPolicyFixture as b, resourceFixture as x, tutorialFixture as S } from "./declarationFixtures.js";
7
+ import { achievementEvaluatorSystemFixture as C, achievementFakeLayer as w, achievementPortSystemFixture as T, achievementStatSourceFakeLayer as E, achievementStatSourceSystemFixture as D, passCatchUpSystemFixture as O, passFakeLayer as k, passPortSystemFixture as A, progressionFakeLayer as j, progressionPortSystemFixture as M, questFakeLayer as N, questPortSystemFixture as P, questProgressResolverSystemFixture as F, questSelectorSystemFixture as I, questSourceFakeLayer as L, questSourceSystemFixture as R, resourceFakeLayer as z, resourcePortSystemFixture as B, resourceRegenSystemFixture as V, rewardResolverSystemFixture as H, xpCurveSystemFixture as U } from "./systemFixtures.js";
8
+ import { tutorialFakeLayer as W, tutorialPortSystemFixture as G, tutorialStepPolicySystemFixture as K } from "./tutorialSystem.fixture.js";
9
+ import { dailyClaimPolicySystemFixture as q, dailyProfileSourceFakeLayer as J, dailyProfileSourceSystemFixture as Y, loginCalendarFakeLayer as X, loginCalendarPortSystemFixture as Z } from "./dailySystem.fixture.js";
10
+ import { rankDecaySystemFixture as Q, rankFakeLayer as $, rankGradeSystemFixture as ee, rankPortSystemFixture as te, rankRatingSourceFakeLayer as ne, rankRatingSourceSystemFixture as re, rankScoreSystemFixture as ie, rankSeasonResetSystemFixture as ae } from "./rankSystem.fixture.js";
11
+ export { C as achievementEvaluatorSystemFixture, w as achievementFakeLayer, T as achievementPortSystemFixture, E as achievementStatSourceFakeLayer, D as achievementStatSourceSystemFixture, q as dailyClaimPolicySystemFixture, J as dailyProfileSourceFakeLayer, Y as dailyProfileSourceSystemFixture, o as defaultPassCatchUp, c as defaultQuestProgressResolver, l as defaultQuestSelector, e as defaultRankDecay, t as defaultRankGrade, n as defaultRankScore, r as defaultRankSeasonReset, m as defaultResourceRegen, i as defaultTutorialStepPolicy, u as defineQuestPool, h as defineRegenResource, X as loginCalendarFakeLayer, Z as loginCalendarPortSystemFixture, O as passCatchUpSystemFixture, k as passFakeLayer, _ as passFixture, A as passPortSystemFixture, j as progressionFakeLayer, v as progressionFixture, M as progressionPortSystemFixture, N as questFakeLayer, P as questPortSystemFixture, F as questProgressResolverSystemFixture, I as questSelectorSystemFixture, L as questSourceFakeLayer, R as questSourceSystemFixture, Q as rankDecaySystemFixture, $ as rankFakeLayer, y as rankFixture, ee as rankGradeSystemFixture, te as rankPortSystemFixture, ne as rankRatingSourceFakeLayer, re as rankRatingSourceSystemFixture, ie as rankScoreSystemFixture, b as rankSeasonPolicyFixture, ae as rankSeasonResetSystemFixture, s as resolvePassCatchUp, d as resolveQuestProgress, g as resolveResourceRegen, a as resolveTutorialStep, z as resourceFakeLayer, x as resourceFixture, B as resourcePortSystemFixture, V as resourceRegenSystemFixture, H as rewardResolverSystemFixture, f as selectQuests, p as staticQuestSource, W as tutorialFakeLayer, S as tutorialFixture, G as tutorialPortSystemFixture, K as tutorialStepPolicySystemFixture, U as xpCurveSystemFixture };
package/dist/track.js ADDED
@@ -0,0 +1,72 @@
1
+ import { progressionError as e } from "./errors.js";
2
+ import { identifier as t, integer as n, list as r, object as i } from "./capture.js";
3
+ import { captureRewards as a } from "./reward.js";
4
+ import { explicitLevelCurve as o } from "./curve.js";
5
+ //#region src/track.ts
6
+ var s = (s) => {
7
+ let c = i(s, [
8
+ "id",
9
+ "version",
10
+ "xpCurve",
11
+ "sources",
12
+ "rewards"
13
+ ]), l = i(c.xpCurve, ["thresholds"]), u = o(l.thresholds), d = r(c.sources, 64).map(t);
14
+ if (d.length === 0 || new Set(d).size !== d.length) throw e("invalid_track");
15
+ let f = i(c.rewards ?? {}), p = Object.create(null), m = Object.create(null), h = (t) => {
16
+ if (!/^[1-9][0-9]*$/.test(t)) throw e("invalid_reward");
17
+ return String(n(Number(t), 2, u.thresholds.length));
18
+ };
19
+ for (let [e, t] of Object.entries(f)) if (e === "every") for (let [e, n] of Object.entries(i(t))) m[h(e)] = a(n, 64);
20
+ else p[h(e)] = a(t, 64);
21
+ return Object.freeze({
22
+ id: t(c.id),
23
+ version: n(c.version ?? 1, 1, 1e6),
24
+ xpCurve: u,
25
+ sources: Object.freeze(d),
26
+ rewards: Object.freeze(p),
27
+ every: Object.freeze(m)
28
+ });
29
+ }, c = (e) => ({
30
+ id: e.id,
31
+ version: e.version,
32
+ xpCurve: e.xpCurve,
33
+ sources: e.sources,
34
+ rewards: {
35
+ ...e.rewards,
36
+ every: e.every
37
+ }
38
+ }), l = ({ track: t, fromLevel: n, toLevel: r }) => {
39
+ let i = [];
40
+ for (let a = n + 1; a <= r; a++) {
41
+ for (let n of t.rewards[String(a)] ?? []) {
42
+ if (i.length >= 256) throw e("limit_exceeded");
43
+ i.push(Object.freeze({
44
+ level: a,
45
+ reward: n
46
+ }));
47
+ }
48
+ for (let [n, r] of Object.entries(t.every)) if (a % Number(n) === 0) for (let t of r) {
49
+ if (i.length >= 256) throw e("limit_exceeded");
50
+ i.push(Object.freeze({
51
+ level: a,
52
+ reward: t
53
+ }));
54
+ }
55
+ }
56
+ return Object.freeze(i);
57
+ }, u = (e, t = l) => {
58
+ let o = s(c(e.track)), u = n(e.fromLevel, 1, o.xpCurve.thresholds.length), d = n(e.toLevel, u, o.xpCurve.thresholds.length);
59
+ return Object.freeze(r(t(Object.freeze({
60
+ track: o,
61
+ fromLevel: u,
62
+ toLevel: d
63
+ })), 256).map((e) => {
64
+ let t = i(e, ["level", "reward"]);
65
+ return Object.freeze({
66
+ level: n(t.level, u + 1, d),
67
+ reward: a([t.reward], 1)[0]
68
+ });
69
+ }));
70
+ };
71
+ //#endregion
72
+ export { l as defaultRewardResolver, s as defineProgression, u as resolveRewards, c as trackDeclaration };
@@ -0,0 +1,157 @@
1
+ import { Context } from 'effect';
2
+ import { Effect } from 'effect';
3
+ import { PluginPrivacyTarget } from '@voltro/protocol';
4
+ import { Schema } from 'effect';
5
+ import { Subject } from '@voltro/protocol';
6
+ import { YieldableError } from 'effect/Cause';
7
+
8
+ export declare const captureTutorialEvidence: (input: unknown, at: number) => TutorialEvidence;
9
+
10
+ export declare const captureTutorialState: (input: unknown, tutorial: Tutorial) => TutorialState;
11
+
12
+ export declare const defaultTutorialStepPolicy: TutorialStepPolicy;
13
+
14
+ export declare const defineTutorial: (input: TutorialDefinition | Tutorial) => Tutorial;
15
+
16
+ export declare const initialTutorialState: (tutorial: Tutorial) => TutorialState;
17
+
18
+ export declare interface PlayerTutorial extends TutorialState {
19
+ readonly nextStep: string | null;
20
+ readonly skippable: boolean;
21
+ readonly hints: string | null;
22
+ }
23
+
24
+ declare class ProgressionError extends ProgressionError_base {
25
+ }
26
+
27
+ declare const ProgressionError_base: Schema.Class<ProgressionError, Schema.TaggedStruct<"ProgressionError", {
28
+ readonly code: Schema.Literals<readonly ["invalid_input", "invalid_record", "invalid_curve", "invalid_reward", "invalid_track", "invalid_stat", "overflow", "insufficient_resource", "forbidden", "conflict", "erased", "not_found", "limit_exceeded", "unavailable"]>;
29
+ }>, YieldableError>;
30
+
31
+ declare type ProgressionReward = {
32
+ readonly kind: 'currency';
33
+ readonly currency: string;
34
+ readonly amount: string;
35
+ } | {
36
+ readonly kind: 'item';
37
+ readonly itemId: string;
38
+ readonly qty: number;
39
+ } | {
40
+ readonly kind: 'xp';
41
+ readonly trackId: string;
42
+ readonly amount: string;
43
+ };
44
+
45
+ export declare const resolveTutorialSkip: (tutorial: Tutorial, input: TutorialState, atInput: number) => TutorialState;
46
+
47
+ export declare const resolveTutorialStep: (input: TutorialStepPolicyContext, policy?: TutorialStepPolicy) => TutorialState;
48
+
49
+ export declare interface Tutorial {
50
+ readonly id: string;
51
+ readonly version: number;
52
+ readonly steps: readonly string[];
53
+ readonly skippable: boolean;
54
+ readonly reward: readonly ProgressionReward[];
55
+ readonly rewardOnSkip: boolean;
56
+ readonly hints: string | null;
57
+ }
58
+
59
+ export declare interface TutorialDefinition {
60
+ readonly id?: string;
61
+ readonly version?: number;
62
+ readonly steps: readonly string[];
63
+ readonly skippable?: boolean;
64
+ readonly reward?: readonly ProgressionReward[];
65
+ readonly rewardOnSkip?: boolean;
66
+ readonly hints?: string;
67
+ }
68
+
69
+ export declare interface TutorialEvidence {
70
+ readonly source: string;
71
+ readonly originId: string;
72
+ readonly version: string;
73
+ readonly from: number;
74
+ readonly until: number;
75
+ }
76
+
77
+ export declare class TutorialPort extends TutorialPort_base {
78
+ }
79
+
80
+ declare const TutorialPort_base: Context.ServiceClass<TutorialPort, "@voltro/TutorialPort", TutorialService>;
81
+
82
+ export declare interface TutorialReceipt {
83
+ readonly operationId: string;
84
+ readonly kind: 'step' | 'skip';
85
+ readonly step: string | null;
86
+ readonly after: TutorialState;
87
+ readonly rewardsQueued: number;
88
+ readonly at: number;
89
+ }
90
+
91
+ export declare interface TutorialRecordInput extends TutorialStepInput {
92
+ readonly tenantId: string;
93
+ readonly ownerId: string;
94
+ readonly source: string;
95
+ readonly originId: string;
96
+ }
97
+
98
+ export declare interface TutorialService {
99
+ readonly completeStep: (subject: Subject, input: TutorialStepInput) => Effect.Effect<TutorialReceipt, ProgressionError>;
100
+ readonly record: (subject: Subject, input: TutorialRecordInput) => Effect.Effect<TutorialReceipt, ProgressionError>;
101
+ readonly skip: (subject: Subject, input: TutorialSkipInput) => Effect.Effect<TutorialReceipt, ProgressionError>;
102
+ readonly mine: (subject: Subject) => Effect.Effect<readonly PlayerTutorial[], ProgressionError>;
103
+ readonly exportSubject: (target: PluginPrivacyTarget) => Effect.Effect<unknown, ProgressionError>;
104
+ readonly eraseSubject: (target: PluginPrivacyTarget) => Effect.Effect<void, ProgressionError>;
105
+ }
106
+
107
+ export declare interface TutorialSkipInput {
108
+ readonly tutorialId: string;
109
+ readonly requestId: string;
110
+ }
111
+
112
+ export declare interface TutorialState {
113
+ readonly tutorialId: string;
114
+ readonly version: number;
115
+ readonly completedSteps: readonly string[];
116
+ readonly completed: boolean;
117
+ readonly skipped: boolean;
118
+ readonly completedAt: number | null;
119
+ readonly updatedAt: number | null;
120
+ }
121
+
122
+ export declare interface TutorialStepInput {
123
+ readonly tutorialId: string;
124
+ readonly step: string;
125
+ readonly requestId: string;
126
+ }
127
+
128
+ export declare type TutorialStepPolicy = (input: TutorialStepPolicyContext) => boolean;
129
+
130
+ export declare interface TutorialStepPolicyContext {
131
+ readonly tutorial: Tutorial;
132
+ readonly before: TutorialState;
133
+ readonly step: string;
134
+ readonly evidence: TutorialEvidence;
135
+ readonly at: number;
136
+ }
137
+
138
+ export declare interface TutorialVerificationInput {
139
+ readonly tenantId: string;
140
+ readonly ownerId: string;
141
+ readonly tutorialId: string;
142
+ readonly version: number;
143
+ readonly step: string;
144
+ readonly requestId: string;
145
+ }
146
+
147
+ export declare class TutorialVerifier extends TutorialVerifier_base {
148
+ }
149
+
150
+ declare const TutorialVerifier_base: Context.ServiceClass<TutorialVerifier, "@voltro/TutorialVerifier", TutorialVerifierService>;
151
+
152
+ /** An app checks actual authoritative gameplay evidence; a client completion boolean is never evidence. */
153
+ export declare interface TutorialVerifierService {
154
+ readonly verify: (subject: Subject, input: TutorialVerificationInput) => Effect.Effect<TutorialEvidence, ProgressionError>;
155
+ }
156
+
157
+ export { }
@@ -0,0 +1,110 @@
1
+ import { progressionError as e } from "./errors.js";
2
+ import { identifier as t, integer as n, list as r, object as i } from "./capture.js";
3
+ import { captureRewards as a } from "./reward.js";
4
+ import { Context as o } from "effect";
5
+ //#region src/tutorial.ts
6
+ var s = (o) => {
7
+ let s = i(o, [
8
+ "id",
9
+ "version",
10
+ "steps",
11
+ "skippable",
12
+ "reward",
13
+ "rewardOnSkip",
14
+ "hints"
15
+ ]), c = r(s.steps, 128).map(t);
16
+ if (!c.length || new Set(c).size !== c.length || s.skippable !== void 0 && typeof s.skippable != "boolean" || s.rewardOnSkip !== void 0 && typeof s.rewardOnSkip != "boolean") throw e("invalid_input");
17
+ return Object.freeze({
18
+ id: t(s.id ?? "tutorial"),
19
+ version: n(s.version ?? 1, 1, 1e6),
20
+ steps: Object.freeze(c),
21
+ skippable: s.skippable ?? !1,
22
+ reward: a(s.reward ?? [], 64),
23
+ rewardOnSkip: s.rewardOnSkip ?? !1,
24
+ hints: s.hints == null ? null : t(s.hints)
25
+ });
26
+ }, c = (e) => Object.freeze({
27
+ tutorialId: e.id,
28
+ version: e.version,
29
+ completedSteps: Object.freeze([]),
30
+ completed: !1,
31
+ skipped: !1,
32
+ completedAt: null,
33
+ updatedAt: null
34
+ }), l = (a, o) => {
35
+ let s = i(a, [
36
+ "tutorialId",
37
+ "version",
38
+ "completedSteps",
39
+ "completed",
40
+ "skipped",
41
+ "completedAt",
42
+ "updatedAt"
43
+ ]), c = r(s.completedSteps, o.steps.length).map(t);
44
+ if (s.tutorialId !== o.id || s.version !== o.version || c.some((e, t) => e !== o.steps[t]) || typeof s.completed != "boolean" || typeof s.skipped != "boolean" || s.skipped && !o.skippable || s.completed !== (s.skipped || c.length === o.steps.length)) throw e("invalid_record");
45
+ let l = s.updatedAt === null ? null : n(s.updatedAt, 0, 864e13), u = s.completed ? n(s.completedAt, 0, l ?? -1) : null;
46
+ if (!s.completed && s.completedAt !== null || l === null && (c.length !== 0 || s.completed) || l !== null && c.length === 0 && !s.skipped) throw e("invalid_record");
47
+ return Object.freeze({
48
+ tutorialId: o.id,
49
+ version: o.version,
50
+ completedSteps: Object.freeze(c),
51
+ completed: s.completed,
52
+ skipped: s.skipped,
53
+ completedAt: u,
54
+ updatedAt: l
55
+ });
56
+ }, u = (e, r) => {
57
+ let a = i(e, [
58
+ "source",
59
+ "originId",
60
+ "version",
61
+ "from",
62
+ "until"
63
+ ]), o = n(a.from, 0, r), s = n(a.until, r + 1, 864e13);
64
+ return Object.freeze({
65
+ source: t(a.source),
66
+ originId: t(a.originId),
67
+ version: t(a.version),
68
+ from: o,
69
+ until: s
70
+ });
71
+ }, d = class extends o.Service()("@voltro/TutorialVerifier") {}, f = ({ tutorial: e, before: t, step: n }) => !t.completed && e.steps[t.completedSteps.length] === n, p = (r, i = f) => {
72
+ let a = s(r.tutorial), o = l(r.before, a), c = n(r.at, o.updatedAt ?? 0, 864e13), d = t(r.step), p = u(r.evidence, c);
73
+ if (!f({
74
+ tutorial: a,
75
+ before: o,
76
+ step: d,
77
+ evidence: p,
78
+ at: c
79
+ })) throw e("conflict");
80
+ let m = i(Object.freeze({
81
+ tutorial: a,
82
+ before: o,
83
+ step: d,
84
+ evidence: p,
85
+ at: c
86
+ }));
87
+ if (typeof m != "boolean") throw e("invalid_input");
88
+ if (!m) throw e("forbidden");
89
+ let h = Object.freeze([...o.completedSteps, d]), g = h.length === a.steps.length;
90
+ return l({
91
+ ...o,
92
+ completedSteps: h,
93
+ completed: g,
94
+ completedAt: g ? c : null,
95
+ updatedAt: c
96
+ }, a);
97
+ }, m = (t, r, i) => {
98
+ let a = l(r, t), o = n(i, a.updatedAt ?? 0, 864e13);
99
+ if (!t.skippable) throw e("forbidden");
100
+ if (a.completed) throw e("conflict");
101
+ return l({
102
+ ...a,
103
+ completed: !0,
104
+ skipped: !0,
105
+ completedAt: o,
106
+ updatedAt: o
107
+ }, t);
108
+ }, h = class extends o.Service()("@voltro/TutorialPort") {};
109
+ //#endregion
110
+ export { h as TutorialPort, d as TutorialVerifier, u as captureTutorialEvidence, l as captureTutorialState, f as defaultTutorialStepPolicy, s as defineTutorial, c as initialTutorialState, m as resolveTutorialSkip, p as resolveTutorialStep };