@skillsmith/core 2.1.0 → 2.1.2
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/.tsbuildinfo +1 -1
- package/dist/src/analysis/types.d.ts +2 -0
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +13 -1
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.d.ts +4 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +26 -44
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +68 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/client.d.ts +33 -29
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +15 -10
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/billing/BillingService.d.ts +139 -0
- package/dist/src/billing/BillingService.d.ts.map +1 -0
- package/dist/src/billing/BillingService.js +393 -0
- package/dist/src/billing/BillingService.js.map +1 -0
- package/dist/src/billing/GDPRComplianceService.d.ts +176 -0
- package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -0
- package/dist/src/billing/GDPRComplianceService.js +361 -0
- package/dist/src/billing/GDPRComplianceService.js.map +1 -0
- package/dist/src/billing/StripeClient.d.ts +177 -0
- package/dist/src/billing/StripeClient.d.ts.map +1 -0
- package/dist/src/billing/StripeClient.js +462 -0
- package/dist/src/billing/StripeClient.js.map +1 -0
- package/dist/src/billing/StripeReconciliationJob.d.ts +95 -0
- package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -0
- package/dist/src/billing/StripeReconciliationJob.js +405 -0
- package/dist/src/billing/StripeReconciliationJob.js.map +1 -0
- package/dist/src/billing/StripeWebhookHandler.d.ts +92 -0
- package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -0
- package/dist/src/billing/StripeWebhookHandler.js +409 -0
- package/dist/src/billing/StripeWebhookHandler.js.map +1 -0
- package/dist/src/billing/index.d.ts +18 -0
- package/dist/src/billing/index.d.ts.map +1 -0
- package/dist/src/billing/index.js +19 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/billing/types.d.ts +266 -0
- package/dist/src/billing/types.d.ts.map +1 -0
- package/dist/src/billing/types.js +23 -0
- package/dist/src/billing/types.js.map +1 -0
- package/dist/src/embeddings/hnsw-store.d.ts +568 -0
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.js +805 -0
- package/dist/src/embeddings/hnsw-store.js.map +1 -0
- package/dist/src/embeddings/index.d.ts +2 -0
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +2 -0
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +457 -0
- package/dist/src/learning/PatternStore.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.js +893 -0
- package/dist/src/learning/PatternStore.js.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.d.ts +403 -0
- package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.js +627 -0
- package/dist/src/learning/ReasoningBankIntegration.js.map +1 -0
- package/dist/src/learning/index.d.ts +15 -0
- package/dist/src/learning/index.d.ts.map +1 -0
- package/dist/src/learning/index.js +15 -0
- package/dist/src/learning/index.js.map +1 -0
- package/dist/src/routing/SONARouter.d.ts +154 -0
- package/dist/src/routing/SONARouter.d.ts.map +1 -0
- package/dist/src/routing/SONARouter.js +679 -0
- package/dist/src/routing/SONARouter.js.map +1 -0
- package/dist/src/routing/index.d.ts +9 -0
- package/dist/src/routing/index.d.ts.map +1 -0
- package/dist/src/routing/index.js +10 -0
- package/dist/src/routing/index.js.map +1 -0
- package/dist/src/routing/types.d.ts +331 -0
- package/dist/src/routing/types.d.ts.map +1 -0
- package/dist/src/routing/types.js +203 -0
- package/dist/src/routing/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/security/SkillSandbox.d.ts +156 -0
- package/dist/src/security/SkillSandbox.d.ts.map +1 -0
- package/dist/src/security/SkillSandbox.js +303 -0
- package/dist/src/security/SkillSandbox.js.map +1 -0
- package/dist/src/security/index.d.ts +3 -1
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +5 -1
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/presets.d.ts +12 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -1
- package/dist/src/security/rate-limiter/presets.js +12 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -1
- package/dist/src/security/sanitization.d.ts +85 -0
- package/dist/src/security/sanitization.d.ts.map +1 -1
- package/dist/src/security/sanitization.js +133 -0
- package/dist/src/security/sanitization.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +23 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +232 -28
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +13 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +51 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +13 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +1 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/session/SessionManager.d.ts +7 -0
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.js +117 -10
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +52 -32
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +374 -0
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.js +720 -0
- package/dist/src/testing/MultiLLMProvider.js.map +1 -0
- package/dist/src/testing/index.d.ts +8 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +9 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/types.d.ts +3 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/SecurityScanner.test.js +337 -1
- package/dist/tests/SecurityScanner.test.js.map +1 -1
- package/dist/tests/billing/BillingService.test.d.ts +7 -0
- package/dist/tests/billing/BillingService.test.d.ts.map +1 -0
- package/dist/tests/billing/BillingService.test.js +168 -0
- package/dist/tests/billing/BillingService.test.js.map +1 -0
- package/dist/tests/billing/GDPRCompliance.test.d.ts +7 -0
- package/dist/tests/billing/GDPRCompliance.test.d.ts.map +1 -0
- package/dist/tests/billing/GDPRCompliance.test.js +195 -0
- package/dist/tests/billing/GDPRCompliance.test.js.map +1 -0
- package/dist/tests/billing/StripeReconciliation.test.d.ts +7 -0
- package/dist/tests/billing/StripeReconciliation.test.d.ts.map +1 -0
- package/dist/tests/billing/StripeReconciliation.test.js +266 -0
- package/dist/tests/billing/StripeReconciliation.test.js.map +1 -0
- package/dist/tests/billing/stripe-validators.test.d.ts +7 -0
- package/dist/tests/billing/stripe-validators.test.d.ts.map +1 -0
- package/dist/tests/billing/stripe-validators.test.js +107 -0
- package/dist/tests/billing/stripe-validators.test.js.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.d.ts +7 -0
- package/dist/tests/embeddings/hnsw-store.test.d.ts.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.js +295 -0
- package/dist/tests/embeddings/hnsw-store.test.js.map +1 -0
- package/dist/tests/integration/neural/e2e-learning.test.d.ts +17 -0
- package/dist/tests/integration/neural/e2e-learning.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/e2e-learning.test.js +238 -0
- package/dist/tests/integration/neural/e2e-learning.test.js.map +1 -0
- package/dist/tests/integration/neural/helpers.d.ts +132 -0
- package/dist/tests/integration/neural/helpers.d.ts.map +1 -0
- package/dist/tests/integration/neural/helpers.js +287 -0
- package/dist/tests/integration/neural/helpers.js.map +1 -0
- package/dist/tests/integration/neural/personalization.test.d.ts +21 -0
- package/dist/tests/integration/neural/personalization.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/personalization.test.js +304 -0
- package/dist/tests/integration/neural/personalization.test.js.map +1 -0
- package/dist/tests/integration/neural/preference-learner.test.d.ts +23 -0
- package/dist/tests/integration/neural/preference-learner.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/preference-learner.test.js +289 -0
- package/dist/tests/integration/neural/preference-learner.test.js.map +1 -0
- package/dist/tests/integration/neural/privacy.test.d.ts +19 -0
- package/dist/tests/integration/neural/privacy.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/privacy.test.js +249 -0
- package/dist/tests/integration/neural/privacy.test.js.map +1 -0
- package/dist/tests/integration/neural/setup.d.ts +175 -0
- package/dist/tests/integration/neural/setup.d.ts.map +1 -0
- package/dist/tests/integration/neural/setup.js +487 -0
- package/dist/tests/integration/neural/setup.js.map +1 -0
- package/dist/tests/integration/neural/signal-collection.test.d.ts +21 -0
- package/dist/tests/integration/neural/signal-collection.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/signal-collection.test.js +232 -0
- package/dist/tests/integration/neural/signal-collection.test.js.map +1 -0
- package/dist/tests/learning/PatternStore.test.d.ts +8 -0
- package/dist/tests/learning/PatternStore.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.test.js +589 -0
- package/dist/tests/learning/PatternStore.test.js.map +1 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.d.ts +8 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.d.ts.map +1 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.js +269 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.js.map +1 -0
- package/dist/tests/routing/SONARouter.test.d.ts +8 -0
- package/dist/tests/routing/SONARouter.test.d.ts.map +1 -0
- package/dist/tests/routing/SONARouter.test.js +400 -0
- package/dist/tests/routing/SONARouter.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.test.js +10 -12
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/SkillSandbox.test.d.ts +8 -0
- package/dist/tests/security/SkillSandbox.test.d.ts.map +1 -0
- package/dist/tests/security/SkillSandbox.test.js +321 -0
- package/dist/tests/security/SkillSandbox.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +4 -2
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/testing/MultiLLMProvider.test.d.ts +14 -0
- package/dist/tests/testing/MultiLLMProvider.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.test.js +438 -0
- package/dist/tests/testing/MultiLLMProvider.test.js.map +1 -0
- package/package.json +16 -3
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Neural Test Infrastructure - Helpers
|
|
3
|
+
*
|
|
4
|
+
* Provides signal generation utilities and test data factories
|
|
5
|
+
* for the Recommendation Learning Loop integration tests.
|
|
6
|
+
*
|
|
7
|
+
* @see packages/core/src/learning/interfaces.ts
|
|
8
|
+
* @see packages/core/src/learning/types.ts
|
|
9
|
+
*/
|
|
10
|
+
import { type SignalEvent, type RecommendationContext, type SignalMetadata, SignalType, DismissReason, SkillCategory } from '../../../src/learning/types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Options for generating a signal event
|
|
13
|
+
*/
|
|
14
|
+
export interface SignalGeneratorOptions {
|
|
15
|
+
type?: SignalType;
|
|
16
|
+
skillId?: string;
|
|
17
|
+
timestamp?: number;
|
|
18
|
+
category?: SkillCategory;
|
|
19
|
+
trustTier?: string;
|
|
20
|
+
originalScore?: number;
|
|
21
|
+
installedSkills?: string[];
|
|
22
|
+
dismissReason?: DismissReason;
|
|
23
|
+
metadata?: SignalMetadata;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generate a single signal event with sensible defaults
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateSignal(options?: SignalGeneratorOptions): SignalEvent;
|
|
29
|
+
/**
|
|
30
|
+
* Generate multiple signal events in a batch
|
|
31
|
+
*/
|
|
32
|
+
export declare function generateSignalBatch(count: number, options?: SignalGeneratorOptions): SignalEvent[];
|
|
33
|
+
/**
|
|
34
|
+
* Generate a sequence of signals simulating realistic user behavior
|
|
35
|
+
* Returns signals in chronological order
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateUserJourney(skillId: string, outcome: 'successful' | 'abandoned' | 'uninstalled', category?: SkillCategory): SignalEvent[];
|
|
38
|
+
/**
|
|
39
|
+
* Generate signals representing a mix of user interactions across categories
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateMixedCategorySignals(signalsPerCategory: number): Map<SkillCategory, SignalEvent[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Generate dismiss signals with various reasons
|
|
44
|
+
*/
|
|
45
|
+
export declare function generateDismissSignals(count: number, category?: SkillCategory): SignalEvent[];
|
|
46
|
+
/**
|
|
47
|
+
* Create a timestamp offset by a number of days from now.
|
|
48
|
+
* Returns a Unix timestamp (milliseconds) representing a point in the past.
|
|
49
|
+
*
|
|
50
|
+
* @param days - Number of days in the past (must be non-negative)
|
|
51
|
+
* @returns Unix timestamp in milliseconds
|
|
52
|
+
* @throws {RangeError} If days is negative
|
|
53
|
+
* @example
|
|
54
|
+
* const thirtyDaysAgo = daysAgo(30) // timestamp 30 days before now
|
|
55
|
+
*/
|
|
56
|
+
export declare function daysAgo(days: number): number;
|
|
57
|
+
/**
|
|
58
|
+
* Create a timestamp offset by a number of hours from now.
|
|
59
|
+
* Returns a Unix timestamp (milliseconds) representing a point in the past.
|
|
60
|
+
*
|
|
61
|
+
* @param hours - Number of hours in the past (must be non-negative)
|
|
62
|
+
* @returns Unix timestamp in milliseconds
|
|
63
|
+
* @throws {RangeError} If hours is negative
|
|
64
|
+
* @example
|
|
65
|
+
* const twoHoursAgo = hoursAgo(2) // timestamp 2 hours before now
|
|
66
|
+
*/
|
|
67
|
+
export declare function hoursAgo(hours: number): number;
|
|
68
|
+
/**
|
|
69
|
+
* Create a timestamp offset by a number of minutes from now.
|
|
70
|
+
* Returns a Unix timestamp (milliseconds) representing a point in the past.
|
|
71
|
+
*
|
|
72
|
+
* @param minutes - Number of minutes in the past (must be non-negative)
|
|
73
|
+
* @returns Unix timestamp in milliseconds
|
|
74
|
+
* @throws {RangeError} If minutes is negative
|
|
75
|
+
* @example
|
|
76
|
+
* const fiveMinutesAgo = minutesAgo(5) // timestamp 5 minutes before now
|
|
77
|
+
*/
|
|
78
|
+
export declare function minutesAgo(minutes: number): number;
|
|
79
|
+
/**
|
|
80
|
+
* Generate a recommendation context for testing
|
|
81
|
+
*/
|
|
82
|
+
export declare function generateContext(options?: {
|
|
83
|
+
installedSkills?: string[];
|
|
84
|
+
originalScore?: number;
|
|
85
|
+
category?: SkillCategory;
|
|
86
|
+
trustTier?: string;
|
|
87
|
+
projectContext?: string;
|
|
88
|
+
}): RecommendationContext;
|
|
89
|
+
/**
|
|
90
|
+
* Generate metadata for signal events
|
|
91
|
+
*/
|
|
92
|
+
export declare function generateMetadata(options?: {
|
|
93
|
+
timeToAction?: number;
|
|
94
|
+
suggestionCount?: number;
|
|
95
|
+
extra?: Record<string, unknown>;
|
|
96
|
+
}): SignalMetadata;
|
|
97
|
+
/**
|
|
98
|
+
* Generate test skill data for personalization testing
|
|
99
|
+
*/
|
|
100
|
+
export declare function generateSkillData(id: string, options?: {
|
|
101
|
+
category?: SkillCategory;
|
|
102
|
+
trustTier?: string;
|
|
103
|
+
keywords?: string[];
|
|
104
|
+
triggerPhrases?: string[];
|
|
105
|
+
}): {
|
|
106
|
+
id: string;
|
|
107
|
+
category?: string;
|
|
108
|
+
trustTier?: string;
|
|
109
|
+
keywords?: string[];
|
|
110
|
+
triggerPhrases?: string[];
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Generate a set of skills with varied categories for recommendation testing
|
|
114
|
+
*/
|
|
115
|
+
export declare function generateSkillSet(count: number): Array<{
|
|
116
|
+
skill_id: string;
|
|
117
|
+
base_score: number;
|
|
118
|
+
skill_data: {
|
|
119
|
+
category?: string;
|
|
120
|
+
trustTier?: string;
|
|
121
|
+
keywords?: string[];
|
|
122
|
+
};
|
|
123
|
+
}>;
|
|
124
|
+
/**
|
|
125
|
+
* Assert that signals are in chronological order
|
|
126
|
+
*/
|
|
127
|
+
export declare function assertChronological(signals: SignalEvent[]): void;
|
|
128
|
+
/**
|
|
129
|
+
* Wait for a specified number of milliseconds
|
|
130
|
+
*/
|
|
131
|
+
export declare function delay(ms: number): Promise<void>;
|
|
132
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../tests/integration/neural/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Neural Test Infrastructure - Helpers
|
|
3
|
+
*
|
|
4
|
+
* Provides signal generation utilities and test data factories
|
|
5
|
+
* for the Recommendation Learning Loop integration tests.
|
|
6
|
+
*
|
|
7
|
+
* @see packages/core/src/learning/interfaces.ts
|
|
8
|
+
* @see packages/core/src/learning/types.ts
|
|
9
|
+
*/
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
import { SignalType, DismissReason, SkillCategory, } from '../../../src/learning/types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Generate a single signal event with sensible defaults
|
|
14
|
+
*/
|
|
15
|
+
export function generateSignal(options = {}) {
|
|
16
|
+
const type = options.type ?? SignalType.ACCEPT;
|
|
17
|
+
const skillId = options.skillId ?? `skill-${randomUUID().slice(0, 8)}`;
|
|
18
|
+
const timestamp = options.timestamp ?? Date.now();
|
|
19
|
+
const context = {
|
|
20
|
+
installed_skills: options.installedSkills ?? [],
|
|
21
|
+
original_score: options.originalScore ?? Math.random(),
|
|
22
|
+
category: options.category,
|
|
23
|
+
trust_tier: options.trustTier,
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
id: randomUUID(),
|
|
27
|
+
type,
|
|
28
|
+
skill_id: skillId,
|
|
29
|
+
timestamp,
|
|
30
|
+
context,
|
|
31
|
+
metadata: options.metadata,
|
|
32
|
+
dismiss_reason: options.dismissReason,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate multiple signal events in a batch
|
|
37
|
+
*/
|
|
38
|
+
export function generateSignalBatch(count, options = {}) {
|
|
39
|
+
const signals = [];
|
|
40
|
+
const baseTimestamp = options.timestamp ?? Date.now();
|
|
41
|
+
for (let i = 0; i < count; i++) {
|
|
42
|
+
signals.push(generateSignal({
|
|
43
|
+
...options,
|
|
44
|
+
timestamp: baseTimestamp - i * 1000, // 1 second apart
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
return signals;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate a sequence of signals simulating realistic user behavior
|
|
51
|
+
* Returns signals in chronological order
|
|
52
|
+
*/
|
|
53
|
+
export function generateUserJourney(skillId, outcome, category) {
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
const signals = [];
|
|
56
|
+
// Day 0: Skill recommended and accepted
|
|
57
|
+
signals.push(generateSignal({
|
|
58
|
+
type: SignalType.ACCEPT,
|
|
59
|
+
skillId,
|
|
60
|
+
category,
|
|
61
|
+
trustTier: 'community',
|
|
62
|
+
originalScore: 0.85,
|
|
63
|
+
timestamp: now - 30 * 24 * 60 * 60 * 1000, // 30 days ago
|
|
64
|
+
}));
|
|
65
|
+
switch (outcome) {
|
|
66
|
+
case 'successful':
|
|
67
|
+
// Day 1: First usage
|
|
68
|
+
signals.push(generateSignal({
|
|
69
|
+
type: SignalType.USAGE_DAILY,
|
|
70
|
+
skillId,
|
|
71
|
+
category,
|
|
72
|
+
timestamp: now - 29 * 24 * 60 * 60 * 1000,
|
|
73
|
+
}));
|
|
74
|
+
// Week 1-4: Regular usage
|
|
75
|
+
for (let week = 1; week <= 4; week++) {
|
|
76
|
+
signals.push(generateSignal({
|
|
77
|
+
type: SignalType.USAGE_WEEKLY,
|
|
78
|
+
skillId,
|
|
79
|
+
category,
|
|
80
|
+
timestamp: now - (30 - week * 7) * 24 * 60 * 60 * 1000,
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case 'abandoned':
|
|
85
|
+
// No usage signals - skill was installed but never used
|
|
86
|
+
// Day 30: Marked as abandoned
|
|
87
|
+
signals.push(generateSignal({
|
|
88
|
+
type: SignalType.ABANDONED,
|
|
89
|
+
skillId,
|
|
90
|
+
category,
|
|
91
|
+
timestamp: now,
|
|
92
|
+
metadata: { extra: { days_since_install: 30 } },
|
|
93
|
+
}));
|
|
94
|
+
break;
|
|
95
|
+
case 'uninstalled':
|
|
96
|
+
// Day 1: Brief usage
|
|
97
|
+
signals.push(generateSignal({
|
|
98
|
+
type: SignalType.USAGE_DAILY,
|
|
99
|
+
skillId,
|
|
100
|
+
category,
|
|
101
|
+
timestamp: now - 29 * 24 * 60 * 60 * 1000,
|
|
102
|
+
}));
|
|
103
|
+
// Day 15: Uninstalled
|
|
104
|
+
signals.push(generateSignal({
|
|
105
|
+
type: SignalType.UNINSTALL,
|
|
106
|
+
skillId,
|
|
107
|
+
category,
|
|
108
|
+
timestamp: now - 15 * 24 * 60 * 60 * 1000,
|
|
109
|
+
metadata: { extra: { days_since_install: 15 } },
|
|
110
|
+
}));
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
// Sort by timestamp ascending (chronological)
|
|
114
|
+
return signals.sort((a, b) => a.timestamp - b.timestamp);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate signals representing a mix of user interactions across categories
|
|
118
|
+
*/
|
|
119
|
+
export function generateMixedCategorySignals(signalsPerCategory) {
|
|
120
|
+
const result = new Map();
|
|
121
|
+
const categories = Object.values(SkillCategory);
|
|
122
|
+
for (const category of categories) {
|
|
123
|
+
const signals = [];
|
|
124
|
+
const now = Date.now();
|
|
125
|
+
for (let i = 0; i < signalsPerCategory; i++) {
|
|
126
|
+
// Mix of signal types: 60% accept, 20% dismiss, 20% usage
|
|
127
|
+
const rand = Math.random();
|
|
128
|
+
let type;
|
|
129
|
+
if (rand < 0.6) {
|
|
130
|
+
type = SignalType.ACCEPT;
|
|
131
|
+
}
|
|
132
|
+
else if (rand < 0.8) {
|
|
133
|
+
type = SignalType.DISMISS;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
type = Math.random() < 0.5 ? SignalType.USAGE_DAILY : SignalType.USAGE_WEEKLY;
|
|
137
|
+
}
|
|
138
|
+
signals.push(generateSignal({
|
|
139
|
+
type,
|
|
140
|
+
category,
|
|
141
|
+
skillId: `${category}-skill-${i}`,
|
|
142
|
+
timestamp: now - i * 60 * 60 * 1000, // 1 hour apart
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
result.set(category, signals);
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Generate dismiss signals with various reasons
|
|
151
|
+
*/
|
|
152
|
+
export function generateDismissSignals(count, category) {
|
|
153
|
+
const reasons = Object.values(DismissReason);
|
|
154
|
+
const signals = [];
|
|
155
|
+
const now = Date.now();
|
|
156
|
+
for (let i = 0; i < count; i++) {
|
|
157
|
+
const reason = reasons[i % reasons.length];
|
|
158
|
+
signals.push(generateSignal({
|
|
159
|
+
type: SignalType.DISMISS,
|
|
160
|
+
category,
|
|
161
|
+
skillId: `dismissed-skill-${i}`,
|
|
162
|
+
dismissReason: reason,
|
|
163
|
+
timestamp: now - i * 1000,
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
return signals;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Create a timestamp offset by a number of days from now.
|
|
170
|
+
* Returns a Unix timestamp (milliseconds) representing a point in the past.
|
|
171
|
+
*
|
|
172
|
+
* @param days - Number of days in the past (must be non-negative)
|
|
173
|
+
* @returns Unix timestamp in milliseconds
|
|
174
|
+
* @throws {RangeError} If days is negative
|
|
175
|
+
* @example
|
|
176
|
+
* const thirtyDaysAgo = daysAgo(30) // timestamp 30 days before now
|
|
177
|
+
*/
|
|
178
|
+
export function daysAgo(days) {
|
|
179
|
+
if (days < 0) {
|
|
180
|
+
throw new RangeError(`daysAgo() requires a non-negative value, got ${days}`);
|
|
181
|
+
}
|
|
182
|
+
return Date.now() - days * 24 * 60 * 60 * 1000;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a timestamp offset by a number of hours from now.
|
|
186
|
+
* Returns a Unix timestamp (milliseconds) representing a point in the past.
|
|
187
|
+
*
|
|
188
|
+
* @param hours - Number of hours in the past (must be non-negative)
|
|
189
|
+
* @returns Unix timestamp in milliseconds
|
|
190
|
+
* @throws {RangeError} If hours is negative
|
|
191
|
+
* @example
|
|
192
|
+
* const twoHoursAgo = hoursAgo(2) // timestamp 2 hours before now
|
|
193
|
+
*/
|
|
194
|
+
export function hoursAgo(hours) {
|
|
195
|
+
if (hours < 0) {
|
|
196
|
+
throw new RangeError(`hoursAgo() requires a non-negative value, got ${hours}`);
|
|
197
|
+
}
|
|
198
|
+
return Date.now() - hours * 60 * 60 * 1000;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create a timestamp offset by a number of minutes from now.
|
|
202
|
+
* Returns a Unix timestamp (milliseconds) representing a point in the past.
|
|
203
|
+
*
|
|
204
|
+
* @param minutes - Number of minutes in the past (must be non-negative)
|
|
205
|
+
* @returns Unix timestamp in milliseconds
|
|
206
|
+
* @throws {RangeError} If minutes is negative
|
|
207
|
+
* @example
|
|
208
|
+
* const fiveMinutesAgo = minutesAgo(5) // timestamp 5 minutes before now
|
|
209
|
+
*/
|
|
210
|
+
export function minutesAgo(minutes) {
|
|
211
|
+
if (minutes < 0) {
|
|
212
|
+
throw new RangeError(`minutesAgo() requires a non-negative value, got ${minutes}`);
|
|
213
|
+
}
|
|
214
|
+
return Date.now() - minutes * 60 * 1000;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Generate a recommendation context for testing
|
|
218
|
+
*/
|
|
219
|
+
export function generateContext(options = {}) {
|
|
220
|
+
return {
|
|
221
|
+
installed_skills: options.installedSkills ?? ['existing-skill-1', 'existing-skill-2'],
|
|
222
|
+
original_score: options.originalScore ?? 0.75,
|
|
223
|
+
category: options.category,
|
|
224
|
+
trust_tier: options.trustTier ?? 'community',
|
|
225
|
+
project_context: options.projectContext,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Generate metadata for signal events
|
|
230
|
+
*/
|
|
231
|
+
export function generateMetadata(options = {}) {
|
|
232
|
+
return {
|
|
233
|
+
time_to_action: options.timeToAction ?? Math.floor(Math.random() * 10000) + 1000,
|
|
234
|
+
suggestion_count: options.suggestionCount ?? Math.floor(Math.random() * 5) + 1,
|
|
235
|
+
extra: options.extra,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Generate test skill data for personalization testing
|
|
240
|
+
*/
|
|
241
|
+
export function generateSkillData(id, options = {}) {
|
|
242
|
+
return {
|
|
243
|
+
id,
|
|
244
|
+
category: options.category ?? SkillCategory.TESTING,
|
|
245
|
+
trustTier: options.trustTier ?? 'community',
|
|
246
|
+
keywords: options.keywords ?? ['test', 'helper'],
|
|
247
|
+
triggerPhrases: options.triggerPhrases ?? ['run tests', 'test this'],
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Generate a set of skills with varied categories for recommendation testing
|
|
252
|
+
*/
|
|
253
|
+
export function generateSkillSet(count) {
|
|
254
|
+
const categories = Object.values(SkillCategory);
|
|
255
|
+
const trustTiers = ['verified', 'community', 'experimental', 'unknown'];
|
|
256
|
+
const skills = [];
|
|
257
|
+
for (let i = 0; i < count; i++) {
|
|
258
|
+
skills.push({
|
|
259
|
+
skill_id: `skill-${i}`,
|
|
260
|
+
base_score: 0.5 + Math.random() * 0.5, // 0.5 to 1.0
|
|
261
|
+
skill_data: {
|
|
262
|
+
category: categories[i % categories.length],
|
|
263
|
+
trustTier: trustTiers[i % trustTiers.length],
|
|
264
|
+
keywords: [`keyword-${i}`, 'common'],
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return skills;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Assert that signals are in chronological order
|
|
272
|
+
*/
|
|
273
|
+
export function assertChronological(signals) {
|
|
274
|
+
for (let i = 1; i < signals.length; i++) {
|
|
275
|
+
if (signals[i].timestamp < signals[i - 1].timestamp) {
|
|
276
|
+
throw new Error(`Signals not in chronological order at index ${i}: ` +
|
|
277
|
+
`${signals[i - 1].timestamp} > ${signals[i].timestamp}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Wait for a specified number of milliseconds
|
|
283
|
+
*/
|
|
284
|
+
export function delay(ms) {
|
|
285
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../tests/integration/neural/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Personalization Engine Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the IPersonalizationEngine interface for applying learned
|
|
5
|
+
* preferences to recommendation results in the Recommendation Learning Loop.
|
|
6
|
+
*
|
|
7
|
+
* Test Cases:
|
|
8
|
+
* 1. shouldPersonalize() returns false with <5 signals
|
|
9
|
+
* 2. shouldPersonalize() returns true with 5+ signals
|
|
10
|
+
* 3. personalizeRecommendations() re-ranks by learned scores
|
|
11
|
+
* 4. Category weight boosts preferred categories
|
|
12
|
+
* 5. Dismiss patterns reduce scores for related skills
|
|
13
|
+
* 6. Uninstall patterns have strongest negative effect
|
|
14
|
+
* 7. Score breakdown shows contributing factors
|
|
15
|
+
* 8. Personalization disabled by user preference
|
|
16
|
+
*
|
|
17
|
+
* @see packages/core/src/learning/interfaces.ts
|
|
18
|
+
* @see docs/execution/phase5-testing-execution.md
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=personalization.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personalization.test.d.ts","sourceRoot":"","sources":["../../../../tests/integration/neural/personalization.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|