mindoodb 0.0.63 → 0.0.65

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 (108) hide show
  1. package/README.md +14 -1
  2. package/dist/browser/index.mjs +15 -0
  3. package/dist/core/BaseMindooDB.d.ts +19 -0
  4. package/dist/core/BaseMindooDB.d.ts.map +1 -1
  5. package/dist/core/BaseMindooDB.js +607 -323
  6. package/dist/core/BaseMindooDB.js.map +1 -1
  7. package/dist/core/accesscontrol/tier1Evaluator.d.ts +59 -0
  8. package/dist/core/accesscontrol/tier1Evaluator.d.ts.map +1 -0
  9. package/dist/core/accesscontrol/tier1Evaluator.js +77 -0
  10. package/dist/core/accesscontrol/tier1Evaluator.js.map +1 -0
  11. package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts +58 -5
  12. package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts.map +1 -1
  13. package/dist/core/appendonlystores/network/IrohNetworkTransport.js +77 -8
  14. package/dist/core/appendonlystores/network/IrohNetworkTransport.js.map +1 -1
  15. package/dist/core/appendonlystores/network/IrohStreamIO.d.ts +32 -10
  16. package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -1
  17. package/dist/core/appendonlystores/network/IrohStreamIO.js +26 -10
  18. package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -1
  19. package/dist/core/appendonlystores/network/irohLocator.d.ts +16 -0
  20. package/dist/core/appendonlystores/network/irohLocator.d.ts.map +1 -1
  21. package/dist/core/appendonlystores/network/irohLocator.js +36 -0
  22. package/dist/core/appendonlystores/network/irohLocator.js.map +1 -1
  23. package/dist/core/builtinDbInvariants.d.ts +12 -6
  24. package/dist/core/builtinDbInvariants.d.ts.map +1 -1
  25. package/dist/core/builtinDbInvariants.js +7 -1
  26. package/dist/core/builtinDbInvariants.js.map +1 -1
  27. package/dist/core/expressions/builder.d.ts +25 -0
  28. package/dist/core/expressions/builder.d.ts.map +1 -1
  29. package/dist/core/expressions/builder.js +33 -13
  30. package/dist/core/expressions/builder.js.map +1 -1
  31. package/dist/core/expressions/evaluateExpression.d.ts +55 -2
  32. package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
  33. package/dist/core/expressions/evaluateExpression.js +95 -3
  34. package/dist/core/expressions/evaluateExpression.js.map +1 -1
  35. package/dist/core/expressions/formulaSource.d.ts.map +1 -1
  36. package/dist/core/expressions/formulaSource.js +21 -2
  37. package/dist/core/expressions/formulaSource.js.map +1 -1
  38. package/dist/core/expressions/index.d.ts +1 -1
  39. package/dist/core/expressions/index.d.ts.map +1 -1
  40. package/dist/core/expressions/index.js +3 -1
  41. package/dist/core/expressions/index.js.map +1 -1
  42. package/dist/core/expressions/metadata.d.ts +1 -1
  43. package/dist/core/expressions/metadata.d.ts.map +1 -1
  44. package/dist/core/expressions/metadata.js +5 -0
  45. package/dist/core/expressions/metadata.js.map +1 -1
  46. package/dist/core/expressions/types.d.ts +17 -2
  47. package/dist/core/expressions/types.d.ts.map +1 -1
  48. package/dist/core/index.d.ts +7 -4
  49. package/dist/core/index.d.ts.map +1 -1
  50. package/dist/core/index.js +29 -11
  51. package/dist/core/index.js.map +1 -1
  52. package/dist/core/indexing/createViewDataProvider.d.ts.map +1 -1
  53. package/dist/core/indexing/createViewDataProvider.js +1 -0
  54. package/dist/core/indexing/createViewDataProvider.js.map +1 -1
  55. package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts.map +1 -1
  56. package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js +1 -0
  57. package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js.map +1 -1
  58. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
  59. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +1 -0
  60. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
  61. package/dist/core/peerdevices/PeerDeviceDocument.d.ts +144 -0
  62. package/dist/core/peerdevices/PeerDeviceDocument.d.ts.map +1 -0
  63. package/dist/core/peerdevices/PeerDeviceDocument.js +209 -0
  64. package/dist/core/peerdevices/PeerDeviceDocument.js.map +1 -0
  65. package/dist/core/query/executeQuery.d.ts +1 -1
  66. package/dist/core/query/executeQuery.d.ts.map +1 -1
  67. package/dist/core/query/executeQuery.js +106 -71
  68. package/dist/core/query/executeQuery.js.map +1 -1
  69. package/dist/core/query/executeQueryInclude.d.ts +99 -0
  70. package/dist/core/query/executeQueryInclude.d.ts.map +1 -0
  71. package/dist/core/query/executeQueryInclude.js +447 -0
  72. package/dist/core/query/executeQueryInclude.js.map +1 -0
  73. package/dist/core/query/index.d.ts +2 -1
  74. package/dist/core/query/index.d.ts.map +1 -1
  75. package/dist/core/query/index.js +5 -1
  76. package/dist/core/query/index.js.map +1 -1
  77. package/dist/core/query/queryInternals.d.ts +45 -0
  78. package/dist/core/query/queryInternals.d.ts.map +1 -0
  79. package/dist/core/query/queryInternals.js +87 -0
  80. package/dist/core/query/queryInternals.js.map +1 -0
  81. package/dist/core/query/queryLive.d.ts.map +1 -1
  82. package/dist/core/query/queryLive.js +67 -8
  83. package/dist/core/query/queryLive.js.map +1 -1
  84. package/dist/core/query/queryView.d.ts.map +1 -1
  85. package/dist/core/query/queryView.js +19 -0
  86. package/dist/core/query/queryView.js.map +1 -1
  87. package/dist/core/query/types.d.ts +122 -7
  88. package/dist/core/query/types.d.ts.map +1 -1
  89. package/dist/core/query/types.js +13 -1
  90. package/dist/core/query/types.js.map +1 -1
  91. package/dist/core/types.d.ts +15 -0
  92. package/dist/core/types.d.ts.map +1 -1
  93. package/dist/core/userkeys/fingerprint.d.ts +12 -4
  94. package/dist/core/userkeys/fingerprint.d.ts.map +1 -1
  95. package/dist/core/userkeys/fingerprint.js +14 -5
  96. package/dist/core/userkeys/fingerprint.js.map +1 -1
  97. package/dist/iroh/index.d.ts +3 -2
  98. package/dist/iroh/index.d.ts.map +1 -1
  99. package/dist/iroh/index.js +8 -1
  100. package/dist/iroh/index.js.map +1 -1
  101. package/dist/node/server/TenantManager.d.ts +5 -0
  102. package/dist/node/server/TenantManager.d.ts.map +1 -1
  103. package/dist/node/server/TenantManager.js +35 -56
  104. package/dist/node/server/TenantManager.js.map +1 -1
  105. package/dist/node/server/nativeIrohStreamIO.d.ts.map +1 -1
  106. package/dist/node/server/nativeIrohStreamIO.js +17 -4
  107. package/dist/node/server/nativeIrohStreamIO.js.map +1 -1
  108. package/package.json +1 -1
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ /**
3
+ * Peer-device records: how one device advertises its Iroh endpoint id to the
4
+ * other members of a tenant.
5
+ *
6
+ * A device publishes one `dev_<fingerprint>` document into `userdirectory`,
7
+ * encrypted with the tenant `default` key. That placement is deliberate:
8
+ *
9
+ * - **`userdirectory`, not `grantaccess`.** Every member already replicates
10
+ * `userdirectory`, and a device can write its own record there without an
11
+ * administrator approving anything.
12
+ * - **`default`, not `$publicinfos`.** The hoster holds the `$publicinfos`
13
+ * key, and who talks to whom over Iroh is none of the hoster's business.
14
+ * `default` keeps the record readable for every tenant member and opaque to
15
+ * the server.
16
+ * - **`dev_` prefix.** That makes it a *personal document* (see
17
+ * {@link PERSONAL_DOC_ID_PREFIXES}), so the write invariant lets its creator
18
+ * — and only its creator — change and delete it.
19
+ *
20
+ * ## Why records must be verified on read
21
+ *
22
+ * Any tenant member can write a `dev_` document holding any endpoint id they
23
+ * like. The doc id and payload are therefore claims, not facts.
24
+ * {@link verifyPeerDeviceRecord} only accepts a record when all three hold:
25
+ *
26
+ * 1. the doc id is the fingerprint of the `signingPublicKey` in the payload,
27
+ * 2. the `doc_create` entry was signed by exactly that key, and
28
+ * 3. that key is an active (non-revoked) grant in the tenant.
29
+ *
30
+ * Together these mean a record can only be published by the device that owns
31
+ * the signing key it names, so nobody can put their own endpoint id under
32
+ * someone else's device.
33
+ *
34
+ * **Known v1 gap — id squatting.** A member can create `dev_<someone else's
35
+ * fingerprint>` before that device does. The squatted record fails step 2 and
36
+ * is discarded, so it cannot impersonate anyone; but the real device then
37
+ * cannot create its own record under that id and stays invisible to the
38
+ * picker. Detect it by the record being present yet unverifiable.
39
+ */
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.PEER_DEVICE_SCHEMA_VERSION = exports.PEER_DEVICE_TYPE = exports.PEER_DEVICE_FORM = exports.PEER_DEVICE_DOC_ID_PREFIX = void 0;
42
+ exports.peerDeviceDocumentId = peerDeviceDocumentId;
43
+ exports.isPeerDeviceDocId = isPeerDeviceDocId;
44
+ exports.publishPeerDeviceRecord = publishPeerDeviceRecord;
45
+ exports.removePeerDeviceRecord = removePeerDeviceRecord;
46
+ exports.verifyPeerDeviceRecord = verifyPeerDeviceRecord;
47
+ exports.listPeerDeviceRecords = listPeerDeviceRecords;
48
+ const types_1 = require("../types");
49
+ const fingerprint_1 = require("../userkeys/fingerprint");
50
+ exports.PEER_DEVICE_DOC_ID_PREFIX = "dev_";
51
+ exports.PEER_DEVICE_FORM = "userdirectory";
52
+ exports.PEER_DEVICE_TYPE = "peerdevice";
53
+ exports.PEER_DEVICE_SCHEMA_VERSION = 1;
54
+ /**
55
+ * Deterministic document id for a device, derived from its signing key
56
+ * fingerprint.
57
+ *
58
+ * Deterministic so a device republishing after a reload updates its record
59
+ * instead of accumulating a new one per session. Colons are stripped because
60
+ * custom ids must match `^[a-z][a-z0-9_]*$` (`CUSTOM_DOC_ID_REGEX`).
61
+ */
62
+ function peerDeviceDocumentId(signingKeyFingerprint) {
63
+ return `${exports.PEER_DEVICE_DOC_ID_PREFIX}${signingKeyFingerprint.replace(/:/g, "").toLowerCase()}`;
64
+ }
65
+ function isPeerDeviceDocId(docId) {
66
+ return docId.startsWith(exports.PEER_DEVICE_DOC_ID_PREFIX);
67
+ }
68
+ /**
69
+ * Publish (or refresh) this device's record.
70
+ *
71
+ * Idempotent: the id is derived from the device's own signing key, so calling
72
+ * this on every unlock keeps one record per device and updates the endpoint id
73
+ * and label in place.
74
+ *
75
+ * Note this does *not* pass `assumeUniqueId`. The id is deterministic rather
76
+ * than random, so two replicas creating it concurrently must share Automerge
77
+ * ancestry in order to converge instead of forking. That code path also
78
+ * forbids `initialValues`, which is why the payload is written with a
79
+ * follow-up `changeDoc` — the same call that refreshes an existing record.
80
+ */
81
+ async function publishPeerDeviceRecord(input) {
82
+ const fingerprint = await (0, fingerprint_1.fingerprintPublicKeyPem)(input.signingPublicKey, input.subtle);
83
+ const docId = peerDeviceDocumentId(fingerprint);
84
+ const doc = (await input.db.getDocument(docId).catch(() => null)) ??
85
+ (await input.db.createDocument({
86
+ id: docId,
87
+ decryptionKeyId: types_1.DEFAULT_TENANT_KEY_ID,
88
+ signingKeyPair: input.signingKeyPair,
89
+ signingKeyPassword: input.signingKeyPassword,
90
+ }));
91
+ const label = input.label ?? "";
92
+ const current = doc.getData();
93
+ const unchanged = current.type === exports.PEER_DEVICE_TYPE &&
94
+ current.schemaVersion === exports.PEER_DEVICE_SCHEMA_VERSION &&
95
+ current.irohEndpointId === input.irohEndpointId &&
96
+ current.signingPublicKey === input.signingPublicKey &&
97
+ (current.label ?? "") === label;
98
+ // Callers republish on every unlock and after every `userdirectory` sync.
99
+ // Rewriting `updatedAt` unconditionally would append an entry each time,
100
+ // and since that entry syncs and triggers the next refresh, the two halves
101
+ // would keep feeding each other. Only a real change is worth a write.
102
+ if (unchanged) {
103
+ return doc;
104
+ }
105
+ await input.db.changeDoc(doc, (editable) => {
106
+ const data = editable.getData();
107
+ data.form = exports.PEER_DEVICE_FORM;
108
+ data.type = exports.PEER_DEVICE_TYPE;
109
+ data.schemaVersion = exports.PEER_DEVICE_SCHEMA_VERSION;
110
+ data.irohEndpointId = input.irohEndpointId;
111
+ data.signingPublicKey = input.signingPublicKey;
112
+ data.label = label;
113
+ data.updatedAt = Date.now();
114
+ });
115
+ return doc;
116
+ }
117
+ /** Withdraw this device's record, e.g. when signing out of the tenant. */
118
+ async function removePeerDeviceRecord(input) {
119
+ const fingerprint = await (0, fingerprint_1.fingerprintPublicKeyPem)(input.signingPublicKey, input.subtle);
120
+ const docId = peerDeviceDocumentId(fingerprint);
121
+ await input.db.deleteDocument(docId).catch(() => {
122
+ // Already gone, or never published from this device.
123
+ });
124
+ }
125
+ /**
126
+ * Check one record's claim. Returns the verified record, or `null` when any
127
+ * step of the chain described in the module docs fails.
128
+ */
129
+ async function verifyPeerDeviceRecord(input) {
130
+ const docId = input.doc.getId();
131
+ const data = input.doc.getData();
132
+ const signingPublicKey = typeof data.signingPublicKey === "string" ? data.signingPublicKey : "";
133
+ const irohEndpointId = typeof data.irohEndpointId === "string" ? data.irohEndpointId.trim().toLowerCase() : "";
134
+ if (data.type !== exports.PEER_DEVICE_TYPE || !signingPublicKey || !/^[0-9a-f]{64}$/.test(irohEndpointId)) {
135
+ return null;
136
+ }
137
+ // 1. The id must be the fingerprint of the key the payload names, so a
138
+ // record cannot sit under a device id it does not belong to.
139
+ const fingerprint = await (0, fingerprint_1.fingerprintPublicKeyPem)(signingPublicKey, input.subtle);
140
+ if (peerDeviceDocumentId(fingerprint) !== docId) {
141
+ return null;
142
+ }
143
+ // 2. That key must be the one that actually created the document. Without
144
+ // this, any member could publish a record naming someone else's key.
145
+ const creatorKey = await resolveCreateSigner(input.db, docId);
146
+ if (!creatorKey || normalizePem(creatorKey) !== normalizePem(signingPublicKey)) {
147
+ return null;
148
+ }
149
+ // 3. And it must still be a live grant, so revoked devices drop out.
150
+ if (!(await input.directory.validatePublicSigningKey(signingPublicKey).catch(() => false))) {
151
+ return null;
152
+ }
153
+ return {
154
+ docId,
155
+ irohEndpointId,
156
+ signingPublicKey,
157
+ signingKeyFingerprint: fingerprint,
158
+ label: typeof data.label === "string" && data.label ? data.label : undefined,
159
+ updatedAt: typeof data.updatedAt === "number" ? data.updatedAt : 0,
160
+ };
161
+ }
162
+ /**
163
+ * Every verified peer-device record in this `userdirectory` replica.
164
+ *
165
+ * Requires the tenant `default` key to be unlocked; records that cannot be
166
+ * decrypted are simply absent. Unverifiable records are skipped silently —
167
+ * they are the expected shape of an attack, not an error to surface.
168
+ */
169
+ async function listPeerDeviceRecords(input) {
170
+ // `idPrefix` matching is boundary-aware: "dev" matches `dev_…`, not `device…`.
171
+ const docIds = await input.db.getAllDocumentIds({ idPrefix: "dev" });
172
+ const records = [];
173
+ for (const docId of docIds) {
174
+ if (!isPeerDeviceDocId(docId)) {
175
+ continue;
176
+ }
177
+ const doc = await input.db.getDocument(docId).catch(() => null);
178
+ if (!doc) {
179
+ continue;
180
+ }
181
+ const record = await verifyPeerDeviceRecord({
182
+ db: input.db,
183
+ directory: input.directory,
184
+ doc,
185
+ subtle: input.subtle,
186
+ });
187
+ if (record && record.irohEndpointId !== input.excludeEndpointId) {
188
+ records.push(record);
189
+ }
190
+ }
191
+ return records;
192
+ }
193
+ /** Signing key that wrote the `doc_create` entry, or null when it is not here yet. */
194
+ async function resolveCreateSigner(db, docId) {
195
+ try {
196
+ // History is ordered causally, so `doc_create` is on the first page.
197
+ const page = await db.getDocumentHistoryPage(docId, { limit: 10 });
198
+ const create = page.entries.find((entry) => entry.entryType === "doc_create");
199
+ return create?.changeCreatedByPublicKey ?? null;
200
+ }
201
+ catch {
202
+ return null;
203
+ }
204
+ }
205
+ /** PEM formatting varies by transport; compare the key material, not the wrapping. */
206
+ function normalizePem(pem) {
207
+ return pem.replace(/\s+/g, "");
208
+ }
209
+ //# sourceMappingURL=PeerDeviceDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeerDeviceDocument.js","sourceRoot":"","sources":["../../../src/core/peerdevices/PeerDeviceDocument.ts"],"names":[],"mappings":"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"}
@@ -14,5 +14,5 @@ import { type MindooQuery, type MindooQueryOptions, type MindooQueryResult } fro
14
14
  * score for `{ special: "textScore" }` sorting — the default ordering
15
15
  * when a `text` clause is present without an explicit `sortBy`.
16
16
  */
17
- export declare function executeQuery(db: MindooDB, summary: DocumentSummaryStore, query: MindooQuery, options?: MindooQueryOptions): Promise<MindooQueryResult>;
17
+ export declare function executeQuery(db: MindooDB, summary: DocumentSummaryStore, input: MindooQuery, options?: MindooQueryOptions): Promise<MindooQueryResult>;
18
18
  //# sourceMappingURL=executeQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"executeQuery.d.ts","sourceRoot":"","sources":["../../../src/core/query/executeQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,UAAU,CAAC;AAYpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAIrF,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAGvB,MAAM,SAAS,CAAC;AAmLjB;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAsF5B"}
1
+ {"version":3,"file":"executeQuery.d.ts","sourceRoot":"","sources":["../../../src/core/query/executeQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,UAAU,CAAC;AAcpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAGrF,OAAO,EAEL,KAAK,WAAW,EAIhB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAGvB,MAAM,SAAS,CAAC;AAiMjB;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAuH5B"}
@@ -4,8 +4,9 @@ exports.executeQuery = executeQuery;
4
4
  const expressions_1 = require("../expressions");
5
5
  const encryptedFields_1 = require("../crypto/encryptedFields");
6
6
  const extractSummaryFields_1 = require("../indexing/summary/extractSummaryFields");
7
- const types_1 = require("../indexing/virtualviews/types");
8
- const types_2 = require("./types");
7
+ const types_1 = require("./types");
8
+ const queryInternals_1 = require("./queryInternals");
9
+ const executeQueryInclude_1 = require("./executeQueryInclude");
9
10
  /**
10
11
  * Resolve and prepare the full-text index for a query with a `text`
11
12
  * clause: brings the index up to date, verifies indexing is enabled, and
@@ -20,12 +21,12 @@ async function resolveTextClauseScores(db, query, options) {
20
21
  return null;
21
22
  }
22
23
  if (!db.getFullTextIndex) {
23
- throw new types_2.MindooQueryError(`This MindooDB instance does not support full-text search.`, "fulltext-not-enabled");
24
+ throw new types_1.MindooQueryError(`This MindooDB instance does not support full-text search.`, "fulltext-not-enabled");
24
25
  }
25
26
  const index = db.getFullTextIndex();
26
27
  await index.update(options);
27
28
  if (!index.isEnabled()) {
28
- throw new types_2.MindooQueryError(`Query has a text clause, but full-text indexing is not enabled for this database ` +
29
+ throw new types_1.MindooQueryError(`Query has a text clause, but full-text indexing is not enabled for this database ` +
29
30
  `(enable it via setFulltextSetup({ enabled: true }), see docs/fulltext-search.md).`, "fulltext-not-enabled");
30
31
  }
31
32
  const { hits } = index.searchSync(text.query, {
@@ -41,17 +42,45 @@ async function resolveTextClauseScores(db, query, options) {
41
42
  return { scores, index };
42
43
  }
43
44
  /**
44
- * Effective sort keys of a query: an explicit `sortBy` wins; a `text`
45
- * clause without one defaults to relevance ranking (best score first).
45
+ * Turn a caller's query into one the evaluator can run: formula source text
46
+ * becomes an expression, and anything that is neither is rejected here.
47
+ *
48
+ * Both matter for the same reason. The evaluator returns `undefined` for a
49
+ * node it does not recognize, and `undefined` as a filter means "no match" —
50
+ * so a filter handed over as source text, or built by hand with a typo,
51
+ * used to come back as an empty result set with `coverage: "full"`, which
52
+ * reads exactly like a correct query over data that isn't there.
46
53
  */
47
- function effectiveSortKeys(query) {
48
- if (query.sortBy && query.sortBy.length > 0) {
49
- return query.sortBy;
54
+ function parseQuery(query) {
55
+ return {
56
+ ...query,
57
+ filter: parseFilter(query.filter, "Query filter"),
58
+ include: query.include ? parseIncludes(query.include, "") : undefined,
59
+ };
60
+ }
61
+ function parseFilter(filter, label) {
62
+ if (typeof filter !== "string") {
63
+ return filter;
50
64
  }
51
- if (query.text) {
52
- return [{ special: "textScore", direction: "descending" }];
65
+ try {
66
+ return (0, expressions_1.parseMindooDBFormulaBooleanExpression)(filter);
67
+ }
68
+ catch (error) {
69
+ throw new types_1.MindooQueryError(`${label} is not valid formula source: ${error instanceof Error ? error.message : String(error)}`);
70
+ }
71
+ }
72
+ /** Formula-source filters are supported at every include level, not just the root. */
73
+ function parseIncludes(includes, slotPath) {
74
+ const parsed = {};
75
+ for (const [slot, include] of Object.entries(includes)) {
76
+ const label = slotPath ? `${slotPath}.${slot}` : slot;
77
+ parsed[slot] = {
78
+ ...include,
79
+ filter: parseFilter(include.filter, `Filter of include "${label}"`),
80
+ include: include.include ? parseIncludes(include.include, label) : undefined,
81
+ };
53
82
  }
54
- return [];
83
+ return parsed;
55
84
  }
56
85
  /** All expressions a query references (filter + expression sort keys). */
57
86
  function collectQueryExpressions(query) {
@@ -72,44 +101,34 @@ function collectQueryExpressions(query) {
72
101
  */
73
102
  function validateQueryExpressions(expressions, allowFullScan) {
74
103
  for (const expression of expressions) {
104
+ const unknown = (0, expressions_1.findUnknownExpressionNode)(expression);
105
+ if (unknown !== null) {
106
+ throw new types_1.MindooQueryError(`Query expression contains ${unknown}, which the expression language does not define. ` +
107
+ `Build expressions with createViewLanguage() (or pass the filter as formula source text).`);
108
+ }
75
109
  const requirements = (0, expressions_1.analyzeExpressionRequirements)(expression);
76
110
  if (requirements.needsViewContext) {
77
- throw new types_2.MindooQueryError(`Query expressions cannot use view-tree operations (${requirements.viewContextOperations.join(", ")}); ` +
111
+ throw new types_1.MindooQueryError(`Query expressions cannot use view-tree operations (${requirements.viewContextOperations.join(", ")}); ` +
78
112
  `these only evaluate inside a materialized view (use db.queryView() with categories instead).`);
79
113
  }
80
114
  if (requirements.needsDecryption && !allowFullScan) {
81
- throw new types_2.MindooQueryError(`Query expressions reference encrypted fields (decrypt), which the summary buffer does not store. ` +
115
+ throw new types_1.MindooQueryError(`Query expressions reference encrypted fields (decrypt), which the summary buffer does not store. ` +
82
116
  `Re-run with allowFullScan: true to evaluate them against materialized documents (expensive).`);
83
117
  }
84
- }
85
- }
86
- function sortDirectionDescending(sortKey) {
87
- return sortKey.direction === "descending";
88
- }
89
- function computeSortValues(sortKeys, context, textScore) {
90
- return sortKeys.map((sortKey) => {
91
- if (sortKey.special === "textScore") {
92
- return textScore ?? 0;
93
- }
94
- if (sortKey.expression) {
95
- return (0, expressions_1.evaluateExpression)(sortKey.expression, context);
118
+ if (requirements.needsParentContext) {
119
+ throw new types_1.MindooQueryError(`Query expressions cannot use v.parent(); there is no parent document at the top level of a query. ` +
120
+ `It only resolves inside the filter of an include lookup.`);
96
121
  }
97
- // Plain field sort keys resolve against the evaluation doc, which also
98
- // carries the mirrored managed fields (`_lastModified`, `_attachments`).
99
- return (0, extractSummaryFields_1.getSummaryFieldValue)(context.doc, sortKey.field ?? "");
100
- });
122
+ }
101
123
  }
124
+ /**
125
+ * Sorts, pages, and turns candidates into result rows. The paged
126
+ * candidates are returned alongside so include hydration can reach their
127
+ * unprojected values without scanning again.
128
+ */
102
129
  function sortAndPage(candidates, query, sortKeys) {
103
130
  if (sortKeys.length > 0) {
104
- candidates.sort((left, right) => {
105
- for (let i = 0; i < sortKeys.length; i++) {
106
- const result = (0, types_1.compareValues)(left.sortValues[i], right.sortValues[i], sortDirectionDescending(sortKeys[i]));
107
- if (result !== 0) {
108
- return result;
109
- }
110
- }
111
- return left.docId.localeCompare(right.docId);
112
- });
131
+ candidates.sort((left, right) => (0, queryInternals_1.compareCandidates)(left, right, sortKeys));
113
132
  }
114
133
  const total = candidates.length;
115
134
  const offset = Math.max(0, query.offset ?? 0);
@@ -122,24 +141,9 @@ function sortAndPage(candidates, query, sortKeys) {
122
141
  ? { docId, fields, lastModified }
123
142
  : { docId, fields, lastModified, textScore }),
124
143
  total,
144
+ paged,
125
145
  };
126
146
  }
127
- function projectFields(fields, projection) {
128
- if (!projection) {
129
- return fields;
130
- }
131
- const projected = {};
132
- for (const path of projection) {
133
- const value = (0, extractSummaryFields_1.getSummaryFieldValue)(fields, path);
134
- if (value !== undefined) {
135
- projected[path] = value;
136
- }
137
- }
138
- return projected;
139
- }
140
- function queryOrigin(db) {
141
- return `${db.getTenant().getId()}/${db.getStore().getId()}`;
142
- }
143
147
  /**
144
148
  * Execute an ad-hoc query against the document summary buffer.
145
149
  *
@@ -153,13 +157,21 @@ function queryOrigin(db) {
153
157
  * score for `{ special: "textScore" }` sorting — the default ordering
154
158
  * when a `text` clause is present without an explicit `sortBy`.
155
159
  */
156
- async function executeQuery(db, summary, query, options) {
160
+ async function executeQuery(db, summary, input, options) {
161
+ const query = parseQuery(input);
157
162
  const expressions = collectQueryExpressions(query);
158
163
  if (options?.allowFullScan) {
164
+ if (query.include) {
165
+ throw new types_1.MindooQueryError(`Queries cannot combine allowFullScan with include lookups: includes are answered from the ` +
166
+ `summary buffer of every involved database, which is exactly what allowFullScan bypasses.`);
167
+ }
159
168
  validateQueryExpressions(expressions, true);
160
169
  return executeFullScanQuery(db, query, expressions, options);
161
170
  }
162
171
  validateQueryExpressions(expressions, false);
172
+ if (query.include) {
173
+ (0, executeQueryInclude_1.validateQueryIncludes)(query.include);
174
+ }
163
175
  // Coverage check: every field referenced by filter/sort expressions and
164
176
  // plain-field sort keys must be answerable from the summary.
165
177
  const referencedPaths = new Set();
@@ -175,20 +187,20 @@ async function executeQuery(db, summary, query, options) {
175
187
  }
176
188
  for (const path of referencedPaths) {
177
189
  if (!summary.isFieldCovered(path)) {
178
- throw new types_2.MindooQueryError(`Field "${path}" is not covered by the summary configuration ` +
190
+ throw new types_1.MindooQueryError(`Field "${path}" is not covered by the summary configuration ` +
179
191
  `(check include/exclude in SummaryConfig, or re-run with allowFullScan: true).`);
180
192
  }
181
193
  }
182
194
  const textMatch = await resolveTextClauseScores(db, query, options);
183
195
  if (options?.signal?.aborted) {
184
- throw new types_2.MindooQueryError("Query aborted while updating the full-text index.");
196
+ throw new types_1.MindooQueryError("Query aborted while updating the full-text index.");
185
197
  }
186
198
  await summary.update(options);
187
199
  if (options?.signal?.aborted) {
188
- throw new types_2.MindooQueryError("Query aborted while updating the summary buffer.");
200
+ throw new types_1.MindooQueryError("Query aborted while updating the summary buffer.");
189
201
  }
190
- const origin = queryOrigin(db);
191
- const sortKeys = effectiveSortKeys(query);
202
+ const origin = (0, queryInternals_1.queryOrigin)(db);
203
+ const sortKeys = (0, queryInternals_1.effectiveSortKeys)(query);
192
204
  const candidates = [];
193
205
  for (const entry of summary.getAllEntries()) {
194
206
  let textScore;
@@ -203,6 +215,7 @@ async function executeQuery(db, summary, query, options) {
203
215
  doc: evaluationDoc,
204
216
  values: {},
205
217
  origin,
218
+ docId: entry.docId,
206
219
  lastModifiedAt: new Date(entry.lastModified).toISOString(),
207
220
  decryptionKeyId: entry.decryptionKeyId,
208
221
  variables: {},
@@ -212,18 +225,38 @@ async function executeQuery(db, summary, query, options) {
212
225
  }
213
226
  candidates.push({
214
227
  docId: entry.docId,
215
- fields: projectFields(evaluationDoc, query.fields),
228
+ fields: (0, queryInternals_1.projectFields)(evaluationDoc, query.fields),
216
229
  lastModified: entry.lastModified,
217
230
  textScore,
218
- sortValues: computeSortValues(sortKeys, context, textScore),
231
+ sortValues: (0, queryInternals_1.computeSortValues)(sortKeys, context, textScore),
232
+ evaluationDoc,
219
233
  });
220
234
  }
221
- const { rows, total } = sortAndPage(candidates, query, sortKeys);
235
+ const { rows, total, paged } = sortAndPage(candidates, query, sortKeys);
222
236
  // Coverage is the minimum of the summary and full-text coverage: while
223
237
  // either side is still backfilling, results may be incomplete.
224
- const coverage = textMatch && textMatch.index.getCoverage() === "rebuilding"
238
+ let coverage = textMatch && textMatch.index.getCoverage() === "rebuilding"
225
239
  ? "rebuilding"
226
240
  : summary.getCoverage();
241
+ // Includes are hydrated AFTER paging: only the rows actually returned
242
+ // get related documents, so a `limit: 20` page costs 20 rows' worth of
243
+ // joins regardless of how many documents matched.
244
+ if (query.include) {
245
+ const parents = rows.map((row, index) => ({
246
+ row,
247
+ docId: row.docId,
248
+ doc: paged[index].evaluationDoc,
249
+ }));
250
+ const includeCoverage = await (0, executeQueryInclude_1.hydrateQueryIncludes)({
251
+ parentDb: db,
252
+ parentSummary: summary,
253
+ includes: query.include,
254
+ parents,
255
+ depth: 1,
256
+ options,
257
+ });
258
+ coverage = (0, queryInternals_1.mergeCoverage)(coverage, includeCoverage);
259
+ }
227
260
  return { rows, total, coverage };
228
261
  }
229
262
  /** Resolve the plaintext for every `decrypt` node before evaluating a document. */
@@ -254,8 +287,8 @@ async function executeFullScanQuery(db, query, expressions, options) {
254
287
  // full-scan path — scanning document bodies cannot compute relevance
255
288
  // scores, and the index requirement stays consistent between paths.
256
289
  const textMatch = await resolveTextClauseScores(db, query, options);
257
- const origin = queryOrigin(db);
258
- const sortKeys = effectiveSortKeys(query);
290
+ const origin = (0, queryInternals_1.queryOrigin)(db);
291
+ const sortKeys = (0, queryInternals_1.effectiveSortKeys)(query);
259
292
  const decryptRequests = [];
260
293
  for (const expression of expressions) {
261
294
  decryptRequests.push(...(0, expressions_1.collectDecryptRequests)(expression));
@@ -268,10 +301,10 @@ async function executeFullScanQuery(db, query, expressions, options) {
268
301
  for await (const { doc } of db.iterateChangesSince(null)) {
269
302
  processed++;
270
303
  if (signal?.aborted) {
271
- throw new types_2.MindooQueryError("Query aborted during full scan.");
304
+ throw new types_1.MindooQueryError("Query aborted during full scan.");
272
305
  }
273
306
  if (onProgress && onProgress({ processed, total, origin }) === false) {
274
- throw new types_2.MindooQueryError("Query cancelled by progress callback during full scan.");
307
+ throw new types_1.MindooQueryError("Query cancelled by progress callback during full scan.");
275
308
  }
276
309
  if (doc.isDeleted()) {
277
310
  continue;
@@ -289,6 +322,7 @@ async function executeFullScanQuery(db, query, expressions, options) {
289
322
  doc: data,
290
323
  values: {},
291
324
  origin,
325
+ docId: mindooDoc.getId(),
292
326
  createdAt: new Date(mindooDoc.getCreatedAt()).toISOString(),
293
327
  lastModifiedAt: new Date(mindooDoc.getLastModified()).toISOString(),
294
328
  decryptionKeyId: mindooDoc.getDecryptionKeyId(),
@@ -303,10 +337,11 @@ async function executeFullScanQuery(db, query, expressions, options) {
303
337
  }
304
338
  candidates.push({
305
339
  docId: mindooDoc.getId(),
306
- fields: projectFields(data, query.fields),
340
+ fields: (0, queryInternals_1.projectFields)(data, query.fields),
307
341
  lastModified: mindooDoc.getLastModified(),
308
342
  textScore,
309
- sortValues: computeSortValues(sortKeys, context, textScore),
343
+ sortValues: (0, queryInternals_1.computeSortValues)(sortKeys, context, textScore),
344
+ evaluationDoc: data,
310
345
  });
311
346
  }
312
347
  const { rows, total: matchTotal } = sortAndPage(candidates, query, sortKeys);
@@ -1 +1 @@
1
- {"version":3,"file":"executeQuery.js","sourceRoot":"","sources":["../../../src/core/query/executeQuery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executeQuery.js","sourceRoot":"","sources":["../../../src/core/query/executeQuery.ts"],"names":[],"mappings":"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"}