@happyvertical/smrt-fields 0.40.61 → 0.40.63

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 (78) hide show
  1. package/AGENTS.md +18 -0
  2. package/README.md +125 -112
  3. package/dist/chunks/FieldPolicyCollection--RxukfCX.js +1218 -0
  4. package/dist/chunks/FieldPolicyCollection--RxukfCX.js.map +1 -0
  5. package/dist/collections/FieldPolicySuggestionCollection.d.ts +160 -0
  6. package/dist/collections/FieldPolicySuggestionCollection.d.ts.map +1 -0
  7. package/dist/collections/FieldUsageCounterCollection.d.ts +143 -0
  8. package/dist/collections/FieldUsageCounterCollection.d.ts.map +1 -0
  9. package/dist/deterministic-id.d.ts +18 -0
  10. package/dist/deterministic-id.d.ts.map +1 -0
  11. package/dist/field-definitions.d.ts +8 -0
  12. package/dist/field-definitions.d.ts.map +1 -1
  13. package/dist/index.d.ts +8 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1565 -1077
  16. package/dist/index.js.map +1 -1
  17. package/dist/manifest.json +1442 -188
  18. package/dist/models/FieldPolicySuggestion.d.ts +132 -0
  19. package/dist/models/FieldPolicySuggestion.d.ts.map +1 -0
  20. package/dist/models/FieldUsageCounter.d.ts +178 -0
  21. package/dist/models/FieldUsageCounter.d.ts.map +1 -0
  22. package/dist/models/FieldUsageReportReceipt.d.ts +25 -0
  23. package/dist/models/FieldUsageReportReceipt.d.ts.map +1 -0
  24. package/dist/smrt-knowledge.json +404 -7
  25. package/dist/svelte/__tests__/FieldPolicyControlPanel.test.js +54 -0
  26. package/dist/svelte/__tests__/FormHelp.test.js +8 -0
  27. package/dist/svelte/__tests__/ObjectForm.test.js +131 -0
  28. package/dist/svelte/__tests__/UsageLearning.test.js +140 -0
  29. package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte +21 -4
  30. package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts +5 -1
  31. package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts.map +1 -1
  32. package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte +23 -0
  33. package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts +10 -0
  34. package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts.map +1 -0
  35. package/dist/svelte/__tests__/playground.test.js +66 -0
  36. package/dist/svelte/components/FieldPolicyControlPanel.svelte +28 -1
  37. package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts +3 -0
  38. package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts.map +1 -1
  39. package/dist/svelte/components/FieldPolicyGearButton.svelte +8 -1
  40. package/dist/svelte/components/FieldPolicyGearButton.svelte.d.ts.map +1 -1
  41. package/dist/svelte/components/FieldPolicyGearProvider.svelte +34 -0
  42. package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts +3 -0
  43. package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts.map +1 -1
  44. package/dist/svelte/components/FieldPolicySuggestionQueue.svelte +135 -0
  45. package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts +11 -0
  46. package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts.map +1 -0
  47. package/dist/svelte/components/FormHelp.svelte +16 -1
  48. package/dist/svelte/components/FormHelp.svelte.d.ts.map +1 -1
  49. package/dist/svelte/components/ObjectForm.svelte +91 -2
  50. package/dist/svelte/components/ObjectForm.svelte.d.ts +11 -1
  51. package/dist/svelte/components/ObjectForm.svelte.d.ts.map +1 -1
  52. package/dist/svelte/context.svelte.d.ts +15 -0
  53. package/dist/svelte/context.svelte.d.ts.map +1 -1
  54. package/dist/svelte/context.svelte.js +15 -0
  55. package/dist/svelte/gear-context.svelte.d.ts +2 -0
  56. package/dist/svelte/gear-context.svelte.d.ts.map +1 -1
  57. package/dist/svelte/index.d.ts +6 -1
  58. package/dist/svelte/index.d.ts.map +1 -1
  59. package/dist/svelte/index.js +4 -1
  60. package/dist/svelte/playground/FieldPolicyFormPreview.svelte +18 -12
  61. package/dist/svelte/playground/FieldPolicyFormPreview.svelte.d.ts.map +1 -1
  62. package/dist/svelte/suggestions.d.ts +38 -0
  63. package/dist/svelte/suggestions.d.ts.map +1 -0
  64. package/dist/svelte/suggestions.js +68 -0
  65. package/dist/svelte/usage-capture.d.ts +63 -0
  66. package/dist/svelte/usage-capture.d.ts.map +1 -0
  67. package/dist/svelte/usage-capture.js +61 -0
  68. package/dist/types.d.ts +40 -0
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.js +7 -1
  71. package/dist/types.js.map +1 -1
  72. package/dist/usage-learning.d.ts +201 -0
  73. package/dist/usage-learning.d.ts.map +1 -0
  74. package/dist/usage-schedules.d.ts +110 -0
  75. package/dist/usage-schedules.d.ts.map +1 -0
  76. package/dist/users-module.d.ts +30 -0
  77. package/dist/users-module.d.ts.map +1 -0
  78. package/package.json +9 -9
@@ -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.61",
3
+ "version": "0.40.63",
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",
@@ -36,11 +36,11 @@
36
36
  }
37
37
  },
38
38
  "dependencies": {
39
- "@happyvertical/sql": "^0.85.5",
40
- "@happyvertical/smrt-core": "0.40.61",
41
- "@happyvertical/smrt-tenancy": "0.40.61",
42
- "@happyvertical/smrt-ui": "0.40.61",
43
- "@happyvertical/smrt-users": "0.40.61"
39
+ "@happyvertical/sql": "^0.86.1",
40
+ "@happyvertical/smrt-core": "0.40.63",
41
+ "@happyvertical/smrt-tenancy": "0.40.63",
42
+ "@happyvertical/smrt-users": "0.40.63",
43
+ "@happyvertical/smrt-ui": "0.40.63"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@sveltejs/package": "^2.5.8",
@@ -52,9 +52,9 @@
52
52
  "typescript": "5.9.3",
53
53
  "vite": "8.1.4",
54
54
  "vitest": "4.1.10",
55
- "@happyvertical/smrt-cli": "0.40.61",
56
- "@happyvertical/smrt-users": "0.40.61",
57
- "@happyvertical/smrt-vitest": "0.40.61"
55
+ "@happyvertical/smrt-cli": "0.40.63",
56
+ "@happyvertical/smrt-users": "0.40.63",
57
+ "@happyvertical/smrt-vitest": "0.40.63"
58
58
  },
59
59
  "keywords": [
60
60
  "smrt",