@runhalo/engine 0.7.0 → 0.9.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.
- package/dist/coppa-countdown.d.ts +44 -0
- package/dist/coppa-countdown.js +107 -0
- package/dist/coppa-countdown.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +135 -103
- package/dist/index.js.map +1 -1
- package/dist/sdk-intelligence.d.ts +37 -0
- package/dist/sdk-intelligence.js +246 -0
- package/dist/sdk-intelligence.js.map +1 -0
- package/dist/tier-context.d.ts +84 -0
- package/dist/tier-context.js +241 -0
- package/dist/tier-context.js.map +1 -0
- package/package.json +1 -1
- package/rules/rules.json +4366 -1059
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TierContext — 4-tier feature gating for Halo 2.0
|
|
4
|
+
*
|
|
5
|
+
* Sprint 19: Every output surface (CLI, GitHub Action, PDF, dashboard, API)
|
|
6
|
+
* queries tier permissions from this single source.
|
|
7
|
+
*
|
|
8
|
+
* Don't Go Backwards Rule: TierContext is the ONLY way to gate features.
|
|
9
|
+
* No scattered if-statements. One place to update, one place to test, one place to audit.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TIER_DISPLAY_NAMES = exports.TIER_FEATURES = exports.TIER_LIMITS = void 0;
|
|
13
|
+
exports.createTierContext = createTierContext;
|
|
14
|
+
exports.resolveTierFromKey = resolveTierFromKey;
|
|
15
|
+
exports.getUpgradeCTA = getUpgradeCTA;
|
|
16
|
+
exports.getTierComparison = getTierComparison;
|
|
17
|
+
/* ── Tier Definitions ──────────────────────────────────── */
|
|
18
|
+
const TIER_LIMITS = {
|
|
19
|
+
free: {
|
|
20
|
+
scansPerDay: 5,
|
|
21
|
+
repos: 1,
|
|
22
|
+
seats: 1,
|
|
23
|
+
rulesAvailable: 25,
|
|
24
|
+
aiReviewBudgetPerRepo: 0,
|
|
25
|
+
},
|
|
26
|
+
pro: {
|
|
27
|
+
scansPerDay: Infinity,
|
|
28
|
+
repos: 3,
|
|
29
|
+
seats: 3,
|
|
30
|
+
rulesAvailable: 160,
|
|
31
|
+
aiReviewBudgetPerRepo: 5,
|
|
32
|
+
},
|
|
33
|
+
business: {
|
|
34
|
+
scansPerDay: Infinity,
|
|
35
|
+
repos: 10,
|
|
36
|
+
seats: 5,
|
|
37
|
+
rulesAvailable: 160,
|
|
38
|
+
aiReviewBudgetPerRepo: 15,
|
|
39
|
+
},
|
|
40
|
+
enterprise: {
|
|
41
|
+
scansPerDay: Infinity,
|
|
42
|
+
repos: Infinity,
|
|
43
|
+
seats: Infinity,
|
|
44
|
+
rulesAvailable: 160,
|
|
45
|
+
aiReviewBudgetPerRepo: Infinity,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
exports.TIER_LIMITS = TIER_LIMITS;
|
|
49
|
+
const TIER_FEATURES = {
|
|
50
|
+
free: {
|
|
51
|
+
aiReview: false,
|
|
52
|
+
astAnalysis: false,
|
|
53
|
+
pdfSummary: false,
|
|
54
|
+
pdfAttestation: false,
|
|
55
|
+
sarif: false,
|
|
56
|
+
recurringScans: false,
|
|
57
|
+
driftAlerts: false,
|
|
58
|
+
auditTrail: false,
|
|
59
|
+
enforcementAlerts: false,
|
|
60
|
+
dashboardTrend: false,
|
|
61
|
+
multiRepo: false,
|
|
62
|
+
roleBasedViews: false,
|
|
63
|
+
customRules: false,
|
|
64
|
+
coppa2Countdown: true,
|
|
65
|
+
scanDiff: false,
|
|
66
|
+
complianceHistory: false,
|
|
67
|
+
},
|
|
68
|
+
pro: {
|
|
69
|
+
aiReview: true,
|
|
70
|
+
astAnalysis: true,
|
|
71
|
+
pdfSummary: true,
|
|
72
|
+
pdfAttestation: false,
|
|
73
|
+
sarif: true,
|
|
74
|
+
recurringScans: false,
|
|
75
|
+
driftAlerts: false,
|
|
76
|
+
auditTrail: false,
|
|
77
|
+
enforcementAlerts: false,
|
|
78
|
+
dashboardTrend: true,
|
|
79
|
+
multiRepo: false,
|
|
80
|
+
roleBasedViews: false,
|
|
81
|
+
customRules: false,
|
|
82
|
+
coppa2Countdown: true,
|
|
83
|
+
scanDiff: false,
|
|
84
|
+
complianceHistory: false,
|
|
85
|
+
},
|
|
86
|
+
business: {
|
|
87
|
+
aiReview: true,
|
|
88
|
+
astAnalysis: true,
|
|
89
|
+
pdfSummary: true,
|
|
90
|
+
pdfAttestation: true,
|
|
91
|
+
sarif: true,
|
|
92
|
+
recurringScans: true,
|
|
93
|
+
driftAlerts: true,
|
|
94
|
+
auditTrail: true,
|
|
95
|
+
enforcementAlerts: true,
|
|
96
|
+
dashboardTrend: true,
|
|
97
|
+
multiRepo: true,
|
|
98
|
+
roleBasedViews: true,
|
|
99
|
+
customRules: false,
|
|
100
|
+
coppa2Countdown: true,
|
|
101
|
+
scanDiff: true,
|
|
102
|
+
complianceHistory: true,
|
|
103
|
+
},
|
|
104
|
+
enterprise: {
|
|
105
|
+
aiReview: true,
|
|
106
|
+
astAnalysis: true,
|
|
107
|
+
pdfSummary: true,
|
|
108
|
+
pdfAttestation: true,
|
|
109
|
+
sarif: true,
|
|
110
|
+
recurringScans: true,
|
|
111
|
+
driftAlerts: true,
|
|
112
|
+
auditTrail: true,
|
|
113
|
+
enforcementAlerts: true,
|
|
114
|
+
dashboardTrend: true,
|
|
115
|
+
multiRepo: true,
|
|
116
|
+
roleBasedViews: true,
|
|
117
|
+
customRules: true,
|
|
118
|
+
coppa2Countdown: true,
|
|
119
|
+
scanDiff: true,
|
|
120
|
+
complianceHistory: true,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
exports.TIER_FEATURES = TIER_FEATURES;
|
|
124
|
+
const TIER_DISPLAY_NAMES = {
|
|
125
|
+
free: 'Free',
|
|
126
|
+
pro: 'Pro',
|
|
127
|
+
business: 'Business',
|
|
128
|
+
enterprise: 'Enterprise',
|
|
129
|
+
};
|
|
130
|
+
exports.TIER_DISPLAY_NAMES = TIER_DISPLAY_NAMES;
|
|
131
|
+
/* ── Factory ───────────────────────────────────────────── */
|
|
132
|
+
/**
|
|
133
|
+
* Create a TierContext for a given tier.
|
|
134
|
+
* All feature/limit checks go through this object.
|
|
135
|
+
*/
|
|
136
|
+
function createTierContext(tier) {
|
|
137
|
+
const limits = TIER_LIMITS[tier];
|
|
138
|
+
const features = TIER_FEATURES[tier];
|
|
139
|
+
return {
|
|
140
|
+
tier,
|
|
141
|
+
limits,
|
|
142
|
+
features,
|
|
143
|
+
displayName: TIER_DISPLAY_NAMES[tier],
|
|
144
|
+
can(feature) {
|
|
145
|
+
return features[feature] === true;
|
|
146
|
+
},
|
|
147
|
+
withinLimit(limit, current) {
|
|
148
|
+
const max = limits[limit];
|
|
149
|
+
if (max === Infinity)
|
|
150
|
+
return true;
|
|
151
|
+
return current < max;
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/* ── Resolution ────────────────────────────────────────── */
|
|
156
|
+
/**
|
|
157
|
+
* Resolve tier from a license key string.
|
|
158
|
+
* Fails gracefully to free tier on any error (network, expired, invalid).
|
|
159
|
+
* Don't Go Backwards Rule: Never error. Never block the scan.
|
|
160
|
+
*/
|
|
161
|
+
async function resolveTierFromKey(licenseKey, validateFn) {
|
|
162
|
+
if (!licenseKey)
|
|
163
|
+
return createTierContext('free');
|
|
164
|
+
try {
|
|
165
|
+
if (validateFn) {
|
|
166
|
+
const tier = await validateFn(licenseKey);
|
|
167
|
+
return createTierContext(tier);
|
|
168
|
+
}
|
|
169
|
+
// If no validation function provided, parse the key format
|
|
170
|
+
// Key format: halo_{tier}_{uuid} (e.g., halo_pro_abc123)
|
|
171
|
+
const tierMatch = licenseKey.match(/^halo_(free|pro|business|enterprise)_/);
|
|
172
|
+
if (tierMatch) {
|
|
173
|
+
return createTierContext(tierMatch[1]);
|
|
174
|
+
}
|
|
175
|
+
// Unrecognized key format — default to free
|
|
176
|
+
console.warn('[TierContext] Unrecognized license key format, defaulting to free');
|
|
177
|
+
return createTierContext('free');
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
console.warn('[TierContext] License validation failed, defaulting to free:', err);
|
|
181
|
+
return createTierContext('free');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/* ── Utilities ─────────────────────────────────────────── */
|
|
185
|
+
/**
|
|
186
|
+
* Get the upgrade CTA message for a given tier.
|
|
187
|
+
* Used by CLI, GitHub Action comments, and PDF footers.
|
|
188
|
+
*/
|
|
189
|
+
function getUpgradeCTA(currentTier) {
|
|
190
|
+
switch (currentTier) {
|
|
191
|
+
case 'free':
|
|
192
|
+
return 'Upgrade to Pro ($29/mo) for AI-verified compliance results → runhalo.dev/pricing';
|
|
193
|
+
case 'pro':
|
|
194
|
+
return 'Upgrade to Business ($99/mo) for compliance attestation, recurring scans, and audit trail → runhalo.dev/pricing';
|
|
195
|
+
case 'business':
|
|
196
|
+
return 'Need custom rules, unlimited repos, or SLA support? → runhalo.dev/enterprise';
|
|
197
|
+
case 'enterprise':
|
|
198
|
+
return null; // No upsell for enterprise
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Get the tier comparison table as structured data.
|
|
203
|
+
* Used by pricing pages, upgrade modals, and help output.
|
|
204
|
+
*/
|
|
205
|
+
function getTierComparison() {
|
|
206
|
+
const tiers = ['free', 'pro', 'business', 'enterprise'];
|
|
207
|
+
const featureNames = {
|
|
208
|
+
aiReview: 'AI Review Board',
|
|
209
|
+
astAnalysis: 'AST Structural Analysis',
|
|
210
|
+
pdfSummary: 'PDF Summary Report',
|
|
211
|
+
pdfAttestation: 'Compliance Attestation PDF',
|
|
212
|
+
sarif: 'SARIF Output',
|
|
213
|
+
recurringScans: 'Scheduled Recurring Scans',
|
|
214
|
+
driftAlerts: 'Compliance Drift Alerts',
|
|
215
|
+
auditTrail: 'Immutable Audit Trail',
|
|
216
|
+
enforcementAlerts: 'Enforcement Intelligence Alerts',
|
|
217
|
+
dashboardTrend: 'Compliance Trend Charts',
|
|
218
|
+
multiRepo: 'Multi-Repo Workspace',
|
|
219
|
+
roleBasedViews: 'Role-Based Views',
|
|
220
|
+
customRules: 'Custom Rules',
|
|
221
|
+
coppa2Countdown: 'COPPA 2.0 Countdown',
|
|
222
|
+
scanDiff: 'PR Scan Diff',
|
|
223
|
+
complianceHistory: 'Compliance History',
|
|
224
|
+
};
|
|
225
|
+
return {
|
|
226
|
+
tiers,
|
|
227
|
+
features: Object.keys(featureNames).map(key => ({
|
|
228
|
+
name: featureNames[key],
|
|
229
|
+
key,
|
|
230
|
+
values: Object.fromEntries(tiers.map(t => [t, TIER_FEATURES[t][key]])),
|
|
231
|
+
})),
|
|
232
|
+
limits: [
|
|
233
|
+
{ name: 'Scans per day', key: 'scansPerDay', values: { free: '5', pro: 'Unlimited', business: 'Unlimited', enterprise: 'Unlimited' } },
|
|
234
|
+
{ name: 'Repositories', key: 'repos', values: { free: '1', pro: '3', business: '10', enterprise: 'Unlimited' } },
|
|
235
|
+
{ name: 'Team seats', key: 'seats', values: { free: '1', pro: '3', business: '5', enterprise: 'Unlimited' } },
|
|
236
|
+
{ name: 'Rules available', key: 'rulesAvailable', values: { free: '25 COPPA', pro: 'All 160', business: 'All 160', enterprise: 'All + Custom' } },
|
|
237
|
+
],
|
|
238
|
+
prices: { free: '$0', pro: '$29/mo', business: '$99/mo', enterprise: 'Custom' },
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=tier-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier-context.js","sourceRoot":"","sources":["../src/tier-context.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAoKH,8CAoBC;AASD,gDAwBC;AAQD,sCAWC;AAMD,8CA0CC;AAjPD,8DAA8D;AAE9D,MAAM,WAAW,GAAiC;IAChD,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,cAAc,EAAE,EAAE;QAClB,qBAAqB,EAAE,CAAC;KACzB;IACD,GAAG,EAAE;QACH,WAAW,EAAE,QAAQ;QACrB,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,cAAc,EAAE,GAAG;QACnB,qBAAqB,EAAE,CAAC;KACzB;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,QAAQ;QACrB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,CAAC;QACR,cAAc,EAAE,GAAG;QACnB,qBAAqB,EAAE,EAAE;KAC1B;IACD,UAAU,EAAE;QACV,WAAW,EAAE,QAAQ;QACrB,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,QAAQ;QACf,cAAc,EAAE,GAAG;QACnB,qBAAqB,EAAE,QAAQ;KAChC;CACF,CAAC;AAsNO,kCAAW;AApNpB,MAAM,aAAa,GAAmC;IACpD,IAAI,EAAE;QACJ,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,KAAK;QACjB,iBAAiB,EAAE,KAAK;QACxB,cAAc,EAAE,KAAK;QACrB,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,KAAK;QACf,iBAAiB,EAAE,KAAK;KACzB;IACD,GAAG,EAAE;QACH,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,KAAK;QACjB,iBAAiB,EAAE,KAAK;QACxB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,KAAK;QACf,iBAAiB,EAAE,KAAK;KACzB;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,iBAAiB,EAAE,IAAI;QACvB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,IAAI;KACxB;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,iBAAiB,EAAE,IAAI;QACvB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,IAAI;KACxB;CACF,CAAC;AA2IoB,sCAAa;AAzInC,MAAM,kBAAkB,GAA6B;IACnD,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,YAAY;CACzB,CAAC;AAoImC,gDAAkB;AAlIvD,8DAA8D;AAE9D;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,IAAc;IAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO;QACL,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC;QAErC,GAAG,CAAC,OAA2B;YAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;QACpC,CAAC;QAED,WAAW,CAAC,KAAuB,EAAE,OAAe;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,GAAG,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAClC,OAAO,OAAO,GAAG,GAAG,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8DAA8D;AAE9D;;;;GAIG;AACI,KAAK,UAAU,kBAAkB,CACtC,UAA8B,EAC9B,UAA+C;IAE/C,IAAI,CAAC,UAAU;QAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;YAC1C,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,2DAA2D;QAC3D,yDAAyD;QACzD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC5E,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAa,CAAC,CAAC;QACrD,CAAC;QACD,4CAA4C;QAC5C,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAClF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,8DAA8D,EAAE,GAAG,CAAC,CAAC;QAClF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,8DAA8D;AAE9D;;;GAGG;AACH,SAAgB,aAAa,CAAC,WAAqB;IACjD,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,kFAAkF,CAAC;QAC5F,KAAK,KAAK;YACR,OAAO,iHAAiH,CAAC;QAC3H,KAAK,UAAU;YACb,OAAO,8EAA8E,CAAC;QACxF,KAAK,YAAY;YACf,OAAO,IAAI,CAAC,CAAC,2BAA2B;IAC5C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB;IAM/B,MAAM,KAAK,GAAe,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAEpE,MAAM,YAAY,GAAuC;QACvD,QAAQ,EAAE,iBAAiB;QAC3B,WAAW,EAAE,yBAAyB;QACtC,UAAU,EAAE,oBAAoB;QAChC,cAAc,EAAE,4BAA4B;QAC5C,KAAK,EAAE,cAAc;QACrB,cAAc,EAAE,2BAA2B;QAC3C,WAAW,EAAE,yBAAyB;QACtC,UAAU,EAAE,uBAAuB;QACnC,iBAAiB,EAAE,iCAAiC;QACpD,cAAc,EAAE,yBAAyB;QACzC,SAAS,EAAE,sBAAsB;QACjC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,cAAc;QAC3B,eAAe,EAAE,qBAAqB;QACtC,QAAQ,EAAE,cAAc;QACxB,iBAAiB,EAAE,oBAAoB;KACxC,CAAC;IAEF,OAAO;QACL,KAAK;QACL,QAAQ,EAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAA4B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC;YACvB,GAAG;YACH,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAA8B;SACpG,CAAC,CAAC;QACH,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,aAAiC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE;YAC1J,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,OAA2B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE;YACpI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAA2B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE;YACjI,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAoC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE;SACtK;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;KAChF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runhalo/engine",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Halo rule engine — child online safety compliance detection. 130 rules across 10 packs covering COPPA, UK AADC, EU DSA, EU AI Act, and more.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|