@wirecat/cli-base 0.24.0 → 0.26.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 (104) hide show
  1. package/README.md +27 -4
  2. package/THIRD_PARTY_NOTICES +760 -0
  3. package/dist/commands/document.d.ts +10 -10
  4. package/dist/commands/document.d.ts.map +1 -1
  5. package/dist/commands/document.js +27 -9
  6. package/dist/commands/document.js.map +1 -1
  7. package/dist/commands/index.d.ts +16 -4
  8. package/dist/commands/index.d.ts.map +1 -1
  9. package/dist/commands/index.js +10 -3
  10. package/dist/commands/index.js.map +1 -1
  11. package/dist/completion/index.js +2 -2
  12. package/dist/completion/index.js.map +1 -1
  13. package/dist/deadline.js +1 -1
  14. package/dist/deadline.js.map +1 -1
  15. package/dist/dev/lint.d.ts +10 -2
  16. package/dist/dev/lint.d.ts.map +1 -1
  17. package/dist/dev/lint.js +134 -7
  18. package/dist/dev/lint.js.map +1 -1
  19. package/dist/dev/main.d.ts.map +1 -1
  20. package/dist/dev/main.js +14 -3
  21. package/dist/dev/main.js.map +1 -1
  22. package/dist/errors.d.ts +3 -3
  23. package/dist/errors.d.ts.map +1 -1
  24. package/dist/errors.js.map +1 -1
  25. package/dist/failure.d.ts +3 -3
  26. package/dist/failure.d.ts.map +1 -1
  27. package/dist/failure.js +9 -7
  28. package/dist/failure.js.map +1 -1
  29. package/dist/logging.d.ts +1 -1
  30. package/dist/logging.d.ts.map +1 -1
  31. package/dist/logging.js +5 -3
  32. package/dist/logging.js.map +1 -1
  33. package/dist/output-buffer.js +3 -3
  34. package/dist/output-buffer.js.map +1 -1
  35. package/dist/query/dates.d.ts +15 -0
  36. package/dist/query/dates.d.ts.map +1 -0
  37. package/dist/query/dates.js +104 -0
  38. package/dist/query/dates.js.map +1 -0
  39. package/dist/query/evaluate.d.ts +15 -0
  40. package/dist/query/evaluate.d.ts.map +1 -0
  41. package/dist/query/evaluate.js +70 -0
  42. package/dist/query/evaluate.js.map +1 -0
  43. package/dist/query/fields.d.ts +54 -0
  44. package/dist/query/fields.d.ts.map +1 -0
  45. package/dist/query/fields.js +87 -0
  46. package/dist/query/fields.js.map +1 -0
  47. package/dist/query/help.d.ts +5 -0
  48. package/dist/query/help.d.ts.map +1 -0
  49. package/dist/query/help.js +18 -0
  50. package/dist/query/help.js.map +1 -0
  51. package/dist/query/index.d.ts +13 -0
  52. package/dist/query/index.d.ts.map +1 -0
  53. package/dist/query/index.js +13 -0
  54. package/dist/query/index.js.map +1 -0
  55. package/dist/query/parser.d.ts +9 -0
  56. package/dist/query/parser.d.ts.map +1 -0
  57. package/dist/query/parser.js +303 -0
  58. package/dist/query/parser.js.map +1 -0
  59. package/dist/query/registry.d.ts +23 -0
  60. package/dist/query/registry.d.ts.map +1 -0
  61. package/dist/query/registry.js +77 -0
  62. package/dist/query/registry.js.map +1 -0
  63. package/dist/query/types.d.ts +53 -0
  64. package/dist/query/types.d.ts.map +1 -0
  65. package/dist/query/types.js +44 -0
  66. package/dist/query/types.js.map +1 -0
  67. package/dist/query/validate.d.ts +11 -0
  68. package/dist/query/validate.d.ts.map +1 -0
  69. package/dist/query/validate.js +82 -0
  70. package/dist/query/validate.js.map +1 -0
  71. package/dist/result-fields.js +1 -1
  72. package/dist/result-fields.js.map +1 -1
  73. package/dist/standards/errors.d.ts +3 -3
  74. package/dist/standards/errors.d.ts.map +1 -1
  75. package/dist/standards/errors.js +7 -7
  76. package/dist/standards/errors.js.map +1 -1
  77. package/dist/standards/index.d.ts +2 -2
  78. package/dist/standards/index.d.ts.map +1 -1
  79. package/dist/standards/index.js +2 -2
  80. package/dist/standards/index.js.map +1 -1
  81. package/dist/standards/lint.d.ts +1 -1
  82. package/dist/standards/lint.d.ts.map +1 -1
  83. package/dist/standards/lint.js +31 -1
  84. package/dist/standards/lint.js.map +1 -1
  85. package/dist/standards/log.d.ts +7 -3
  86. package/dist/standards/log.d.ts.map +1 -1
  87. package/dist/standards/log.js +7 -3
  88. package/dist/standards/log.js.map +1 -1
  89. package/dist/standards/output.d.ts +10 -8
  90. package/dist/standards/output.d.ts.map +1 -1
  91. package/dist/standards/output.js +7 -5
  92. package/dist/standards/output.js.map +1 -1
  93. package/dist/standards/registry.d.ts +2 -0
  94. package/dist/standards/registry.d.ts.map +1 -1
  95. package/dist/standards/registry.js +3 -1
  96. package/dist/standards/registry.js.map +1 -1
  97. package/dist/standards/steps.d.ts +1 -1
  98. package/dist/standards/steps.js +2 -2
  99. package/dist/standards/steps.js.map +1 -1
  100. package/dist/standards/vocabulary.d.ts +18 -0
  101. package/dist/standards/vocabulary.d.ts.map +1 -1
  102. package/dist/standards/vocabulary.js +579 -15
  103. package/dist/standards/vocabulary.js.map +1 -1
  104. package/package.json +7 -2
@@ -0,0 +1,303 @@
1
+ // Port of Lucene 9.12.3 StandardSyntaxParser.jj and BooleanModifiersQueryNodeProcessor (Apache-2.0).
2
+ // Notices: THIRD_PARTY_NOTICES; upstream sources and the reference generator: cli-messaging scripts/search-reference.
3
+ // Adjacency is Query(DisjQuery*), not ConjQuery.
4
+ import { QUERY_LIMITS, queryError, walkQuery, } from "./types.js";
5
+ const whitespace = (c) => /[ \t\n\r\u3000]/u.test(c);
6
+ const reserved = new Set([
7
+ "+",
8
+ "-",
9
+ "!",
10
+ "(",
11
+ ")",
12
+ ":",
13
+ "=",
14
+ "^",
15
+ "@",
16
+ "<",
17
+ ">",
18
+ "[",
19
+ "]",
20
+ '"',
21
+ "{",
22
+ "}",
23
+ "~",
24
+ "\\",
25
+ "/",
26
+ ]);
27
+ const decodeEscapes = (raw, span, fail) => {
28
+ let out = "";
29
+ for (let at = 0; at < raw.length; at++) {
30
+ if (raw[at] !== "\\") {
31
+ out += raw[at];
32
+ continue;
33
+ }
34
+ if (++at >= raw.length)
35
+ fail("query.invalid-escape", span);
36
+ if (raw[at] === "u") {
37
+ const hex = raw.slice(at + 1, at + 5);
38
+ if (!/^[0-9a-fA-F]{4}$/.test(hex))
39
+ fail("query.invalid-escape", span);
40
+ out += String.fromCharCode(Number.parseInt(hex, 16));
41
+ at += 4;
42
+ }
43
+ else
44
+ out += raw[at];
45
+ }
46
+ return out;
47
+ };
48
+ const tokensOf = (text, fail = queryError) => {
49
+ const tokens = [];
50
+ let at = 0;
51
+ let range = false;
52
+ while (at < text.length) {
53
+ const start = at;
54
+ const c = text[at] ?? "";
55
+ if (whitespace(c)) {
56
+ at++;
57
+ continue;
58
+ }
59
+ let kind = c;
60
+ if (c === '"' || (!range && c === "/")) {
61
+ at++;
62
+ while (at < text.length && text[at] !== c) {
63
+ if (text[at] === "\\" && (c === '"' || text[at + 1] === "/"))
64
+ at++;
65
+ at++;
66
+ }
67
+ if (at >= text.length)
68
+ fail("query.unclosed-literal", { start, end: at });
69
+ at++;
70
+ if (c === "/" && /^[dgimsuvy]+(?:$|[ \t\n\r)])/.test(text.slice(at)))
71
+ fail("query.unsupported-regex-flags", { start: at, end: at + 1 }, "Lucene regex does not take JavaScript flags");
72
+ kind = c === '"' ? "quoted" : "regex";
73
+ }
74
+ else if (range && c !== "]" && c !== "}") {
75
+ while (at < text.length && !whitespace(text[at] ?? "") && !["]", "}"].includes(text[at] ?? ""))
76
+ at++;
77
+ kind = "rangeValue";
78
+ }
79
+ else if (reserved.has(c)) {
80
+ if (c === "\\") {
81
+ at += 2;
82
+ while (at < text.length &&
83
+ !whitespace(text[at] ?? "") &&
84
+ (!reserved.has(text[at] ?? "") || ["+", "-"].includes(text[at] ?? "")))
85
+ at++;
86
+ kind = "term";
87
+ }
88
+ else {
89
+ at++;
90
+ if ((c === "<" || c === ">") && text[at] === "=") {
91
+ at++;
92
+ kind += "=";
93
+ }
94
+ if (c === "[" || c === "{")
95
+ range = true;
96
+ if (c === "]" || c === "}")
97
+ range = false;
98
+ }
99
+ }
100
+ else {
101
+ at++;
102
+ while (at < text.length) {
103
+ const next = text[at] ?? "";
104
+ if (next === "\\") {
105
+ if (at + 1 >= text.length)
106
+ fail("query.invalid-escape", { start: at, end: at + 1 });
107
+ at += 2;
108
+ continue;
109
+ }
110
+ if (whitespace(next) || (reserved.has(next) && next !== "+" && next !== "-"))
111
+ break;
112
+ at++;
113
+ }
114
+ const raw = text.slice(start, at);
115
+ kind =
116
+ { AND: "AND", OR: "OR", NOT: "NOT", "&&": "AND", "||": "OR" }[raw] ??
117
+ (/^\d+(?:\.\d+)?$/u.test(raw) ? "number" : "term");
118
+ }
119
+ tokens.push({ kind, raw: text.slice(start, at), span: { start, end: at } });
120
+ }
121
+ tokens.push({ kind: "EOF", raw: "", span: { start: at, end: at } });
122
+ return tokens;
123
+ };
124
+ export const parseLucene = (text, { defaultField = "text", ...context } = {}) => {
125
+ const fail = (reason, span, alternative) => queryError(reason, span, alternative, context);
126
+ if (text.length > QUERY_LIMITS.bytes || new TextEncoder().encode(text).length > QUERY_LIMITS.bytes)
127
+ fail("query.too-large", { start: 0, end: text.length });
128
+ const tokens = tokensOf(text, fail);
129
+ let at = 0;
130
+ let count = 0;
131
+ let depth = 0;
132
+ const peek = () => tokens[at];
133
+ const take = () => tokens[at++];
134
+ const expect = (kind) => {
135
+ if (peek().kind !== kind)
136
+ fail("query.invalid-syntax", peek().span);
137
+ return take();
138
+ };
139
+ const built = (node) => {
140
+ if (++count > QUERY_LIMITS.nodes)
141
+ fail("query.too-large", node.span);
142
+ return node;
143
+ };
144
+ const combine = (clauses, occur) => {
145
+ const first = clauses[0];
146
+ const last = clauses.at(-1);
147
+ if (!first || !last)
148
+ fail("query.invalid-syntax", peek().span);
149
+ if (clauses.length === 1)
150
+ return first;
151
+ return {
152
+ node: built({
153
+ kind: "boolean",
154
+ clauses: clauses.map(({ node, modifier }) => ({ node, occur: modifier ?? occur })),
155
+ span: { start: first.node.span.start, end: last.node.span.end },
156
+ }),
157
+ };
158
+ };
159
+ const query = (field, implicit = false) => {
160
+ if (++depth > QUERY_LIMITS.depth)
161
+ fail("query.too-large", peek().span);
162
+ const clauses = [];
163
+ do {
164
+ clauses.push(disjunction(field, implicit));
165
+ } while (!["EOF", ")"].includes(peek().kind));
166
+ const result = combine(clauses, "must");
167
+ depth--;
168
+ if (result.modifier === "must_not")
169
+ return built({ kind: "boolean", clauses: [{ node: result.node, occur: "must_not" }], span: result.node.span });
170
+ return result.node;
171
+ };
172
+ const disjunction = (field, implicit) => {
173
+ const clauses = [conjunction(field, implicit)];
174
+ while (peek().kind === "OR") {
175
+ take();
176
+ clauses.push(conjunction(field, implicit));
177
+ }
178
+ return combine(clauses, "should");
179
+ };
180
+ const conjunction = (field, implicit) => {
181
+ const clauses = [clause(field, implicit)];
182
+ while (peek().kind === "AND") {
183
+ take();
184
+ clauses.push(clause(field, implicit));
185
+ }
186
+ return combine(clauses, "must");
187
+ };
188
+ const clause = (inherited, inheritedImplicit) => {
189
+ let modifier;
190
+ if (["+", "-", "NOT", "!"].includes(peek().kind))
191
+ modifier = take().kind === "+" ? "must" : "must_not";
192
+ let field = inherited;
193
+ // An error about `field:value` points at the field, where the comparison form already starts.
194
+ let start;
195
+ let implicit = inheritedImplicit;
196
+ if (peek().kind === "term" && [":", "=", "<", ">", "<=", ">="].includes(tokens[at + 1]?.kind ?? "")) {
197
+ const token = take();
198
+ field = decodeEscapes(token.raw, token.span, fail);
199
+ start = token.span.start;
200
+ implicit = false;
201
+ let operator = take();
202
+ if (operator.kind === ":" && ["<", ">", "<=", ">="].includes(peek().kind))
203
+ operator = take();
204
+ if (["<", ">", "<=", ">="].includes(operator.kind)) {
205
+ const value = take();
206
+ if (!["term", "number", "quoted"].includes(value.kind))
207
+ fail("query.invalid-syntax", value.span);
208
+ const decoded = decodeEscapes(value.kind === "quoted" ? value.raw.slice(1, -1) : value.raw, value.span, fail);
209
+ const lower = operator.kind.startsWith(">");
210
+ const node = built({
211
+ kind: "predicate",
212
+ field,
213
+ operator: "range",
214
+ value: lower ? decoded : "*",
215
+ upper: lower ? "*" : decoded,
216
+ lower_inclusive: !lower || operator.kind.endsWith("="),
217
+ upper_inclusive: lower || operator.kind.endsWith("="),
218
+ span: { start: token.span.start, end: value.span.end },
219
+ });
220
+ return { node, ...(modifier ? { modifier } : {}) };
221
+ }
222
+ }
223
+ let node;
224
+ if (peek().kind === "(") {
225
+ const start = take().span.start;
226
+ node = query(field, implicit);
227
+ const end = expect(")").span.end;
228
+ node = { ...node, span: { start, end } };
229
+ }
230
+ else if (["[", "{"].includes(peek().kind)) {
231
+ const opening = take();
232
+ const lower = take();
233
+ if (!["rangeValue", "quoted"].includes(lower.kind))
234
+ fail("query.invalid-syntax", lower.span);
235
+ const separator = take();
236
+ if (separator.raw !== "TO")
237
+ fail("query.invalid-syntax", separator.span);
238
+ const upper = take();
239
+ if (!["rangeValue", "quoted"].includes(upper.kind))
240
+ fail("query.invalid-syntax", upper.span);
241
+ const closing = take();
242
+ if (!["]", "}"].includes(closing.kind))
243
+ fail("query.invalid-syntax", closing.span);
244
+ const decode = (t) => decodeEscapes(t.kind === "quoted" ? t.raw.slice(1, -1) : t.raw, t.span, fail);
245
+ node = built({
246
+ kind: "predicate",
247
+ field,
248
+ operator: "range",
249
+ value: decode(lower),
250
+ upper: decode(upper),
251
+ lower_inclusive: opening.kind === "[",
252
+ upper_inclusive: closing.kind === "]",
253
+ span: { start: start ?? opening.span.start, end: closing.span.end },
254
+ });
255
+ }
256
+ else {
257
+ const token = take();
258
+ if (!["term", "number", "quoted", "regex"].includes(token.kind))
259
+ fail("query.invalid-syntax", token.span);
260
+ const raw = ["term", "number"].includes(token.kind) ? token.raw : token.raw.slice(1, -1);
261
+ if (field === "fn")
262
+ fail("query.unsupported-operator", token.span, "interval functions are not supported");
263
+ const wildcard = ["term", "number"].includes(token.kind) && /(?<!\\)[*?]/u.test(raw);
264
+ node = built({
265
+ kind: "predicate",
266
+ field,
267
+ operator: token.kind === "regex" ? "regex" : token.kind === "quoted" ? "phrase" : wildcard ? "wildcard" : "term",
268
+ value: token.kind === "regex" || wildcard ? raw : decodeEscapes(raw, token.span, fail),
269
+ span: { start: start ?? token.span.start, end: token.span.end },
270
+ ...(implicit ? { implicit: true } : {}),
271
+ });
272
+ }
273
+ if (peek().kind === "~")
274
+ fail("query.unsupported-operator", peek().span, node.kind === "predicate" && node.operator === "phrase"
275
+ ? "proximity (~) is not supported — drop the ~ for the exact phrase, or join the words with AND"
276
+ : "fuzzy matching (~) is not supported — use a prefix such as word* to catch word forms");
277
+ if (["^", "@"].includes(peek().kind))
278
+ fail("query.unsupported-operator", peek().span, "boost and minimum-should-match are not supported");
279
+ return { node, ...(modifier ? { modifier } : {}) };
280
+ };
281
+ const root = query(defaultField, true);
282
+ expect("EOF");
283
+ if (defaultField === "none") {
284
+ const bare = walkQuery(root).find((node) => node.implicit);
285
+ if (bare)
286
+ queryError("query.bare-word", bare.span, `"${bare.value}" has no field; write field:value`, context, {
287
+ word: bare.value,
288
+ });
289
+ }
290
+ return { version: 1, language: "lucene-v1", root };
291
+ };
292
+ /** Bare terms eligible for forgiving retrieval; explicit syntax keeps strict semantics. */
293
+ export const implicitTextTerms = (text) => {
294
+ const tokens = tokensOf(text);
295
+ if (tokens.some(({ kind }) => ["AND", "OR", "NOT", "+", "-", "!", "(", ")"].includes(kind)))
296
+ return new Set();
297
+ return new Set(tokens.flatMap((token, index) => token.kind === "term" &&
298
+ ![":", "=", "<", ">", "<=", ">="].includes(tokens[index - 1]?.kind ?? "") &&
299
+ ![":", "=", "<", ">", "<=", ">="].includes(tokens[index + 1]?.kind ?? "")
300
+ ? [token.span.start]
301
+ : []));
302
+ };
303
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/query/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { FieldSpec, QueryRegistry } from "./fields.js";
2
+ /** A field as `commands --json` carries it: everything but the hook. */
3
+ export type FieldInfo = Omit<FieldSpec, "validate">;
4
+ export interface QueryInfo extends Omit<QueryRegistry, "fields"> {
5
+ fields: FieldInfo[];
6
+ }
7
+ export declare const describeQuery: (registry: QueryRegistry) => QueryInfo;
8
+ /** Why an example or default term would not run against these fields, per field name; empty when every one runs. */
9
+ export declare const exampleProblems: (registry: QueryRegistry) => {
10
+ field: string;
11
+ problem: string;
12
+ }[];
13
+ /** One list's query: field names unique and snake_case, every example and default runs. Throws naming every problem. */
14
+ export declare const defineQuery: (registry: QueryRegistry) => QueryRegistry;
15
+ /** The query reasons every CLI shares; a CLI adds its own (`query.invalid-tag`) with `defineReasons`. */
16
+ export declare const QUERY_REASONS: {
17
+ reason: string;
18
+ code: "authentication_error" | "cancelled" | "configuration_error" | "confirmation_required" | "internal_error" | "invalid_response" | "network_error" | "not_found" | "outcome_unknown" | "permission_error" | "provider_error" | "provider_unavailable" | "rate_limited" | "timeout" | "validation_error";
19
+ message: string;
20
+ details: string[];
21
+ step?: string | undefined;
22
+ }[];
23
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/query/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAK3D,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;AACnD,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;IAC9D,MAAM,EAAE,SAAS,EAAE,CAAA;CACpB;AAED,eAAO,MAAM,aAAa,aAAc,aAAa,KAAG,SAKtD,CAAA;AAEF,oHAAoH;AACpH,eAAO,MAAM,eAAe,aAAc,aAAa,KAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAoB3F,CAAA;AAED,wHAAwH;AACxH,eAAO,MAAM,WAAW,aAAc,aAAa,KAAG,aASrD,CAAA;AAID,yGAAyG;AACzG,eAAO,MAAM,aAAa;;;;;;GA6BzB,CAAA"}
@@ -0,0 +1,77 @@
1
+ import { isCliError } from "../errors.js";
2
+ import { defineReasons } from "../standards/errors.js";
3
+ import { duplicates, RegistryError, SNAKE_CASE } from "../standards/registry.js";
4
+ import { parseLucene } from "./parser.js";
5
+ import { walkQuery } from "./types.js";
6
+ import { validateQuery } from "./validate.js";
7
+ export const describeQuery = (registry) => ({
8
+ entity: registry.entity,
9
+ backend: registry.backend,
10
+ fields: registry.fields.map(({ validate: _, ...field }) => field),
11
+ ...(registry.defaults && registry.defaults.length > 0 ? { defaults: [...registry.defaults] } : {}),
12
+ });
13
+ /** Why an example or default term would not run against these fields, per field name; empty when every one runs. */
14
+ export const exampleProblems = (registry) => {
15
+ // An example proves syntax and type; whether a provider filters the field is the list's answer at run time.
16
+ const syntaxOnly = { ...registry, backend: "sql" };
17
+ const problem = (text, field) => {
18
+ try {
19
+ const named = walkQuery(validateQuery(parseLucene(text, { defaultField: "none" }), syntaxOnly).root);
20
+ return named.every((node) => node.field === field) ? undefined : `"${text}" does not name ${field}`;
21
+ }
22
+ catch (failure) {
23
+ if (!isCliError(failure))
24
+ throw failure;
25
+ return `"${text}": ${failure.message}`;
26
+ }
27
+ };
28
+ const defaults = (registry.defaults ?? []).map((term) => {
29
+ const field = term.replace(/^-/, "").split(/[:<>=]/)[0] ?? "";
30
+ return { field, problem: problem(term.replace(/^-/, ""), field) };
31
+ });
32
+ return [
33
+ ...registry.fields.map((field) => ({ field: field.name, problem: problem(field.example, field.name) })),
34
+ ...defaults,
35
+ ].filter((entry) => entry.problem !== undefined);
36
+ };
37
+ /** One list's query: field names unique and snake_case, every example and default runs. Throws naming every problem. */
38
+ export const defineQuery = (registry) => {
39
+ const names = registry.fields.map((field) => field.name);
40
+ const problems = [
41
+ ...duplicates(names).map((name) => `"${name}" is listed twice`),
42
+ ...names.filter((name) => !SNAKE_CASE.test(name)).map((name) => `"${name}" is not snake_case`),
43
+ ...exampleProblems(registry).map(({ field, problem }) => `${field}: ${problem}`),
44
+ ];
45
+ if (problems.length > 0)
46
+ throw new RegistryError(`${registry.entity} query`, problems);
47
+ return registry;
48
+ };
49
+ const SPAN = ["span", "alternative", "guide"];
50
+ /** The query reasons every CLI shares; a CLI adds its own (`query.invalid-tag`) with `defineReasons`. */
51
+ export const QUERY_REASONS = defineReasons([
52
+ ["query.bare-word", "a word in the query has no field", ["word"]],
53
+ ["query.invalid-ast", "the query tree is not valid", []],
54
+ ["query.invalid-date", "a date in the query cannot be read", []],
55
+ ["query.invalid-escape", "an escape in the query is not valid", []],
56
+ ["query.invalid-number", "a number in the query cannot be read", []],
57
+ ["query.invalid-regex", "a regular expression in the query is not valid", []],
58
+ ["query.invalid-syntax", "the query cannot be parsed", []],
59
+ ["query.invalid-timezone", "the time zone is not known", []],
60
+ ["query.missing-value", "a field in the query has no value", []],
61
+ ["query.too-large", "the query is over one of its limits", []],
62
+ ["query.unclosed-literal", "a quote or bracket in the query is not closed", []],
63
+ ["query.unknown-field", "a field in the query is not known", ["fields"]],
64
+ ["query.unknown-value", "a value in the query is not known", []],
65
+ ["query.unsupported-field", "this list cannot filter by that field", ["supported"]],
66
+ ["query.unsupported-operator", "this field does not take that operator", []],
67
+ ["query.unsupported-placement", "this field works only as a required term", []],
68
+ ["query.unsupported-regex", "that regular expression is not supported", []],
69
+ ["query.unsupported-regex-flags", "regular expression flags are not supported", []],
70
+ ["query.unsupported-version", "the query version is not supported", []],
71
+ ].map(([reason, message, details]) => ({
72
+ reason,
73
+ code: "validation_error",
74
+ message,
75
+ details: [...SPAN, ...details],
76
+ })));
77
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/query/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import * as v from "valibot";
2
+ export declare const QUERY_LIMITS: {
3
+ readonly bytes: 8192;
4
+ readonly depth: 32;
5
+ readonly nodes: 256;
6
+ };
7
+ export type Span = {
8
+ start: number;
9
+ end: number;
10
+ };
11
+ export type Occur = "must" | "should" | "must_not";
12
+ export type Operator = "term" | "phrase" | "wildcard" | "regex" | "range";
13
+ export interface Predicate {
14
+ kind: "predicate";
15
+ field: string;
16
+ operator: Operator;
17
+ value: string;
18
+ upper?: string;
19
+ lower_inclusive?: boolean;
20
+ upper_inclusive?: boolean;
21
+ span: Span;
22
+ /** A bare word, under no field. */
23
+ implicit?: true;
24
+ }
25
+ export type QueryNode = Predicate | {
26
+ kind: "boolean";
27
+ clauses: {
28
+ occur: Occur;
29
+ node: QueryNode;
30
+ }[];
31
+ span: Span;
32
+ };
33
+ export interface QueryAst {
34
+ version: 1;
35
+ language: "lucene-v1";
36
+ root: QueryNode;
37
+ }
38
+ export declare const queryNodeSchema: v.GenericSchema<QueryNode>;
39
+ /** The parsed tree as JSON: what an MCP `ast` argument and a saved search carry. */
40
+ export declare const queryAstSchema: v.ObjectSchema<{
41
+ readonly version: v.LiteralSchema<1, undefined>;
42
+ readonly language: v.LiteralSchema<"lucene-v1", undefined>;
43
+ readonly root: v.GenericSchema<QueryNode>;
44
+ }, undefined>;
45
+ /** Who reports a query error: `chats list`, `search`. Without it the message starts with `query:`. */
46
+ export interface QueryContext {
47
+ command?: string;
48
+ /** Where the query language is explained. */
49
+ guide?: string;
50
+ }
51
+ export declare function queryError(reason: string, span: Span, alternative?: string, context?: QueryContext, details?: Record<string, unknown>): never;
52
+ export declare const walkQuery: (node: QueryNode) => Predicate[];
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAG5B,eAAO,MAAM,YAAY;aACvB,KAAK,EAAE,IAAI;aACX,KAAK,EAAE,EAAE;aACT,KAAK,EAAE,GAAG;CACF,CAAA;AAEV,MAAM,MAAM,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AACjD,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAA;AAClD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAA;AACzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,IAAI,EAAE,IAAI,CAAA;IACV,mCAAmC;IACnC,QAAQ,CAAC,EAAE,IAAI,CAAA;CAChB;AACD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAA;AACjH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,CAAC,CAAA;IACV,QAAQ,EAAE,WAAW,CAAA;IACrB,IAAI,EAAE,SAAS,CAAA;CAChB;AAcD,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,aAAa,CAAC,SAAS,CASrD,CAAA;AACF,oFAAoF;AACpF,eAAO,MAAM,cAAc;;;;aAIzB,CAAA;AAEF,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,YAAiB,EAC1B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,KAAK,CAYP;AAED,eAAO,MAAM,SAAS,SAAU,SAAS,KAAG,SAAS,EACqC,CAAA"}
@@ -0,0 +1,44 @@
1
+ import * as v from "valibot";
2
+ import { CliError } from "../errors.js";
3
+ export const QUERY_LIMITS = {
4
+ bytes: 8192,
5
+ depth: 32,
6
+ nodes: 256,
7
+ };
8
+ const spanSchema = v.object({ start: v.number(), end: v.number() });
9
+ const predicateSchema = v.object({
10
+ kind: v.literal("predicate"),
11
+ field: v.string(),
12
+ operator: v.picklist(["term", "phrase", "wildcard", "regex", "range"]),
13
+ value: v.string(),
14
+ upper: v.optional(v.string()),
15
+ lower_inclusive: v.optional(v.boolean()),
16
+ upper_inclusive: v.optional(v.boolean()),
17
+ span: spanSchema,
18
+ implicit: v.optional(v.literal(true)),
19
+ });
20
+ export const queryNodeSchema = v.variant("kind", [
21
+ predicateSchema,
22
+ v.object({
23
+ kind: v.literal("boolean"),
24
+ clauses: v.array(v.object({ occur: v.picklist(["must", "should", "must_not"]), node: v.lazy(() => queryNodeSchema) })),
25
+ span: spanSchema,
26
+ }),
27
+ ]);
28
+ /** The parsed tree as JSON: what an MCP `ast` argument and a saved search carry. */
29
+ export const queryAstSchema = v.object({
30
+ version: v.literal(1),
31
+ language: v.literal("lucene-v1"),
32
+ root: queryNodeSchema,
33
+ });
34
+ export function queryError(reason, span, alternative, context = {}, details = {}) {
35
+ throw new CliError("validation_error", `${context.command ?? "query"}: ${reason} at position ${span.start + 1}${alternative ? ` — ${alternative}` : ""}`, {
36
+ reason,
37
+ span,
38
+ ...(alternative ? { alternative } : {}),
39
+ ...(context.guide ? { guide: context.guide } : {}),
40
+ ...details,
41
+ });
42
+ }
43
+ export const walkQuery = (node) => node.kind === "predicate" ? [node] : node.clauses.flatMap(({ node }) => walkQuery(node));
44
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { QueryRegistry } from "./fields.js";
2
+ import { type QueryAst, type QueryContext } from "./types.js";
3
+ export interface ValidateOptions extends QueryContext {
4
+ /** Day boundaries in time values; validity does not depend on it but for a day a zone skips. */
5
+ zone?: string;
6
+ }
7
+ /** Checks every term against the list's fields: name, operator, value by type, placement, the field's own hook. */
8
+ export declare const validateQuery: (ast: QueryAst, registry: QueryRegistry, options?: ValidateOptions) => QueryAst;
9
+ /** The fields a query names, so a default on a field the query names is lifted. */
10
+ export declare const fieldsNamed: (ast: QueryAst) => Set<string>;
11
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/query/validate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAyC,MAAM,YAAY,CAAA;AAEpH,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAiDD,mHAAmH;AACnH,eAAO,MAAM,aAAa,QAAS,QAAQ,YAAY,aAAa,YAAW,eAAe,KAAQ,QAiCrG,CAAA;AAED,mFAAmF;AACnF,eAAO,MAAM,WAAW,QAAS,QAAQ,KAAG,GAAG,CAAC,MAAM,CAA2D,CAAA"}