@happyvertical/smrt-fields 0.40.60 → 0.40.62
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/AGENTS.md +58 -12
- package/README.md +143 -42
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/cache.d.ts +18 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/chunks/FieldPolicyCollection--RxukfCX.js +1218 -0
- package/dist/chunks/FieldPolicyCollection--RxukfCX.js.map +1 -0
- package/dist/collections/FieldPolicyCollection.d.ts +95 -0
- package/dist/collections/FieldPolicyCollection.d.ts.map +1 -0
- package/dist/collections/FieldPolicySuggestionCollection.d.ts +160 -0
- package/dist/collections/FieldPolicySuggestionCollection.d.ts.map +1 -0
- package/dist/collections/FieldUsageCounterCollection.d.ts +143 -0
- package/dist/collections/FieldUsageCounterCollection.d.ts.map +1 -0
- package/dist/deterministic-id.d.ts +18 -0
- package/dist/deterministic-id.d.ts.map +1 -0
- package/dist/field-definitions.d.ts +85 -0
- package/dist/field-definitions.d.ts.map +1 -0
- package/dist/field-policy-resolver.d.ts +46 -0
- package/dist/field-policy-resolver.d.ts.map +1 -0
- package/dist/index.d.ts +15 -532
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1813 -628
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1487 -191
- package/dist/models/FieldPolicy.d.ts +163 -0
- package/dist/models/FieldPolicy.d.ts.map +1 -0
- package/dist/models/FieldPolicySuggestion.d.ts +132 -0
- package/dist/models/FieldPolicySuggestion.d.ts.map +1 -0
- package/dist/models/FieldUsageCounter.d.ts +178 -0
- package/dist/models/FieldUsageCounter.d.ts.map +1 -0
- package/dist/models/FieldUsageReportReceipt.d.ts +25 -0
- package/dist/models/FieldUsageReportReceipt.d.ts.map +1 -0
- package/dist/permissions.d.ts +9 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +39 -0
- package/dist/playground.js.map +1 -0
- package/dist/settings-catalog.d.ts +73 -0
- package/dist/settings-catalog.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +449 -9
- package/dist/svelte/__tests__/FieldPolicyControlPanel.test.js +277 -0
- package/dist/svelte/__tests__/FieldPolicyGear.test.js +503 -0
- package/dist/svelte/__tests__/FormHelp.test.js +138 -0
- package/dist/svelte/__tests__/ModeUX.test.js +109 -0
- package/dist/svelte/__tests__/ObjectForm.test.js +687 -0
- package/dist/svelte/__tests__/ObjectFormGeneratedApi.integration.test.js +436 -0
- package/dist/svelte/__tests__/PolicyField.test.js +373 -0
- package/dist/svelte/__tests__/UsageLearning.test.js +140 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte +30 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte.d.ts +9 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte +33 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte +19 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte +18 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte.d.ts +11 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte +11 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte.d.ts +19 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte +18 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte.d.ts +8 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte +24 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte +37 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts +15 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte +17 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte +25 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte +34 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte +29 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte.d.ts +11 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte +33 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte.d.ts +9 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte +40 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte.d.ts +8 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte +26 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte +39 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte.d.ts +17 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte +15 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte.d.ts +5 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte +29 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte +24 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte +28 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte +23 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte +14 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte.d.ts +19 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte +25 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/settings-catalog.test.js +161 -0
- package/dist/svelte/components/AdvancedFields.svelte +49 -0
- package/dist/svelte/components/AdvancedFields.svelte.d.ts +17 -0
- package/dist/svelte/components/AdvancedFields.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldInput.svelte +159 -0
- package/dist/svelte/components/FieldInput.svelte.d.ts +5 -0
- package/dist/svelte/components/FieldInput.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte +288 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts +29 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte +417 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte.d.ts +18 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte +24 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte.d.ts +8 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte +169 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts +20 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte +89 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte.d.ts +35 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte +135 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts +11 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FormHelp.svelte +157 -0
- package/dist/svelte/components/FormHelp.svelte.d.ts +15 -0
- package/dist/svelte/components/FormHelp.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ModeSwitch.svelte +47 -0
- package/dist/svelte/components/ModeSwitch.svelte.d.ts +10 -0
- package/dist/svelte/components/ModeSwitch.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ObjectForm.svelte +440 -0
- package/dist/svelte/components/ObjectForm.svelte.d.ts +50 -0
- package/dist/svelte/components/ObjectForm.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte +18 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte.d.ts +11 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/PolicyField.svelte +338 -0
- package/dist/svelte/components/PolicyField.svelte.d.ts +80 -0
- package/dist/svelte/components/PolicyField.svelte.d.ts.map +1 -0
- package/dist/svelte/context.svelte.d.ts +54 -0
- package/dist/svelte/context.svelte.d.ts.map +1 -0
- package/dist/svelte/context.svelte.js +55 -0
- package/dist/svelte/data-table.d.ts +17 -0
- package/dist/svelte/data-table.d.ts.map +1 -0
- package/dist/svelte/data-table.js +19 -0
- package/dist/svelte/field-policy-editor.d.ts +81 -0
- package/dist/svelte/field-policy-editor.d.ts.map +1 -0
- package/dist/svelte/field-policy-editor.js +120 -0
- package/dist/svelte/gear-context.svelte.d.ts +16 -0
- package/dist/svelte/gear-context.svelte.d.ts.map +1 -0
- package/dist/svelte/gear-context.svelte.js +15 -0
- package/dist/svelte/index.d.ts +63 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +41 -0
- package/dist/svelte/input-registry.d.ts +21 -0
- package/dist/svelte/input-registry.d.ts.map +1 -0
- package/dist/svelte/input-registry.js +26 -0
- package/dist/svelte/object-form-source-context.svelte.d.ts +4 -0
- package/dist/svelte/object-form-source-context.svelte.d.ts.map +1 -0
- package/dist/svelte/object-form-source-context.svelte.js +8 -0
- package/dist/svelte/object-form-source.svelte.d.ts +18 -0
- package/dist/svelte/object-form-source.svelte.d.ts.map +1 -0
- package/dist/svelte/object-form-source.svelte.js +99 -0
- package/dist/svelte/object-form.d.ts +6 -0
- package/dist/svelte/object-form.d.ts.map +1 -0
- package/dist/svelte/object-form.js +38 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte +212 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte +129 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground.d.ts +20 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +38 -0
- package/dist/svelte/settings-catalog.d.ts +54 -0
- package/dist/svelte/settings-catalog.d.ts.map +1 -0
- package/dist/svelte/settings-catalog.js +116 -0
- package/dist/svelte/suggestions.d.ts +38 -0
- package/dist/svelte/suggestions.d.ts.map +1 -0
- package/dist/svelte/suggestions.js +68 -0
- package/dist/svelte/types.d.ts +101 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +4 -0
- package/dist/svelte/usage-capture.d.ts +63 -0
- package/dist/svelte/usage-capture.d.ts.map +1 -0
- package/dist/svelte/usage-capture.js +61 -0
- package/dist/types.d.ts +316 -203
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -1
- package/dist/types.js.map +1 -1
- package/dist/usage-learning.d.ts +201 -0
- package/dist/usage-learning.d.ts.map +1 -0
- package/dist/usage-schedules.d.ts +110 -0
- package/dist/usage-schedules.d.ts.map +1 -0
- package/dist/users-module.d.ts +30 -0
- package/dist/users-module.d.ts.map +1 -0
- package/package.json +33 -8
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { SmrtObject, SmrtObjectOptions } from '@happyvertical/smrt-core';
|
|
2
|
+
import { DatabaseInterface } from '@happyvertical/sql';
|
|
3
|
+
import { FieldPolicySuggestionKind } from './types.js';
|
|
4
|
+
export interface FieldUsageMaintenanceConfig {
|
|
5
|
+
/** Drop counter buckets older than this (by `period`). Default 90 days. */
|
|
6
|
+
counterMaxAgeMs: number;
|
|
7
|
+
/** Keep at most this many counter rows (oldest pruned first). Default 100k. */
|
|
8
|
+
counterMaxRows: number;
|
|
9
|
+
/** Drop ACCEPTED suggestions decided longer ago than this. Default 180 days. */
|
|
10
|
+
suggestionAcceptedMaxAgeMs: number;
|
|
11
|
+
}
|
|
12
|
+
export declare const FIELD_USAGE_MAINTENANCE_DEFAULTS: FieldUsageMaintenanceConfig;
|
|
13
|
+
export interface FieldUsageSuggestionConfig {
|
|
14
|
+
/** Usage window the thresholds evaluate over. Default 30 days. */
|
|
15
|
+
windowDays: number;
|
|
16
|
+
/** Distinct users required for a `promote` suggestion. Default 5. */
|
|
17
|
+
minDistinctUsers: number;
|
|
18
|
+
/** Submissions required before a `default` suggestion. Default 10. */
|
|
19
|
+
minSetCount: number;
|
|
20
|
+
/**
|
|
21
|
+
* Share of windowed submissions a single value must reach for a `default`
|
|
22
|
+
* suggestion (denominator is TOTAL setCount, so histogram overflow can only
|
|
23
|
+
* make this more conservative). Default 0.8.
|
|
24
|
+
*/
|
|
25
|
+
defaultDominanceRatio: number;
|
|
26
|
+
}
|
|
27
|
+
export declare const FIELD_USAGE_SUGGESTION_DEFAULTS: FieldUsageSuggestionConfig;
|
|
28
|
+
export interface FieldUsageMaintenanceSummary {
|
|
29
|
+
countersPruned: number;
|
|
30
|
+
receiptsPruned: number;
|
|
31
|
+
suggestionsPruned: number;
|
|
32
|
+
}
|
|
33
|
+
export interface FieldUsageSuggestionRunSummary {
|
|
34
|
+
/**
|
|
35
|
+
* Suggestions this run wrote. Under overlapping runs both may report a
|
|
36
|
+
* create for the same candidate while the model's active-slot unique index
|
|
37
|
+
* converges them onto ONE row (see `FieldPolicySuggestion.activeKey`) — the
|
|
38
|
+
* tally is per-run work, not a row count.
|
|
39
|
+
*/
|
|
40
|
+
created: number;
|
|
41
|
+
/** Candidates suppressed by a pending or cooling-down suggestion. */
|
|
42
|
+
suppressed: number;
|
|
43
|
+
/** Distinct (tenant, objectRef, fieldName) groups evaluated. */
|
|
44
|
+
groupsConsidered: number;
|
|
45
|
+
/**
|
|
46
|
+
* Groups whose evaluation threw and was skipped. A failing group never
|
|
47
|
+
* aborts the run — a global pass must keep serving every other tenant.
|
|
48
|
+
*/
|
|
49
|
+
groupsFailed: number;
|
|
50
|
+
/**
|
|
51
|
+
* Bounded sample of failure messages (`MAX_REPORTED_GROUP_FAILURES`) so an
|
|
52
|
+
* operator can see WHY without the summary growing with the queue.
|
|
53
|
+
*/
|
|
54
|
+
failures: string[];
|
|
55
|
+
}
|
|
56
|
+
/** Cap on {@link FieldUsageSuggestionRunSummary.failures} entries. */
|
|
57
|
+
export declare const MAX_REPORTED_GROUP_FAILURES = 5;
|
|
58
|
+
export interface FieldUsageCounterRetention {
|
|
59
|
+
maxAgeMs?: number;
|
|
60
|
+
maxRows?: number;
|
|
61
|
+
/** Restrict pruning to one tenant (ambient-context runs). */
|
|
62
|
+
tenantId?: string | null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Prune counter rows to bound growth. Applies whichever bounds are provided
|
|
66
|
+
* (at least one required): `maxAgeMs` drops buckets whose `period` day is
|
|
67
|
+
* older than the cutoff; `maxRows` keeps only the newest N rows by
|
|
68
|
+
* `(period, id)`, deleting oldest-first. Mirrors core's `pruneChangeFeed`.
|
|
69
|
+
*/
|
|
70
|
+
export declare function pruneFieldUsageCounters(db: DatabaseInterface, retention: FieldUsageCounterRetention): Promise<{
|
|
71
|
+
pruned: number;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Drop durable anti-inflation receipts at the same age cutoff as counters.
|
|
75
|
+
*
|
|
76
|
+
* Deliberately do NOT delete a receipt merely because its counter row is
|
|
77
|
+
* absent: report ingestion claims its receipt before merging the counter, so
|
|
78
|
+
* an orphan sweep could otherwise reopen the once-per-user/day quota during
|
|
79
|
+
* that in-flight interval. A max-row counter trim likewise leaves its recent
|
|
80
|
+
* receipts until the age cutoff — retaining a de-duplication guard is safer
|
|
81
|
+
* than allowing a second contribution for that day.
|
|
82
|
+
*/
|
|
83
|
+
export declare function pruneFieldUsageReportReceipts(db: DatabaseInterface, options: {
|
|
84
|
+
maxAgeMs: number;
|
|
85
|
+
tenantId?: string | null;
|
|
86
|
+
}): Promise<{
|
|
87
|
+
pruned: number;
|
|
88
|
+
}>;
|
|
89
|
+
export interface FieldPolicySuggestionRetention {
|
|
90
|
+
/** Drop ACCEPTED suggestions decided longer ago than this. */
|
|
91
|
+
acceptedMaxAgeMs: number;
|
|
92
|
+
/** Restrict pruning to one tenant (ambient-context runs). */
|
|
93
|
+
tenantId?: string | null;
|
|
94
|
+
/** Clock override for deterministic tests. */
|
|
95
|
+
now?: Date;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Prune settled suggestion rows ONLY (#2051 pin): a dismissed suggestion once
|
|
99
|
+
* its cool-down has fully elapsed (its suppression job is done), and an
|
|
100
|
+
* accepted suggestion once it is old. Pending suggestions are NEVER pruned.
|
|
101
|
+
*/
|
|
102
|
+
export declare function pruneFieldPolicySuggestions(db: DatabaseInterface, retention: FieldPolicySuggestionRetention): Promise<{
|
|
103
|
+
pruned: number;
|
|
104
|
+
}>;
|
|
105
|
+
export interface RunFieldUsageMaintenanceOptions extends Partial<FieldUsageMaintenanceConfig> {
|
|
106
|
+
db: DatabaseInterface;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The "aggregation" schedule's work. Ingestion pre-aggregates into period
|
|
110
|
+
* buckets, so the roll-up job's real job is retention: prune counter buckets
|
|
111
|
+
* and durable receipts at the shared age cutoff, then settle old suggestion
|
|
112
|
+
* rows. Max-row trimming leaves recent receipts intact to preserve daily
|
|
113
|
+
* de-duplication while an ingestion merge is in flight.
|
|
114
|
+
*/
|
|
115
|
+
export declare function runFieldUsageMaintenance(options: RunFieldUsageMaintenanceOptions): Promise<FieldUsageMaintenanceSummary>;
|
|
116
|
+
export interface RunFieldPolicySuggestionGenerationOptions extends Partial<FieldUsageSuggestionConfig> {
|
|
117
|
+
db: DatabaseInterface;
|
|
118
|
+
/** Clock override for deterministic tests. */
|
|
119
|
+
now?: Date;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The threshold job: evaluate windowed counters per
|
|
123
|
+
* `(tenantId, objectRef, fieldName)` and create PENDING suggestions with
|
|
124
|
+
* human-readable evidence.
|
|
125
|
+
*
|
|
126
|
+
* - `promote`: at least `minDistinctUsers` distinct users set the field to a
|
|
127
|
+
* non-default value in the window AND the org-resolved visibility is not
|
|
128
|
+
* already `basic`.
|
|
129
|
+
* - `default`: at least `minSetCount` TOTAL submissions, a single recorded
|
|
130
|
+
* value covers `defaultDominanceRatio` of those TOTAL submissions (not of
|
|
131
|
+
* the deviations — see `FieldUsageCounter.submissionCount`), and it differs
|
|
132
|
+
* from the org-resolved default. Only histogram-eligible fields
|
|
133
|
+
* (low-cardinality, non-sensitive, non-gated) can ever qualify, and a group
|
|
134
|
+
* containing a legacy bucket with no recorded total is skipped rather than
|
|
135
|
+
* ratioed against the wrong denominator.
|
|
136
|
+
*
|
|
137
|
+
* Dedup: a candidate is suppressed while the same
|
|
138
|
+
* `(tenantId, objectRef, fieldName, kind)` has a PENDING suggestion or a
|
|
139
|
+
* DISMISSED one still inside its cool-down. Accepted history never blocks —
|
|
140
|
+
* once accepted, the resolved policy itself stops regeneration (visibility is
|
|
141
|
+
* basic / the default matches). The pre-check is an optimization only: the
|
|
142
|
+
* single-active guarantee is STRUCTURAL (`FieldPolicySuggestion.activeKey` in
|
|
143
|
+
* `conflictColumns`), so overlapping runs upsert onto one row instead of
|
|
144
|
+
* duplicating.
|
|
145
|
+
*
|
|
146
|
+
* Sensitive, read-permission-gated, and transient fields are skipped
|
|
147
|
+
* entirely: their usage rows are count-only observability data and never
|
|
148
|
+
* produce suggestions.
|
|
149
|
+
*/
|
|
150
|
+
export declare function runFieldPolicySuggestionGeneration(options: RunFieldPolicySuggestionGenerationOptions): Promise<FieldUsageSuggestionRunSummary>;
|
|
151
|
+
/**
|
|
152
|
+
* The registered schedule target for the #2051 learning loop (see the module
|
|
153
|
+
* doc for why it is NOT an smrt-agents `Agent` subclass). Rows of its system
|
|
154
|
+
* table are never written — the class exists so `AgentSchedule.agentType`
|
|
155
|
+
* resolves through the `ObjectRegistry` and smrt-jobs can construct it and
|
|
156
|
+
* invoke the two allowlisted methods.
|
|
157
|
+
*/
|
|
158
|
+
export declare class FieldUsageLearningAgent extends SmrtObject {
|
|
159
|
+
/**
|
|
160
|
+
* The smrt-jobs opt-in background allowlist (S5 contract): ONLY these two
|
|
161
|
+
* methods are reachable from a persisted job/schedule row.
|
|
162
|
+
*/
|
|
163
|
+
static backgroundEligibleMethods: ReadonlyArray<string>;
|
|
164
|
+
constructor(options?: SmrtObjectOptions);
|
|
165
|
+
/** Schedule entry point for {@link runFieldUsageMaintenance}. */
|
|
166
|
+
runUsageMaintenance(args?: Record<string, unknown>): Promise<FieldUsageMaintenanceSummary>;
|
|
167
|
+
/** Schedule entry point for {@link runFieldPolicySuggestionGeneration}. */
|
|
168
|
+
runSuggestionGeneration(args?: Record<string, unknown>): Promise<FieldUsageSuggestionRunSummary>;
|
|
169
|
+
}
|
|
170
|
+
export interface FieldUsageEvidenceInput {
|
|
171
|
+
kind: FieldPolicySuggestionKind;
|
|
172
|
+
objectRef: string;
|
|
173
|
+
fieldName: string;
|
|
174
|
+
windowStart: string;
|
|
175
|
+
windowEnd: string;
|
|
176
|
+
distinctUsers: number;
|
|
177
|
+
/** True when the distinct-user set overflowed (count is a lower bound). */
|
|
178
|
+
distinctUsersAtLeast: boolean;
|
|
179
|
+
/** Submissions that DIFFERED from the resolved default. */
|
|
180
|
+
setCount: number;
|
|
181
|
+
/**
|
|
182
|
+
* TOTAL submissions observed in the window (the dominance denominator).
|
|
183
|
+
* `undefined` only for legacy buckets that never recorded a total, in which
|
|
184
|
+
* case the summary states the deviation count alone.
|
|
185
|
+
*/
|
|
186
|
+
submissionCount?: number;
|
|
187
|
+
/** The threshold the candidate cleared (documented in the evidence). */
|
|
188
|
+
threshold: number;
|
|
189
|
+
topValue?: unknown;
|
|
190
|
+
topValueShare?: number;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Human-readable evidence for a suggestion: a `summary` sentence a reviewer
|
|
194
|
+
* can read as-is, plus the structured numbers behind it.
|
|
195
|
+
*
|
|
196
|
+
* The sentence always states BOTH numbers when known — deviations and total
|
|
197
|
+
* submissions — so a reviewer can see the base rate a dominance percentage was
|
|
198
|
+
* computed against instead of trusting a bare ratio.
|
|
199
|
+
*/
|
|
200
|
+
export declare function buildFieldUsageEvidence(input: FieldUsageEvidenceInput): Record<string, unknown>;
|
|
201
|
+
//# sourceMappingURL=usage-learning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-learning.d.ts","sourceRoot":"","sources":["../src/usage-learning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAuB5D,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,YAAY,CAAC;AASpB,MAAM,WAAW,2BAA2B;IAC1C,2EAA2E;IAC3E,eAAe,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,eAAO,MAAM,gCAAgC,EAAE,2BAI9C,CAAC;AAEF,MAAM,WAAW,0BAA0B;IACzC,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,+BAA+B,EAAE,0BAK7C,CAAC;AAEF,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,sEAAsE;AACtE,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAM7C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,0BAA0B,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsD7B;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,iBAAiB,EACrB,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACtD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,8DAA8D;IAC9D,gBAAgB,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,8BAA8B,GACxC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB7B;AAMD,MAAM,WAAW,+BACf,SAAQ,OAAO,CAAC,2BAA2B,CAAC;IAC5C,EAAE,EAAE,iBAAiB,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,4BAA4B,CAAC,CAuBvC;AAED,MAAM,WAAW,yCACf,SAAQ,OAAO,CAAC,0BAA0B,CAAC;IAC3C,EAAE,EAAE,iBAAiB,CAAC;IACtB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,kCAAkC,CACtD,OAAO,EAAE,yCAAyC,GACjD,OAAO,CAAC,8BAA8B,CAAC,CA+LzC;AAMD;;;;;;GAMG;AACH,qBAMa,uBAAwB,SAAQ,UAAU;IACrD;;;OAGG;IACH,MAAM,CAAC,yBAAyB,EAAE,aAAa,CAAC,MAAM,CAAC,CAGrD;gBAEU,OAAO,GAAE,iBAAsB;IAI3C,iEAAiE;IAC3D,mBAAmB,CACvB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,4BAA4B,CAAC;IAWxC,2EAA2E;IACrE,uBAAuB,CAC3B,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,8BAA8B,CAAC;CAW3C;AAMD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,yBAAyB,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,uBAAuB,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuCzB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import { FieldUsageMaintenanceConfig, FieldUsageSuggestionConfig } from './usage-learning.js';
|
|
3
|
+
/** Registry-qualified schedule target (`AgentSchedule.agentType`). */
|
|
4
|
+
export declare const FIELD_USAGE_LEARNING_AGENT_TYPE = "@happyvertical/smrt-fields:FieldUsageLearningAgent";
|
|
5
|
+
/** Method the aggregation/retention schedule invokes. */
|
|
6
|
+
export declare const FIELD_USAGE_MAINTENANCE_METHOD = "runUsageMaintenance";
|
|
7
|
+
/** Method the suggestion-generation schedule invokes. */
|
|
8
|
+
export declare const FIELD_USAGE_SUGGESTION_METHOD = "runSuggestionGeneration";
|
|
9
|
+
/**
|
|
10
|
+
* Default cadence for counter maintenance: daily at 02:30 — in the SCHEDULER
|
|
11
|
+
* HOST'S LOCAL TIME. See {@link ensureFieldUsageLearningSchedules} for why no
|
|
12
|
+
* timezone can be selected here.
|
|
13
|
+
*/
|
|
14
|
+
export declare const DEFAULT_FIELD_USAGE_MAINTENANCE_CRON = "30 2 * * *";
|
|
15
|
+
/** Default cadence for suggestion generation: weekly, Monday 03:00 host-local. */
|
|
16
|
+
export declare const DEFAULT_FIELD_USAGE_SUGGESTION_CRON = "0 3 * * 1";
|
|
17
|
+
/**
|
|
18
|
+
* Stable id for a global learning schedule, derived from the agent type and
|
|
19
|
+
* method (the `TenantUsageMetric.recordUsage` precedent).
|
|
20
|
+
*
|
|
21
|
+
* `_smrt_agent_schedules` has no natural-key uniqueness on
|
|
22
|
+
* `(agent_type, method)`, so a check-then-create would let two replicas
|
|
23
|
+
* starting against an empty database each insert their own random-id row —
|
|
24
|
+
* and with `enabled: true` every job would then run twice. A deterministic id
|
|
25
|
+
* makes the insert converge on ONE primary key instead.
|
|
26
|
+
*/
|
|
27
|
+
export declare function fieldUsageScheduleId(method: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Structural surface of the agents module the installer consumes (no static
|
|
30
|
+
* import — mirrors `FieldPolicyUsersModule`). `create`/`list`/`save` are the
|
|
31
|
+
* standard SmrtCollection/SmrtObject shapes.
|
|
32
|
+
*/
|
|
33
|
+
export interface FieldUsageAgentsScheduleRow {
|
|
34
|
+
id?: string | null;
|
|
35
|
+
enabled?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Owning tenant; `null`/absent marks the GLOBAL schedules this installer
|
|
38
|
+
* manages. Read so the existence check cannot mistake a tenant-specific
|
|
39
|
+
* schedule for the global one.
|
|
40
|
+
*/
|
|
41
|
+
tenantId?: string | null;
|
|
42
|
+
save?: () => Promise<unknown>;
|
|
43
|
+
}
|
|
44
|
+
export interface FieldUsageAgentsModule {
|
|
45
|
+
AgentScheduleCollection: {
|
|
46
|
+
create(options: {
|
|
47
|
+
db: DatabaseInterface;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
list(options: {
|
|
50
|
+
where: Record<string, unknown>;
|
|
51
|
+
}): Promise<FieldUsageAgentsScheduleRow[]>;
|
|
52
|
+
create(data: Record<string, unknown>): Promise<FieldUsageAgentsScheduleRow>;
|
|
53
|
+
}>;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export interface EnsureFieldUsageLearningSchedulesOptions {
|
|
57
|
+
db: DatabaseInterface;
|
|
58
|
+
/**
|
|
59
|
+
* Whether the schedules start enabled. DEFAULT FALSE — the learning loop
|
|
60
|
+
* ships dormant; enabling it is an explicit deployment opt-in.
|
|
61
|
+
*/
|
|
62
|
+
enabled?: boolean;
|
|
63
|
+
maintenanceCron?: string;
|
|
64
|
+
suggestionCron?: string;
|
|
65
|
+
/** Threshold/retention overrides persisted into the schedules' methodArgs. */
|
|
66
|
+
maintenanceArgs?: Partial<FieldUsageMaintenanceConfig>;
|
|
67
|
+
suggestionArgs?: Partial<FieldUsageSuggestionConfig>;
|
|
68
|
+
/** Injection seam for tests / hosts that already loaded the agents module. */
|
|
69
|
+
agentsModule?: FieldUsageAgentsModule;
|
|
70
|
+
}
|
|
71
|
+
export interface EnsureFieldUsageLearningSchedulesResult {
|
|
72
|
+
/** False when `@happyvertical/smrt-agents` is not installed (no-op). */
|
|
73
|
+
installed: boolean;
|
|
74
|
+
/** Schedules created by THIS call (existing rows are left untouched). */
|
|
75
|
+
created: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Idempotently create the two GLOBAL (tenant-null) `AgentSchedule` rows for
|
|
79
|
+
* the learning loop — the aggregation/retention roll-up and the
|
|
80
|
+
* suggestion-generation job. An existing GLOBAL row for the agent type +
|
|
81
|
+
* method is never modified (operator state like enable/disable is preserved).
|
|
82
|
+
*
|
|
83
|
+
* The existence check is scoped to the GLOBAL rows deliberately: a deployment
|
|
84
|
+
* may also run tenant-specific schedules for the same agent type and method
|
|
85
|
+
* (the ambient-context runs the jobs support), and matching one of those would
|
|
86
|
+
* silently skip installing the global schedule this function promises. Tenant
|
|
87
|
+
* rows are read but never touched.
|
|
88
|
+
*
|
|
89
|
+
* Concurrency: each schedule is written under a DETERMINISTIC id
|
|
90
|
+
* ({@link fieldUsageScheduleId}) with insert-only semantics, so two replicas
|
|
91
|
+
* installing at once converge on one row — the pre-check is only the cheap
|
|
92
|
+
* path, and a primary-key collision is treated as "already installed" rather
|
|
93
|
+
* than an error. Insert-only also means an existing row's operator state
|
|
94
|
+
* (enabled/disabled, edited cron) is never overwritten by a later install.
|
|
95
|
+
*
|
|
96
|
+
* **No timezone option, deliberately.** `AgentSchedule` carries a `timezone`
|
|
97
|
+
* column, but `getNextCronDate(cron, _timezone)` ignores the argument and
|
|
98
|
+
* matches against host-local `getHours()`/`getDate()`, and smrt-jobs'
|
|
99
|
+
* `ScheduleRunner` recalculates with the same host-local parser. Accepting a
|
|
100
|
+
* timezone here would advertise control this stack does not have, so these
|
|
101
|
+
* schedules fire in the SCHEDULER HOST'S LOCAL TIME — pick crons accordingly
|
|
102
|
+
* (see `agents/usage-learning.md`). Fixing the agents-side parser is out of
|
|
103
|
+
* scope for this package.
|
|
104
|
+
*
|
|
105
|
+
* System operation: global schedules are platform state, so a non-bypass
|
|
106
|
+
* ambient tenant context is rejected (fail closed) — call this from trusted
|
|
107
|
+
* startup/migration code.
|
|
108
|
+
*/
|
|
109
|
+
export declare function ensureFieldUsageLearningSchedules(options: EnsureFieldUsageLearningSchedulesOptions): Promise<EnsureFieldUsageLearningSchedulesResult>;
|
|
110
|
+
//# sourceMappingURL=usage-schedules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-schedules.d.ts","sourceRoot":"","sources":["../src/usage-schedules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EACV,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAG7B,sEAAsE;AACtE,eAAO,MAAM,+BAA+B,uDACU,CAAC;AAEvD,yDAAyD;AACzD,eAAO,MAAM,8BAA8B,wBAAwB,CAAC;AAEpE,yDAAyD;AACzD,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,oCAAoC,eAAe,CAAC;AAEjE,kFAAkF;AAClF,eAAO,MAAM,mCAAmC,cAAc,CAAC;AAE/D;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpE;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,uBAAuB,EAAE;QACvB,MAAM,CAAC,OAAO,EAAE;YAAE,EAAE,EAAE,iBAAiB,CAAA;SAAE,GAAG,OAAO,CAAC;YAClD,IAAI,CAAC,OAAO,EAAE;gBACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aAChC,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;YAC3C,MAAM,CACJ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAC;SACzC,CAAC,CAAC;KACJ,CAAC;CACH;AAED,MAAM,WAAW,wCAAwC;IACvD,EAAE,EAAE,iBAAiB,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACrD,8EAA8E;IAC9E,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,uCAAuC;IACtD,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,wCAAwC,GAChD,OAAO,CAAC,uCAAuC,CAAC,CAuGlD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared detection for OPTIONAL workspace dependencies
|
|
3
|
+
* (`@happyvertical/smrt-users`, and since #2051 `@happyvertical/smrt-agents`
|
|
4
|
+
* for the dormant learning schedules).
|
|
5
|
+
*
|
|
6
|
+
* A leaf module (no package-internal imports) so every dynamic-import seam —
|
|
7
|
+
* the resolver's default tenant-hierarchy loader, the permission catalog
|
|
8
|
+
* registration, and the schedule installer — shares one matcher without
|
|
9
|
+
* creating an import cycle through the resolver/collection/model chain.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Whether an import failure means the named workspace package is simply not
|
|
13
|
+
* installed (→ graceful degradation) rather than installed-but-broken
|
|
14
|
+
* (→ rethrow, surfacing the problem instead of silently degrading).
|
|
15
|
+
*
|
|
16
|
+
* The decision is made on the missing-module TARGET parsed from Node's
|
|
17
|
+
* `Cannot find package/module '<specifier>'` message (walking the full
|
|
18
|
+
* `cause` chain): only a target that IS the package (or one of its subpaths)
|
|
19
|
+
* counts. A transitive failure INSIDE an installed package names the other
|
|
20
|
+
* module as the target — with the package path merely appearing as the
|
|
21
|
+
* importer — and therefore rethrows. `importWorkspaceModule`'s own
|
|
22
|
+
* source-fallback wrapper (`Failed to load <packageName> for ...`) is also
|
|
23
|
+
* accepted: it is thrown only when the package itself cannot be located.
|
|
24
|
+
*
|
|
25
|
+
* Exported for direct testing; not re-exported from the package index.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isMissingWorkspaceDependency(error: unknown, packageName: string): boolean;
|
|
28
|
+
/** {@link isMissingWorkspaceDependency} for `@happyvertical/smrt-users`. */
|
|
29
|
+
export declare function isMissingUsersDependency(error: unknown): boolean;
|
|
30
|
+
//# sourceMappingURL=users-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users-module.d.ts","sourceRoot":"","sources":["../src/users-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAoBT;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-fields",
|
|
3
|
-
"version": "0.40.
|
|
3
|
+
"version": "0.40.62",
|
|
4
4
|
"description": "Layered field policy store and resolver (defaults, visibility tiers, help text) for SMRT objects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,22 +15,46 @@
|
|
|
15
15
|
"types": "./dist/index.d.ts",
|
|
16
16
|
"import": "./dist/index.js"
|
|
17
17
|
},
|
|
18
|
+
"./svelte": {
|
|
19
|
+
"types": "./dist/svelte/index.d.ts",
|
|
20
|
+
"svelte": "./dist/svelte/index.js",
|
|
21
|
+
"import": "./dist/svelte/index.js"
|
|
22
|
+
},
|
|
18
23
|
"./manifest": "./dist/manifest.json",
|
|
19
|
-
"./manifest.json": "./dist/manifest.json"
|
|
24
|
+
"./manifest.json": "./dist/manifest.json",
|
|
25
|
+
"./playground": {
|
|
26
|
+
"types": "./dist/playground.d.ts",
|
|
27
|
+
"import": "./dist/playground.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"svelte": "^5.56.4"
|
|
32
|
+
},
|
|
33
|
+
"peerDependenciesMeta": {
|
|
34
|
+
"svelte": {
|
|
35
|
+
"optional": true
|
|
36
|
+
}
|
|
20
37
|
},
|
|
21
38
|
"dependencies": {
|
|
22
39
|
"@happyvertical/sql": "^0.85.5",
|
|
23
|
-
"@happyvertical/smrt-core": "0.40.
|
|
24
|
-
"@happyvertical/smrt-tenancy": "0.40.
|
|
40
|
+
"@happyvertical/smrt-core": "0.40.62",
|
|
41
|
+
"@happyvertical/smrt-tenancy": "0.40.62",
|
|
42
|
+
"@happyvertical/smrt-ui": "0.40.62",
|
|
43
|
+
"@happyvertical/smrt-users": "0.40.62"
|
|
25
44
|
},
|
|
26
45
|
"devDependencies": {
|
|
46
|
+
"@sveltejs/package": "^2.5.8",
|
|
47
|
+
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
48
|
+
"@testing-library/svelte": "^5.4.2",
|
|
27
49
|
"@types/node": "24.13.2",
|
|
50
|
+
"svelte": "^5.56.4",
|
|
51
|
+
"svelte-check": "^4.7.1",
|
|
28
52
|
"typescript": "5.9.3",
|
|
29
53
|
"vite": "8.1.4",
|
|
30
54
|
"vitest": "4.1.10",
|
|
31
|
-
"@happyvertical/smrt-cli": "0.40.
|
|
32
|
-
"@happyvertical/smrt-users": "0.40.
|
|
33
|
-
"@happyvertical/smrt-vitest": "0.40.
|
|
55
|
+
"@happyvertical/smrt-cli": "0.40.62",
|
|
56
|
+
"@happyvertical/smrt-users": "0.40.62",
|
|
57
|
+
"@happyvertical/smrt-vitest": "0.40.62"
|
|
34
58
|
},
|
|
35
59
|
"keywords": [
|
|
36
60
|
"smrt",
|
|
@@ -51,8 +75,9 @@
|
|
|
51
75
|
"directory": "packages/fields"
|
|
52
76
|
},
|
|
53
77
|
"scripts": {
|
|
54
|
-
"build": "vite build --mode library",
|
|
78
|
+
"build": "vite build --mode library && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json",
|
|
55
79
|
"build:watch": "vite build --mode library --watch",
|
|
80
|
+
"check": "svelte-check --tsconfig ./tsconfig.svelte.json",
|
|
56
81
|
"clean": "rm -rf dist",
|
|
57
82
|
"dev": "vite dev",
|
|
58
83
|
"test": "vitest run",
|