ai-database 2.1.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/CHANGELOG.md +47 -1
  2. package/README.md +1063 -186
  3. package/dist/actions.d.ts +2 -2
  4. package/dist/actions.d.ts.map +1 -1
  5. package/dist/actions.js +1 -1
  6. package/dist/actions.js.map +1 -1
  7. package/dist/ai-promise-db.d.ts +52 -23
  8. package/dist/ai-promise-db.d.ts.map +1 -1
  9. package/dist/ai-promise-db.js +185 -164
  10. package/dist/ai-promise-db.js.map +1 -1
  11. package/dist/authorization.d.ts.map +1 -1
  12. package/dist/authorization.js +38 -30
  13. package/dist/authorization.js.map +1 -1
  14. package/dist/cascade-orchestrator.d.ts +404 -0
  15. package/dist/cascade-orchestrator.d.ts.map +1 -0
  16. package/dist/cascade-orchestrator.js +828 -0
  17. package/dist/cascade-orchestrator.js.map +1 -0
  18. package/dist/cascade-write-strategy.d.ts +584 -0
  19. package/dist/cascade-write-strategy.d.ts.map +1 -0
  20. package/dist/cascade-write-strategy.js +590 -0
  21. package/dist/cascade-write-strategy.js.map +1 -0
  22. package/dist/ch-adapter.d.ts +358 -0
  23. package/dist/ch-adapter.d.ts.map +1 -0
  24. package/dist/ch-adapter.js +929 -0
  25. package/dist/ch-adapter.js.map +1 -0
  26. package/dist/client/index.d.ts +42 -0
  27. package/dist/client/index.d.ts.map +1 -0
  28. package/dist/client/index.js +43 -0
  29. package/dist/client/index.js.map +1 -0
  30. package/dist/client.d.ts +266 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +81 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/constants.d.ts +64 -1
  35. package/dist/constants.d.ts.map +1 -1
  36. package/dist/constants.js +52 -2
  37. package/dist/constants.js.map +1 -1
  38. package/dist/dataloader.d.ts +99 -0
  39. package/dist/dataloader.d.ts.map +1 -0
  40. package/dist/dataloader.js +225 -0
  41. package/dist/dataloader.js.map +1 -0
  42. package/dist/db-provider-port.d.ts +501 -0
  43. package/dist/db-provider-port.d.ts.map +1 -0
  44. package/dist/db-provider-port.js +113 -0
  45. package/dist/db-provider-port.js.map +1 -0
  46. package/dist/digital-objects-provider.d.ts +49 -0
  47. package/dist/digital-objects-provider.d.ts.map +1 -0
  48. package/dist/digital-objects-provider.js +55 -0
  49. package/dist/digital-objects-provider.js.map +1 -0
  50. package/dist/do-sqlite-adapter.d.ts +402 -0
  51. package/dist/do-sqlite-adapter.d.ts.map +1 -0
  52. package/dist/do-sqlite-adapter.js +745 -0
  53. package/dist/do-sqlite-adapter.js.map +1 -0
  54. package/dist/docs-rels/custom-types.d.ts +134 -0
  55. package/dist/docs-rels/custom-types.d.ts.map +1 -0
  56. package/dist/docs-rels/custom-types.js +70 -0
  57. package/dist/docs-rels/custom-types.js.map +1 -0
  58. package/dist/docs-rels/index.d.ts +16 -0
  59. package/dist/docs-rels/index.d.ts.map +1 -0
  60. package/dist/docs-rels/index.js +16 -0
  61. package/dist/docs-rels/index.js.map +1 -0
  62. package/dist/docs-rels/migrations/index.d.ts +30 -0
  63. package/dist/docs-rels/migrations/index.d.ts.map +1 -0
  64. package/dist/docs-rels/migrations/index.js +128 -0
  65. package/dist/docs-rels/migrations/index.js.map +1 -0
  66. package/dist/docs-rels/schema.d.ts +2961 -0
  67. package/dist/docs-rels/schema.d.ts.map +1 -0
  68. package/dist/docs-rels/schema.js +244 -0
  69. package/dist/docs-rels/schema.js.map +1 -0
  70. package/dist/durable-clickhouse.d.ts.map +1 -1
  71. package/dist/durable-clickhouse.js +16 -13
  72. package/dist/durable-clickhouse.js.map +1 -1
  73. package/dist/durable-promise.d.ts.map +1 -1
  74. package/dist/durable-promise.js +34 -15
  75. package/dist/durable-promise.js.map +1 -1
  76. package/dist/errors.d.ts +127 -0
  77. package/dist/errors.d.ts.map +1 -0
  78. package/dist/errors.js +210 -0
  79. package/dist/errors.js.map +1 -0
  80. package/dist/eventbridge.d.ts +117 -0
  81. package/dist/eventbridge.d.ts.map +1 -0
  82. package/dist/eventbridge.js +238 -0
  83. package/dist/eventbridge.js.map +1 -0
  84. package/dist/events.d.ts +2 -2
  85. package/dist/events.d.ts.map +1 -1
  86. package/dist/events.js +1 -1
  87. package/dist/events.js.map +1 -1
  88. package/dist/execution-queue.d.ts.map +1 -1
  89. package/dist/execution-queue.js +4 -5
  90. package/dist/execution-queue.js.map +1 -1
  91. package/dist/index.d.ts +37 -8
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +112 -6
  94. package/dist/index.js.map +1 -1
  95. package/dist/linguistic.d.ts +3 -108
  96. package/dist/linguistic.d.ts.map +1 -1
  97. package/dist/linguistic.js +3 -372
  98. package/dist/linguistic.js.map +1 -1
  99. package/dist/logger.d.ts +132 -0
  100. package/dist/logger.d.ts.map +1 -0
  101. package/dist/logger.js +137 -0
  102. package/dist/logger.js.map +1 -0
  103. package/dist/memory-provider.d.ts +129 -0
  104. package/dist/memory-provider.d.ts.map +1 -1
  105. package/dist/memory-provider.js +592 -257
  106. package/dist/memory-provider.js.map +1 -1
  107. package/dist/pg-adapter.d.ts +424 -0
  108. package/dist/pg-adapter.d.ts.map +1 -0
  109. package/dist/pg-adapter.js +921 -0
  110. package/dist/pg-adapter.js.map +1 -0
  111. package/dist/pipelines-iceberg-emitter.d.ts +327 -0
  112. package/dist/pipelines-iceberg-emitter.d.ts.map +1 -0
  113. package/dist/pipelines-iceberg-emitter.js +351 -0
  114. package/dist/pipelines-iceberg-emitter.js.map +1 -0
  115. package/dist/provider-capabilities.d.ts +146 -0
  116. package/dist/provider-capabilities.d.ts.map +1 -0
  117. package/dist/provider-capabilities.js +214 -0
  118. package/dist/provider-capabilities.js.map +1 -0
  119. package/dist/rdb-provider-adapter.d.ts +195 -0
  120. package/dist/rdb-provider-adapter.d.ts.map +1 -0
  121. package/dist/rdb-provider-adapter.js +291 -0
  122. package/dist/rdb-provider-adapter.js.map +1 -0
  123. package/dist/schema/cascade.d.ts +49 -10
  124. package/dist/schema/cascade.d.ts.map +1 -1
  125. package/dist/schema/cascade.js +491 -273
  126. package/dist/schema/cascade.js.map +1 -1
  127. package/dist/schema/definition-caches.d.ts +24 -0
  128. package/dist/schema/definition-caches.d.ts.map +1 -0
  129. package/dist/schema/definition-caches.js +26 -0
  130. package/dist/schema/definition-caches.js.map +1 -0
  131. package/dist/schema/dependency-graph.d.ts +45 -0
  132. package/dist/schema/dependency-graph.d.ts.map +1 -0
  133. package/dist/schema/dependency-graph.js +47 -0
  134. package/dist/schema/dependency-graph.js.map +1 -0
  135. package/dist/schema/diff.d.ts +103 -0
  136. package/dist/schema/diff.d.ts.map +1 -0
  137. package/dist/schema/diff.js +329 -0
  138. package/dist/schema/diff.js.map +1 -0
  139. package/dist/schema/entity-operations.d.ts +99 -0
  140. package/dist/schema/entity-operations.d.ts.map +1 -0
  141. package/dist/schema/entity-operations.js +818 -0
  142. package/dist/schema/entity-operations.js.map +1 -0
  143. package/dist/schema/generation-context.d.ts +202 -0
  144. package/dist/schema/generation-context.d.ts.map +1 -0
  145. package/dist/schema/generation-context.js +393 -0
  146. package/dist/schema/generation-context.js.map +1 -0
  147. package/dist/schema/index.d.ts +32 -34
  148. package/dist/schema/index.d.ts.map +1 -1
  149. package/dist/schema/index.js +462 -519
  150. package/dist/schema/index.js.map +1 -1
  151. package/dist/schema/migration.d.ts +205 -0
  152. package/dist/schema/migration.d.ts.map +1 -0
  153. package/dist/schema/migration.js +327 -0
  154. package/dist/schema/migration.js.map +1 -0
  155. package/dist/schema/nl-query-generator.d.ts +68 -0
  156. package/dist/schema/nl-query-generator.d.ts.map +1 -0
  157. package/dist/schema/nl-query-generator.js +362 -0
  158. package/dist/schema/nl-query-generator.js.map +1 -0
  159. package/dist/schema/nl-query.d.ts +65 -0
  160. package/dist/schema/nl-query.d.ts.map +1 -0
  161. package/dist/schema/nl-query.js +178 -0
  162. package/dist/schema/nl-query.js.map +1 -0
  163. package/dist/schema/parse.d.ts.map +1 -1
  164. package/dist/schema/parse.js +152 -89
  165. package/dist/schema/parse.js.map +1 -1
  166. package/dist/schema/provider.d.ts +38 -0
  167. package/dist/schema/provider.d.ts.map +1 -1
  168. package/dist/schema/provider.js +15 -7
  169. package/dist/schema/provider.js.map +1 -1
  170. package/dist/schema/resolve.d.ts +46 -5
  171. package/dist/schema/resolve.d.ts.map +1 -1
  172. package/dist/schema/resolve.js +334 -117
  173. package/dist/schema/resolve.js.map +1 -1
  174. package/dist/schema/search-utils.d.ts +76 -0
  175. package/dist/schema/search-utils.d.ts.map +1 -0
  176. package/dist/schema/search-utils.js +86 -0
  177. package/dist/schema/search-utils.js.map +1 -0
  178. package/dist/schema/seed.d.ts +53 -0
  179. package/dist/schema/seed.d.ts.map +1 -0
  180. package/dist/schema/seed.js +94 -0
  181. package/dist/schema/seed.js.map +1 -0
  182. package/dist/schema/semantic.d.ts +11 -0
  183. package/dist/schema/semantic.d.ts.map +1 -1
  184. package/dist/schema/semantic.js +262 -68
  185. package/dist/schema/semantic.js.map +1 -1
  186. package/dist/schema/sub-apis.d.ts +52 -0
  187. package/dist/schema/sub-apis.d.ts.map +1 -0
  188. package/dist/schema/sub-apis.js +216 -0
  189. package/dist/schema/sub-apis.js.map +1 -0
  190. package/dist/schema/system-entities.d.ts +42 -0
  191. package/dist/schema/system-entities.d.ts.map +1 -0
  192. package/dist/schema/system-entities.js +101 -0
  193. package/dist/schema/system-entities.js.map +1 -0
  194. package/dist/schema/types.d.ts +91 -9
  195. package/dist/schema/types.d.ts.map +1 -1
  196. package/dist/schema/union-fallback.d.ts +219 -0
  197. package/dist/schema/union-fallback.d.ts.map +1 -0
  198. package/dist/schema/union-fallback.js +331 -0
  199. package/dist/schema/union-fallback.js.map +1 -0
  200. package/dist/schema/value-generators/ai.d.ts +54 -0
  201. package/dist/schema/value-generators/ai.d.ts.map +1 -0
  202. package/dist/schema/value-generators/ai.js +136 -0
  203. package/dist/schema/value-generators/ai.js.map +1 -0
  204. package/dist/schema/value-generators/index.d.ts +126 -0
  205. package/dist/schema/value-generators/index.d.ts.map +1 -0
  206. package/dist/schema/value-generators/index.js +219 -0
  207. package/dist/schema/value-generators/index.js.map +1 -0
  208. package/dist/schema/value-generators/placeholder.d.ts +52 -0
  209. package/dist/schema/value-generators/placeholder.d.ts.map +1 -0
  210. package/dist/schema/value-generators/placeholder.js +328 -0
  211. package/dist/schema/value-generators/placeholder.js.map +1 -0
  212. package/dist/schema/value-generators/types.d.ts +116 -0
  213. package/dist/schema/value-generators/types.d.ts.map +1 -0
  214. package/dist/schema/value-generators/types.js +11 -0
  215. package/dist/schema/value-generators/types.js.map +1 -0
  216. package/dist/schema/verb-derivation.d.ts +167 -0
  217. package/dist/schema/verb-derivation.d.ts.map +1 -0
  218. package/dist/schema/verb-derivation.js +281 -0
  219. package/dist/schema/verb-derivation.js.map +1 -0
  220. package/dist/schema/version.d.ts +111 -0
  221. package/dist/schema/version.d.ts.map +1 -0
  222. package/dist/schema/version.js +190 -0
  223. package/dist/schema/version.js.map +1 -0
  224. package/dist/schema.d.ts +1095 -23
  225. package/dist/schema.d.ts.map +1 -1
  226. package/dist/schema.js +2854 -38
  227. package/dist/schema.js.map +1 -1
  228. package/dist/semantic-vectors.d.ts +39 -0
  229. package/dist/semantic-vectors.d.ts.map +1 -0
  230. package/dist/semantic-vectors.js +334 -0
  231. package/dist/semantic-vectors.js.map +1 -0
  232. package/dist/semantic.d.ts +29 -1
  233. package/dist/semantic.d.ts.map +1 -1
  234. package/dist/semantic.js +26 -16
  235. package/dist/semantic.js.map +1 -1
  236. package/dist/telemetry.d.ts +128 -0
  237. package/dist/telemetry.d.ts.map +1 -0
  238. package/dist/telemetry.js +305 -0
  239. package/dist/telemetry.js.map +1 -0
  240. package/dist/tests.d.ts.map +1 -1
  241. package/dist/tests.js +30 -22
  242. package/dist/tests.js.map +1 -1
  243. package/dist/type-guards.d.ts +212 -0
  244. package/dist/type-guards.d.ts.map +1 -0
  245. package/dist/type-guards.js +318 -0
  246. package/dist/type-guards.js.map +1 -0
  247. package/dist/types.d.ts +33 -245
  248. package/dist/types.d.ts.map +1 -1
  249. package/dist/types.js +62 -72
  250. package/dist/types.js.map +1 -1
  251. package/dist/validation.d.ts +165 -0
  252. package/dist/validation.d.ts.map +1 -0
  253. package/dist/validation.js +639 -0
  254. package/dist/validation.js.map +1 -0
  255. package/dist/worker/db-provider.d.ts +168 -0
  256. package/dist/worker/db-provider.d.ts.map +1 -0
  257. package/dist/worker/db-provider.js +277 -0
  258. package/dist/worker/db-provider.js.map +1 -0
  259. package/dist/worker/index.d.ts +35 -0
  260. package/dist/worker/index.d.ts.map +1 -0
  261. package/dist/worker/index.js +37 -0
  262. package/dist/worker/index.js.map +1 -0
  263. package/dist/worker.d.ts +779 -0
  264. package/dist/worker.d.ts.map +1 -0
  265. package/dist/worker.js +2786 -0
  266. package/dist/worker.js.map +1 -0
  267. package/package.json +38 -8
  268. package/src/docs-rels/migrations/0001-init.sql +125 -0
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Verb Derivation for Backward Cascade Resolution
3
+ *
4
+ * Derives reverse verbs for backward relationships:
5
+ * - manages -> managedBy
6
+ * - owns -> ownedBy
7
+ * - creates -> createdBy
8
+ * - parent_of <-> child_of (bidirectional)
9
+ *
10
+ * Used by the cascade resolver to determine the reverse relationship
11
+ * when traversing relationships in the opposite direction.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { deriveReverseVerb, fieldNameToVerb, isPassiveVerb } from './verb-derivation.js'
16
+ *
17
+ * deriveReverseVerb('manages') // 'managedBy'
18
+ * deriveReverseVerb('parent_of') // 'child_of'
19
+ * deriveReverseVerb('managedBy') // 'manages'
20
+ *
21
+ * fieldNameToVerb('manager') // 'manages'
22
+ * fieldNameToVerb('owner') // 'owns'
23
+ *
24
+ * isPassiveVerb('managedBy') // true
25
+ * isPassiveVerb('manages') // false
26
+ * ```
27
+ *
28
+ * @packageDocumentation
29
+ */
30
+ // =============================================================================
31
+ // Forward to Reverse Verb Mapping
32
+ // =============================================================================
33
+ /**
34
+ * Mutable copy for runtime registration of custom verb pairs.
35
+ * Initialized from INITIAL_FORWARD_TO_REVERSE.
36
+ */
37
+ const _forwardToReverse = {
38
+ manages: 'managedBy',
39
+ owns: 'ownedBy',
40
+ creates: 'createdBy',
41
+ reviews: 'reviewedBy',
42
+ employs: 'employedBy',
43
+ contains: 'containedBy',
44
+ assigns: 'assignedBy',
45
+ };
46
+ /**
47
+ * Mutable copy for runtime registration of reverse to forward mappings.
48
+ */
49
+ const _reverseToForward = {
50
+ managedBy: 'manages',
51
+ ownedBy: 'owns',
52
+ createdBy: 'creates',
53
+ reviewedBy: 'reviews',
54
+ employedBy: 'employs',
55
+ containedBy: 'contains',
56
+ assignedBy: 'assigns',
57
+ };
58
+ /**
59
+ * Forward verbs to their reverse forms.
60
+ * Common active verbs mapped to their passive counterparts.
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * FORWARD_TO_REVERSE.manages // 'managedBy'
65
+ * FORWARD_TO_REVERSE.owns // 'ownedBy'
66
+ * FORWARD_TO_REVERSE.creates // 'createdBy'
67
+ * ```
68
+ */
69
+ export const FORWARD_TO_REVERSE = _forwardToReverse;
70
+ // =============================================================================
71
+ // Bidirectional Pairs
72
+ // =============================================================================
73
+ /**
74
+ * Mutable copy for runtime registration of bidirectional pairs.
75
+ */
76
+ const _bidirectionalPairs = {
77
+ parent_of: 'child_of',
78
+ child_of: 'parent_of',
79
+ };
80
+ /**
81
+ * Known verb pairs for bidirectional relationships.
82
+ * These are symmetric - each maps to the other.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * BIDIRECTIONAL_PAIRS.parent_of // 'child_of'
87
+ * BIDIRECTIONAL_PAIRS.child_of // 'parent_of'
88
+ * ```
89
+ */
90
+ export const BIDIRECTIONAL_PAIRS = _bidirectionalPairs;
91
+ // =============================================================================
92
+ // Field Name to Verb Mapping
93
+ // =============================================================================
94
+ /**
95
+ * Mutable copy for runtime registration of field to verb mappings.
96
+ */
97
+ const _fieldToVerb = {
98
+ manager: 'manages',
99
+ owner: 'owns',
100
+ creator: 'creates',
101
+ reviewer: 'reviews',
102
+ employer: 'employs',
103
+ parent: 'parent_of',
104
+ child: 'child_of',
105
+ assignee: 'assigns',
106
+ };
107
+ // =============================================================================
108
+ // Core Functions
109
+ // =============================================================================
110
+ /**
111
+ * Derives the reverse verb for a given forward verb.
112
+ *
113
+ * Resolution order:
114
+ * 1. Check bidirectional pairs first (parent_of <-> child_of)
115
+ * 2. Check known forward verbs (manages -> managedBy)
116
+ * 3. Check if already a reversed verb (managedBy -> manages)
117
+ * 4. Apply standard transformation for verbs ending in 's'
118
+ * 5. Add 'By' suffix for unknown verbs
119
+ *
120
+ * @param verb - The verb to derive the reverse of
121
+ * @returns The reverse verb
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * deriveReverseVerb('manages') // 'managedBy'
126
+ * deriveReverseVerb('owns') // 'ownedBy'
127
+ * deriveReverseVerb('parent_of') // 'child_of'
128
+ * deriveReverseVerb('managedBy') // 'manages' (already reversed)
129
+ * deriveReverseVerb('customAction') // 'customActionBy' (unknown verb)
130
+ * ```
131
+ */
132
+ export function deriveReverseVerb(verb) {
133
+ // Check bidirectional pairs first
134
+ if (verb in _bidirectionalPairs) {
135
+ return _bidirectionalPairs[verb];
136
+ }
137
+ // Check known forward verbs
138
+ if (verb in _forwardToReverse) {
139
+ return _forwardToReverse[verb];
140
+ }
141
+ // Check if this is already a reversed verb (ends with 'By')
142
+ if (verb in _reverseToForward) {
143
+ return _reverseToForward[verb];
144
+ }
145
+ // Check if verb ends with 'By' - try to find its forward form
146
+ if (verb.endsWith('By')) {
147
+ // Check if there's a known forward form
148
+ const forwardVerb = _reverseToForward[verb];
149
+ if (forwardVerb) {
150
+ return forwardVerb;
151
+ }
152
+ // Otherwise just return the base (customActionBy -> customAction)
153
+ return verb.slice(0, -2);
154
+ }
155
+ // Apply standard verb transformation for third person singular verbs
156
+ // (verbs ending in 's' like manages, owns, creates, reviews, employs, contains)
157
+ if (verb.endsWith('s') && verb.length > 2) {
158
+ // Remove trailing 's' to get base form, then add 'edBy'
159
+ // manages -> manage -> managedBy
160
+ // owns -> own -> ownedBy
161
+ // creates -> create -> createdBy
162
+ const base = verb.slice(0, -1);
163
+ return base + 'dBy';
164
+ }
165
+ // For other verbs, just add 'By' suffix
166
+ return verb + 'By';
167
+ }
168
+ /**
169
+ * Derives a verb from a field name.
170
+ *
171
+ * Common field names like "manager", "owner", "creator" are mapped
172
+ * to their corresponding verbs. Unknown field names are returned as-is.
173
+ *
174
+ * @param fieldName - The field name to derive a verb from
175
+ * @returns The derived verb or the field name if no mapping exists
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * fieldNameToVerb('manager') // 'manages'
180
+ * fieldNameToVerb('owner') // 'owns'
181
+ * fieldNameToVerb('creator') // 'creates'
182
+ * fieldNameToVerb('customField') // 'customField' (no mapping)
183
+ * ```
184
+ */
185
+ export function fieldNameToVerb(fieldName) {
186
+ return _fieldToVerb[fieldName] ?? fieldName;
187
+ }
188
+ /**
189
+ * Checks if a verb is in passive form.
190
+ *
191
+ * A verb is considered passive if it ends with:
192
+ * - 'By' (managedBy, ownedBy, createdBy)
193
+ * - 'To' (relatedTo, linkedTo, connectedTo)
194
+ * - 'Of' (parent_of, child_of, partOf)
195
+ *
196
+ * @param verb - The verb to check
197
+ * @returns True if the verb is passive, false otherwise
198
+ *
199
+ * @example
200
+ * ```ts
201
+ * isPassiveVerb('managedBy') // true
202
+ * isPassiveVerb('relatedTo') // true
203
+ * isPassiveVerb('parent_of') // true
204
+ * isPassiveVerb('manages') // false
205
+ * ```
206
+ */
207
+ export function isPassiveVerb(verb) {
208
+ if (verb.length === 0) {
209
+ return false;
210
+ }
211
+ // Check for common passive suffixes
212
+ return (verb.endsWith('By') ||
213
+ verb.endsWith('To') ||
214
+ verb.endsWith('Of') ||
215
+ verb.endsWith('_of'));
216
+ }
217
+ // =============================================================================
218
+ // Extensibility Functions
219
+ // =============================================================================
220
+ /**
221
+ * Register a custom verb pair for forward/reverse derivation.
222
+ *
223
+ * This allows extending the verb derivation system with domain-specific
224
+ * verb mappings at runtime.
225
+ *
226
+ * @param forward - The forward (active) verb
227
+ * @param reverse - The reverse (passive) verb
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * registerVerbPair('sponsors', 'sponsoredBy')
232
+ * deriveReverseVerb('sponsors') // 'sponsoredBy'
233
+ * deriveReverseVerb('sponsoredBy') // 'sponsors'
234
+ * ```
235
+ */
236
+ export function registerVerbPair(forward, reverse) {
237
+ _forwardToReverse[forward] = reverse;
238
+ _reverseToForward[reverse] = forward;
239
+ }
240
+ /**
241
+ * Register a bidirectional verb pair.
242
+ *
243
+ * Bidirectional pairs are symmetric relationships where each verb
244
+ * maps to the other. For self-referential relationships, both
245
+ * arguments can be the same verb.
246
+ *
247
+ * @param verbA - The first verb
248
+ * @param verbB - The second verb (can be same as verbA for symmetric)
249
+ *
250
+ * @example
251
+ * ```ts
252
+ * // Asymmetric bidirectional
253
+ * registerBidirectionalPair('mentor_of', 'mentee_of')
254
+ * deriveReverseVerb('mentor_of') // 'mentee_of'
255
+ * deriveReverseVerb('mentee_of') // 'mentor_of'
256
+ *
257
+ * // Symmetric (self-referential)
258
+ * registerBidirectionalPair('relatedTo', 'relatedTo')
259
+ * deriveReverseVerb('relatedTo') // 'relatedTo'
260
+ * ```
261
+ */
262
+ export function registerBidirectionalPair(verbA, verbB) {
263
+ _bidirectionalPairs[verbA] = verbB;
264
+ _bidirectionalPairs[verbB] = verbA;
265
+ }
266
+ /**
267
+ * Register a field name to verb mapping.
268
+ *
269
+ * @param fieldName - The field name
270
+ * @param verb - The verb it derives to
271
+ *
272
+ * @example
273
+ * ```ts
274
+ * registerFieldVerb('coordinator', 'coordinates')
275
+ * fieldNameToVerb('coordinator') // 'coordinates'
276
+ * ```
277
+ */
278
+ export function registerFieldVerb(fieldName, verb) {
279
+ _fieldToVerb[fieldName] = verb;
280
+ }
281
+ //# sourceMappingURL=verb-derivation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verb-derivation.js","sourceRoot":"","sources":["../../src/schema/verb-derivation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Schema Version Tracking
3
+ *
4
+ * Provides utilities for tracking schema versions, computing schema hashes,
5
+ * and storing/retrieving version metadata from the database.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { DatabaseSchema } from '../types.js';
10
+ import type { DBProvider } from './provider.js';
11
+ /**
12
+ * Schema version metadata stored in the database
13
+ */
14
+ export interface SchemaVersionInfo {
15
+ /** The version number (incremented on each migration) */
16
+ version: number;
17
+ /** Hash of the schema structure for change detection */
18
+ schemaHash: string;
19
+ /** When this version was applied */
20
+ appliedAt?: string;
21
+ /** Description of the migration (if any) */
22
+ description?: string;
23
+ }
24
+ /**
25
+ * Compute a deterministic hash of a database schema
26
+ *
27
+ * The hash is computed by:
28
+ * 1. Sorting entity names alphabetically
29
+ * 2. For each entity, sorting field names alphabetically
30
+ * 3. Creating a normalized JSON representation
31
+ * 4. Computing a hash of the JSON string
32
+ *
33
+ * This ensures the same schema always produces the same hash,
34
+ * regardless of property insertion order in the original object.
35
+ *
36
+ * @param schema - The database schema to hash
37
+ * @returns A hex string hash of the schema
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const hash = computeSchemaHash({
42
+ * User: { name: 'string', email: 'string' },
43
+ * Post: { title: 'string', author: 'User.posts' }
44
+ * })
45
+ * // => '8a7b3c9d...'
46
+ * ```
47
+ */
48
+ export declare function computeSchemaHash(schema: DatabaseSchema): string;
49
+ /**
50
+ * Get the current schema version from the database
51
+ *
52
+ * Reads the _schema_meta entity to retrieve the current schema version
53
+ * and hash. Returns null if no version has been set yet (first run).
54
+ *
55
+ * @param provider - The database provider
56
+ * @returns The current schema version info, or null if not set
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const version = await getSchemaVersion(provider)
61
+ * if (version) {
62
+ * console.log(`Current version: ${version.version}`)
63
+ * console.log(`Schema hash: ${version.schemaHash}`)
64
+ * } else {
65
+ * console.log('No schema version set - first run')
66
+ * }
67
+ * ```
68
+ */
69
+ export declare function getSchemaVersion(provider: DBProvider): Promise<SchemaVersionInfo | null>;
70
+ /**
71
+ * Set the schema version in the database
72
+ *
73
+ * Stores the schema version and hash as a _schema_meta entity.
74
+ * Creates the entity if it doesn't exist, or updates it if it does.
75
+ *
76
+ * @param provider - The database provider
77
+ * @param version - The new version number
78
+ * @param schemaHash - The hash of the current schema
79
+ * @param description - Optional description of the migration
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * await setSchemaVersion(provider, 1, 'abc123', 'Initial schema')
84
+ * await setSchemaVersion(provider, 2, 'def456', 'Added email field to User')
85
+ * ```
86
+ */
87
+ export declare function setSchemaVersion(provider: DBProvider, version: number, schemaHash: string, description?: string): Promise<void>;
88
+ /**
89
+ * Check if the schema has changed since the last recorded version
90
+ *
91
+ * Compares the current schema hash with the stored hash to detect changes.
92
+ *
93
+ * @param provider - The database provider
94
+ * @param schema - The current schema definition
95
+ * @returns Object with changed status and hashes
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * const { changed, currentHash, storedHash } = await hasSchemaChanged(provider, schema)
100
+ * if (changed) {
101
+ * console.log('Schema has changed, migration may be needed')
102
+ * }
103
+ * ```
104
+ */
105
+ export declare function hasSchemaChanged(provider: DBProvider, schema: DatabaseSchema): Promise<{
106
+ changed: boolean;
107
+ currentHash: string;
108
+ storedHash: string | null;
109
+ storedVersion: number | null;
110
+ }>;
111
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/schema/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAM/C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAgBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuChE;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA6B9F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAC,CAUD"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Schema Version Tracking
3
+ *
4
+ * Provides utilities for tracking schema versions, computing schema hashes,
5
+ * and storing/retrieving version metadata from the database.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ // =============================================================================
10
+ // Constants
11
+ // =============================================================================
12
+ /** Entity type for storing schema metadata */
13
+ const SCHEMA_META_TYPE = 'SchemaMeta';
14
+ /** ID for the schema version record */
15
+ const SCHEMA_VERSION_ID = 'current';
16
+ // =============================================================================
17
+ // Hash Computation
18
+ // =============================================================================
19
+ /**
20
+ * Compute a deterministic hash of a database schema
21
+ *
22
+ * The hash is computed by:
23
+ * 1. Sorting entity names alphabetically
24
+ * 2. For each entity, sorting field names alphabetically
25
+ * 3. Creating a normalized JSON representation
26
+ * 4. Computing a hash of the JSON string
27
+ *
28
+ * This ensures the same schema always produces the same hash,
29
+ * regardless of property insertion order in the original object.
30
+ *
31
+ * @param schema - The database schema to hash
32
+ * @returns A hex string hash of the schema
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const hash = computeSchemaHash({
37
+ * User: { name: 'string', email: 'string' },
38
+ * Post: { title: 'string', author: 'User.posts' }
39
+ * })
40
+ * // => '8a7b3c9d...'
41
+ * ```
42
+ */
43
+ export function computeSchemaHash(schema) {
44
+ // Create a normalized representation with sorted keys
45
+ const normalized = {};
46
+ // Sort entity names
47
+ const entityNames = Object.keys(schema).sort();
48
+ for (const entityName of entityNames) {
49
+ const entitySchema = schema[entityName];
50
+ const normalizedEntity = {};
51
+ // Sort field names within each entity
52
+ const fieldNames = Object.keys(entitySchema).sort();
53
+ for (const fieldName of fieldNames) {
54
+ const fieldDef = entitySchema[fieldName];
55
+ // Normalize array definitions to string representation
56
+ if (Array.isArray(fieldDef)) {
57
+ normalizedEntity[fieldName] = `[${fieldDef[0]}]`;
58
+ }
59
+ else {
60
+ normalizedEntity[fieldName] = fieldDef;
61
+ }
62
+ }
63
+ normalized[entityName] = normalizedEntity;
64
+ }
65
+ // Create JSON string and compute hash
66
+ const jsonString = JSON.stringify(normalized);
67
+ // Simple hash function (djb2 algorithm)
68
+ let hash = 5381;
69
+ for (let i = 0; i < jsonString.length; i++) {
70
+ const char = jsonString.charCodeAt(i);
71
+ hash = ((hash << 5) + hash) ^ char;
72
+ }
73
+ // Convert to positive hex string
74
+ return Math.abs(hash).toString(16).padStart(8, '0');
75
+ }
76
+ // =============================================================================
77
+ // Version Storage
78
+ // =============================================================================
79
+ /**
80
+ * Get the current schema version from the database
81
+ *
82
+ * Reads the _schema_meta entity to retrieve the current schema version
83
+ * and hash. Returns null if no version has been set yet (first run).
84
+ *
85
+ * @param provider - The database provider
86
+ * @returns The current schema version info, or null if not set
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * const version = await getSchemaVersion(provider)
91
+ * if (version) {
92
+ * console.log(`Current version: ${version.version}`)
93
+ * console.log(`Schema hash: ${version.schemaHash}`)
94
+ * } else {
95
+ * console.log('No schema version set - first run')
96
+ * }
97
+ * ```
98
+ */
99
+ export async function getSchemaVersion(provider) {
100
+ try {
101
+ const record = await provider.get(SCHEMA_META_TYPE, SCHEMA_VERSION_ID);
102
+ if (!record) {
103
+ return null;
104
+ }
105
+ const result = {
106
+ version: record['version'],
107
+ schemaHash: record['schemaHash'],
108
+ };
109
+ if (record['appliedAt'] !== undefined) {
110
+ result.appliedAt = record['appliedAt'];
111
+ }
112
+ if (record['description'] !== undefined) {
113
+ result.description = record['description'];
114
+ }
115
+ return result;
116
+ }
117
+ catch (error) {
118
+ // If the entity type doesn't exist yet, that's fine - return null
119
+ if (error instanceof Error &&
120
+ (error.message.includes('not found') || error.message.includes('does not exist'))) {
121
+ return null;
122
+ }
123
+ throw error;
124
+ }
125
+ }
126
+ /**
127
+ * Set the schema version in the database
128
+ *
129
+ * Stores the schema version and hash as a _schema_meta entity.
130
+ * Creates the entity if it doesn't exist, or updates it if it does.
131
+ *
132
+ * @param provider - The database provider
133
+ * @param version - The new version number
134
+ * @param schemaHash - The hash of the current schema
135
+ * @param description - Optional description of the migration
136
+ *
137
+ * @example
138
+ * ```ts
139
+ * await setSchemaVersion(provider, 1, 'abc123', 'Initial schema')
140
+ * await setSchemaVersion(provider, 2, 'def456', 'Added email field to User')
141
+ * ```
142
+ */
143
+ export async function setSchemaVersion(provider, version, schemaHash, description) {
144
+ const data = {
145
+ version,
146
+ schemaHash,
147
+ appliedAt: new Date().toISOString(),
148
+ };
149
+ if (description !== undefined) {
150
+ data['description'] = description;
151
+ }
152
+ // Try to get existing record
153
+ const existing = await provider.get(SCHEMA_META_TYPE, SCHEMA_VERSION_ID);
154
+ if (existing) {
155
+ // Update existing record
156
+ await provider.update(SCHEMA_META_TYPE, SCHEMA_VERSION_ID, data);
157
+ }
158
+ else {
159
+ // Create new record
160
+ await provider.create(SCHEMA_META_TYPE, SCHEMA_VERSION_ID, data);
161
+ }
162
+ }
163
+ /**
164
+ * Check if the schema has changed since the last recorded version
165
+ *
166
+ * Compares the current schema hash with the stored hash to detect changes.
167
+ *
168
+ * @param provider - The database provider
169
+ * @param schema - The current schema definition
170
+ * @returns Object with changed status and hashes
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * const { changed, currentHash, storedHash } = await hasSchemaChanged(provider, schema)
175
+ * if (changed) {
176
+ * console.log('Schema has changed, migration may be needed')
177
+ * }
178
+ * ```
179
+ */
180
+ export async function hasSchemaChanged(provider, schema) {
181
+ const currentHash = computeSchemaHash(schema);
182
+ const versionInfo = await getSchemaVersion(provider);
183
+ return {
184
+ changed: versionInfo === null || versionInfo.schemaHash !== currentHash,
185
+ currentHash,
186
+ storedHash: versionInfo?.schemaHash ?? null,
187
+ storedVersion: versionInfo?.version ?? null,
188
+ };
189
+ }
190
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/schema/version.ts"],"names":[],"mappings":"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"}