@solidnumber/cli 1.20.1 → 1.25.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.
@@ -0,0 +1,88 @@
1
+ /**
2
+ * sparql-bgp — minimal SPARQL Basic Graph Pattern engine for JSON-LD.
3
+ *
4
+ * Sprint: SPRINT-JSONLD-GRAPH-MOAT.md § A+.5
5
+ *
6
+ * What's supported (intentionally small):
7
+ *
8
+ * PREFIX schema: <http://schema.org/>
9
+ * PREFIX solid: <https://solidnumber.com/vocab#>
10
+ *
11
+ * SELECT ?s ?type
12
+ * WHERE {
13
+ * ?s a schema:Service . # `a` is sugar for rdf:type
14
+ * ?s schema:provider <https://...> . # full IRI
15
+ * ?s schema:name ?name .
16
+ * }
17
+ *
18
+ * What's NOT supported (out of scope for v1; spec calls these out):
19
+ * - OPTIONAL { ... }
20
+ * - FILTER (regex(?x, "..."))
21
+ * - Property paths (?s schema:knows+ ?o)
22
+ * - UNION / MINUS
23
+ * - GROUP BY / ORDER BY / LIMIT (you can pipe through `head`/`sort`)
24
+ * - Named graphs / GRAPH ?g { ... }
25
+ *
26
+ * That gets us 80% of "find me X where Y" without writing a real
27
+ * SPARQL engine. For the other 20%, point apache-jena-fuseki at the
28
+ * RDF export from `solid graph --dump nquads`.
29
+ *
30
+ * Design notes
31
+ * ------------
32
+ * - Matcher is in-memory; the JsonLdDocument is the entire dataset.
33
+ * - Triples are `(subject, predicate, object)` where each component
34
+ * is a Term: variable, IRI, or literal.
35
+ * - JSON-LD edges are subject's predicate values that have shape
36
+ * `"<some-iri>"` (string IRI) or `{"@id": "<some-iri>"}`. Both are
37
+ * valid in our vocab; the matcher treats them uniformly.
38
+ * - `@context` aliases (e.g. `name` → `schema:name`) are NOT auto-
39
+ * expanded in the matcher; queries should use full IRIs or
40
+ * prefixed names. This is intentional: it keeps the query
41
+ * grammar small and means the same query works against an
42
+ * `expand`-ed JSON-LD doc too.
43
+ */
44
+ import type { JsonLdDocument } from './graph-walker';
45
+ export type Term = {
46
+ kind: 'var';
47
+ name: string;
48
+ } | {
49
+ kind: 'iri';
50
+ value: string;
51
+ } | {
52
+ kind: 'literal';
53
+ value: string;
54
+ };
55
+ export interface Triple {
56
+ s: Term;
57
+ p: Term;
58
+ o: Term;
59
+ }
60
+ export interface Query {
61
+ prefixes: Record<string, string>;
62
+ selectVars: string[];
63
+ selectAll: boolean;
64
+ where: Triple[];
65
+ }
66
+ export type Bindings = Record<string, string>;
67
+ export interface QueryResult {
68
+ /** Variable names from SELECT, in declaration order. */
69
+ vars: string[];
70
+ /** Each row is one full binding for the SELECT variables. */
71
+ bindings: Bindings[];
72
+ }
73
+ export declare function parseQuery(text: string): Query;
74
+ interface DataTriple {
75
+ s: string;
76
+ p: string;
77
+ o: string;
78
+ }
79
+ /** Materialize a JsonLdDocument as flat (s, p, o) triples. We expand
80
+ * list-valued predicates so a node with `handles: ["a", "b"]` becomes
81
+ * two triples. `@type` becomes `rdf:type` triples (one per type). */
82
+ export declare function materializeTriples(doc: JsonLdDocument): DataTriple[];
83
+ /** Run a parsed query against a JSON-LD document. */
84
+ export declare function runQuery(query: Query, doc: JsonLdDocument): QueryResult;
85
+ /** Convenience: parse + run in one call. */
86
+ export declare function query(text: string, doc: JsonLdDocument): QueryResult;
87
+ export {};
88
+ //# sourceMappingURL=sparql-bgp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparql-bgp.d.ts","sourceRoot":"","sources":["../../src/lib/sparql-bgp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAKjE,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,IAAI,CAAC;IACR,CAAC,EAAE,IAAI,CAAC;IACR,CAAC,EAAE,IAAI,CAAC;CACT;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6DAA6D;IAC7D,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACtB;AASD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CA4D9C;AA8GD,UAAU,UAAU;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAuBD;;sEAEsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,UAAU,EAAE,CAmCpE;AAyDD,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,GAAG,WAAW,CA2CvE;AAED,4CAA4C;AAC5C,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,WAAW,CAEpE"}
@@ -0,0 +1,386 @@
1
+ "use strict";
2
+ /**
3
+ * sparql-bgp — minimal SPARQL Basic Graph Pattern engine for JSON-LD.
4
+ *
5
+ * Sprint: SPRINT-JSONLD-GRAPH-MOAT.md § A+.5
6
+ *
7
+ * What's supported (intentionally small):
8
+ *
9
+ * PREFIX schema: <http://schema.org/>
10
+ * PREFIX solid: <https://solidnumber.com/vocab#>
11
+ *
12
+ * SELECT ?s ?type
13
+ * WHERE {
14
+ * ?s a schema:Service . # `a` is sugar for rdf:type
15
+ * ?s schema:provider <https://...> . # full IRI
16
+ * ?s schema:name ?name .
17
+ * }
18
+ *
19
+ * What's NOT supported (out of scope for v1; spec calls these out):
20
+ * - OPTIONAL { ... }
21
+ * - FILTER (regex(?x, "..."))
22
+ * - Property paths (?s schema:knows+ ?o)
23
+ * - UNION / MINUS
24
+ * - GROUP BY / ORDER BY / LIMIT (you can pipe through `head`/`sort`)
25
+ * - Named graphs / GRAPH ?g { ... }
26
+ *
27
+ * That gets us 80% of "find me X where Y" without writing a real
28
+ * SPARQL engine. For the other 20%, point apache-jena-fuseki at the
29
+ * RDF export from `solid graph --dump nquads`.
30
+ *
31
+ * Design notes
32
+ * ------------
33
+ * - Matcher is in-memory; the JsonLdDocument is the entire dataset.
34
+ * - Triples are `(subject, predicate, object)` where each component
35
+ * is a Term: variable, IRI, or literal.
36
+ * - JSON-LD edges are subject's predicate values that have shape
37
+ * `"<some-iri>"` (string IRI) or `{"@id": "<some-iri>"}`. Both are
38
+ * valid in our vocab; the matcher treats them uniformly.
39
+ * - `@context` aliases (e.g. `name` → `schema:name`) are NOT auto-
40
+ * expanded in the matcher; queries should use full IRIs or
41
+ * prefixed names. This is intentional: it keeps the query
42
+ * grammar small and means the same query works against an
43
+ * `expand`-ed JSON-LD doc too.
44
+ */
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.parseQuery = parseQuery;
47
+ exports.materializeTriples = materializeTriples;
48
+ exports.runQuery = runQuery;
49
+ exports.query = query;
50
+ // ---------------------------------------------------------------------------
51
+ // Parser — lean recursive descent, tolerant of whitespace and comments.
52
+ //
53
+ // Comments use `#` to end-of-line, matching SPARQL. We don't support
54
+ // the `BASE <iri>` directive (rare in practice; full IRIs work).
55
+ // ---------------------------------------------------------------------------
56
+ function parseQuery(text) {
57
+ const stripped = text
58
+ .split('\n')
59
+ .map((line) => {
60
+ // Strip trailing # comments but preserve content inside quoted strings.
61
+ // Safe simplification: a # outside a string starts a comment.
62
+ let inQuote = false;
63
+ for (let i = 0; i < line.length; i++) {
64
+ if (line[i] === '"' && line[i - 1] !== '\\')
65
+ inQuote = !inQuote;
66
+ if (line[i] === '#' && !inQuote)
67
+ return line.slice(0, i);
68
+ }
69
+ return line;
70
+ })
71
+ .join(' ')
72
+ .replace(/\s+/g, ' ')
73
+ .trim();
74
+ const prefixes = {
75
+ // Always-on prefixes so users don't have to declare what's in the
76
+ // tenant @context. Aligned with services/ai_context_jsonld.py.
77
+ schema: 'http://schema.org/',
78
+ solid: 'https://solidnumber.com/vocab#',
79
+ rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
80
+ };
81
+ // Walk PREFIX declarations.
82
+ let cursor = stripped;
83
+ const prefixRe = /^PREFIX\s+(\w+):\s+<([^>]+)>\s*/i;
84
+ // eslint-disable-next-line no-constant-condition
85
+ while (true) {
86
+ const m = cursor.match(prefixRe);
87
+ if (!m)
88
+ break;
89
+ prefixes[m[1]] = m[2];
90
+ cursor = cursor.slice(m[0].length);
91
+ }
92
+ // SELECT clause
93
+ const selectRe = /^SELECT\s+(DISTINCT\s+)?(.+?)\s+WHERE\s*\{(.+)\}\s*$/is;
94
+ const sel = cursor.match(selectRe);
95
+ if (!sel) {
96
+ throw new Error('Query parse error: expected `SELECT ... WHERE { ... }`');
97
+ }
98
+ const selVarsRaw = sel[2].trim();
99
+ let selectAll = false;
100
+ let selectVars = [];
101
+ if (selVarsRaw === '*') {
102
+ selectAll = true;
103
+ }
104
+ else {
105
+ selectVars = selVarsRaw.split(/\s+/).map((v) => {
106
+ if (!v.startsWith('?')) {
107
+ throw new Error(`Query parse error: SELECT vars must start with '?', got '${v}'`);
108
+ }
109
+ return v.slice(1);
110
+ });
111
+ }
112
+ const whereBody = sel[3].trim();
113
+ const triples = parseTriples(whereBody, prefixes);
114
+ return { prefixes, selectVars, selectAll, where: triples };
115
+ }
116
+ function parseTriples(body, prefixes) {
117
+ // Triples are `.`-delimited, BUT `.` can appear inside `<...>` IRIs
118
+ // (`https://solidnumber.com/...`) and inside `"..."` literals. Split
119
+ // statefully so we only treat top-level dots as terminators.
120
+ const parts = [];
121
+ let buf = '';
122
+ let inIri = false;
123
+ let inLit = false;
124
+ for (let i = 0; i < body.length; i++) {
125
+ const ch = body[i];
126
+ if (!inLit && ch === '<') {
127
+ inIri = true;
128
+ buf += ch;
129
+ continue;
130
+ }
131
+ if (inIri && ch === '>') {
132
+ inIri = false;
133
+ buf += ch;
134
+ continue;
135
+ }
136
+ if (!inIri && ch === '"' && body[i - 1] !== '\\') {
137
+ inLit = !inLit;
138
+ buf += ch;
139
+ continue;
140
+ }
141
+ if (ch === '.' && !inIri && !inLit) {
142
+ const trimmed = buf.trim();
143
+ if (trimmed)
144
+ parts.push(trimmed);
145
+ buf = '';
146
+ continue;
147
+ }
148
+ buf += ch;
149
+ }
150
+ const tail = buf.trim();
151
+ if (tail)
152
+ parts.push(tail);
153
+ return parts.map((p) => parseTriple(p, prefixes));
154
+ }
155
+ function parseTriple(text, prefixes) {
156
+ // Tokenize: variables, IRIs in <>, prefixed names, literals in "".
157
+ const tokens = [];
158
+ let i = 0;
159
+ while (i < text.length) {
160
+ const ch = text[i];
161
+ if (/\s/.test(ch)) {
162
+ i++;
163
+ continue;
164
+ }
165
+ if (ch === '<') {
166
+ const end = text.indexOf('>', i);
167
+ if (end === -1)
168
+ throw new Error(`Unclosed IRI: ${text}`);
169
+ tokens.push(text.slice(i, end + 1));
170
+ i = end + 1;
171
+ continue;
172
+ }
173
+ if (ch === '"') {
174
+ let end = i + 1;
175
+ while (end < text.length && !(text[end] === '"' && text[end - 1] !== '\\'))
176
+ end++;
177
+ if (end >= text.length)
178
+ throw new Error(`Unclosed literal: ${text}`);
179
+ tokens.push(text.slice(i, end + 1));
180
+ i = end + 1;
181
+ continue;
182
+ }
183
+ // Identifier or variable: contiguous non-whitespace
184
+ let end = i;
185
+ while (end < text.length && !/\s/.test(text[end]))
186
+ end++;
187
+ tokens.push(text.slice(i, end));
188
+ i = end;
189
+ }
190
+ if (tokens.length !== 3) {
191
+ throw new Error(`Each triple must have 3 terms; got ${tokens.length}: ${text}`);
192
+ }
193
+ const [sTok, pTok, oTok] = tokens;
194
+ return {
195
+ s: parseTerm(sTok, prefixes, 'subject'),
196
+ p: parseTerm(pTok === 'a' ? 'rdf:type' : pTok, prefixes, 'predicate'),
197
+ o: parseTerm(oTok, prefixes, 'object'),
198
+ };
199
+ }
200
+ function parseTerm(token, prefixes, _pos) {
201
+ if (token.startsWith('?')) {
202
+ return { kind: 'var', name: token.slice(1) };
203
+ }
204
+ if (token.startsWith('<') && token.endsWith('>')) {
205
+ return { kind: 'iri', value: token.slice(1, -1) };
206
+ }
207
+ if (token.startsWith('"') && token.endsWith('"')) {
208
+ return { kind: 'literal', value: token.slice(1, -1) };
209
+ }
210
+ // Numeric literal — keep as string, the matcher will coerce both sides.
211
+ if (/^-?\d+(\.\d+)?$/.test(token)) {
212
+ return { kind: 'literal', value: token };
213
+ }
214
+ // Prefixed name `prefix:local`
215
+ const colon = token.indexOf(':');
216
+ if (colon > 0) {
217
+ const prefix = token.slice(0, colon);
218
+ const local = token.slice(colon + 1);
219
+ if (prefixes[prefix] !== undefined) {
220
+ return { kind: 'iri', value: prefixes[prefix] + local };
221
+ }
222
+ }
223
+ throw new Error(`Cannot parse term: '${token}' (use ?var, <iri>, prefix:name, or "literal")`);
224
+ }
225
+ const RESERVED_PREDICATE_KEYS = new Set(['@id', '@context', '@type']);
226
+ function valueToObjectIri(v) {
227
+ if (typeof v === 'string')
228
+ return v;
229
+ if (v && typeof v === 'object' && '@id' in v) {
230
+ const id = v['@id'];
231
+ return typeof id === 'string' ? id : null;
232
+ }
233
+ return null;
234
+ }
235
+ function valueToLiteral(v) {
236
+ if (typeof v === 'string')
237
+ return v;
238
+ if (typeof v === 'number' || typeof v === 'boolean')
239
+ return String(v);
240
+ if (v && typeof v === 'object' && '@value' in v) {
241
+ const lit = v['@value'];
242
+ return lit == null ? null : String(lit);
243
+ }
244
+ return null;
245
+ }
246
+ /** Materialize a JsonLdDocument as flat (s, p, o) triples. We expand
247
+ * list-valued predicates so a node with `handles: ["a", "b"]` becomes
248
+ * two triples. `@type` becomes `rdf:type` triples (one per type). */
249
+ function materializeTriples(doc) {
250
+ const out = [];
251
+ const RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';
252
+ for (const node of doc.graph ?? []) {
253
+ if (!node || typeof node !== 'object')
254
+ continue;
255
+ const subj = node['@id'];
256
+ if (typeof subj !== 'string')
257
+ continue;
258
+ // @type → rdf:type triples
259
+ const t = node['@type'];
260
+ const types = Array.isArray(t) ? t : t ? [t] : [];
261
+ for (const ty of types) {
262
+ out.push({ s: subj, p: RDF_TYPE, o: String(ty) });
263
+ }
264
+ // Other predicates
265
+ for (const [pred, val] of Object.entries(node)) {
266
+ if (RESERVED_PREDICATE_KEYS.has(pred))
267
+ continue;
268
+ const values = Array.isArray(val) ? val : [val];
269
+ for (const v of values) {
270
+ // Try as IRI first (edge), then literal (data property).
271
+ const asIri = valueToObjectIri(v);
272
+ if (asIri !== null) {
273
+ out.push({ s: subj, p: pred, o: asIri });
274
+ continue;
275
+ }
276
+ const asLit = valueToLiteral(v);
277
+ if (asLit !== null) {
278
+ out.push({ s: subj, p: pred, o: asLit });
279
+ }
280
+ }
281
+ }
282
+ }
283
+ return out;
284
+ }
285
+ function termValue(t) {
286
+ switch (t.kind) {
287
+ case 'iri':
288
+ case 'literal':
289
+ return t.value;
290
+ case 'var':
291
+ return ''; // unreachable when caller checks kind first
292
+ }
293
+ }
294
+ function matchTerm(t, value, bindings) {
295
+ if (t.kind === 'var') {
296
+ const existing = bindings[t.name];
297
+ if (existing !== undefined) {
298
+ return existing === value ? bindings : null;
299
+ }
300
+ return { ...bindings, [t.name]: value };
301
+ }
302
+ return termValue(t) === value ? bindings : null;
303
+ }
304
+ /** Expand a JSON-LD term against the query's resolved aliases. We
305
+ * also accept short predicate names (like `name` / `provider`) and
306
+ * match them against the materialized triple's predicate as-is —
307
+ * the materializer keeps the original shorthand on triples that came
308
+ * from compact JSON-LD, so query like `?s name ?n` works against the
309
+ * compact form too. (Real SPARQL would require expansion; we cheat
310
+ * to keep ergonomics good. Documented in the JSDoc above.) */
311
+ function predicateCandidates(t) {
312
+ if (t.kind === 'var')
313
+ return [];
314
+ return [termValue(t)];
315
+ }
316
+ function matchTriple(pattern, data, bindings) {
317
+ const out = [];
318
+ const predFilters = predicateCandidates(pattern.p);
319
+ for (const d of data) {
320
+ if (pattern.p.kind !== 'var' && !predFilters.includes(d.p))
321
+ continue;
322
+ let b = bindings;
323
+ b = matchTerm(pattern.s, d.s, b);
324
+ if (b === null)
325
+ continue;
326
+ b = matchTerm(pattern.p, d.p, b);
327
+ if (b === null)
328
+ continue;
329
+ b = matchTerm(pattern.o, d.o, b);
330
+ if (b === null)
331
+ continue;
332
+ out.push(b);
333
+ }
334
+ return out;
335
+ }
336
+ /** Run a parsed query against a JSON-LD document. */
337
+ function runQuery(query, doc) {
338
+ const data = materializeTriples(doc);
339
+ let solutions = [{}];
340
+ for (const pattern of query.where) {
341
+ const next = [];
342
+ for (const partial of solutions) {
343
+ next.push(...matchTriple(pattern, data, partial));
344
+ }
345
+ solutions = next;
346
+ if (solutions.length === 0)
347
+ break;
348
+ }
349
+ // Project to selected vars. SELECT * means "every variable that
350
+ // appears anywhere in WHERE."
351
+ let vars;
352
+ if (query.selectAll) {
353
+ const seen = new Set();
354
+ for (const t of query.where) {
355
+ for (const term of [t.s, t.p, t.o]) {
356
+ if (term.kind === 'var')
357
+ seen.add(term.name);
358
+ }
359
+ }
360
+ vars = [...seen];
361
+ }
362
+ else {
363
+ vars = query.selectVars;
364
+ }
365
+ // De-duplicate rows (DISTINCT-by-default for projection).
366
+ const seenRows = new Set();
367
+ const projected = [];
368
+ for (const sol of solutions) {
369
+ const row = {};
370
+ for (const v of vars) {
371
+ if (sol[v] !== undefined)
372
+ row[v] = sol[v];
373
+ }
374
+ const key = JSON.stringify(row);
375
+ if (seenRows.has(key))
376
+ continue;
377
+ seenRows.add(key);
378
+ projected.push(row);
379
+ }
380
+ return { vars, bindings: projected };
381
+ }
382
+ /** Convenience: parse + run in one call. */
383
+ function query(text, doc) {
384
+ return runQuery(parseQuery(text), doc);
385
+ }
386
+ //# sourceMappingURL=sparql-bgp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparql-bgp.js","sourceRoot":"","sources":["../../src/lib/sparql-bgp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidnumber/cli",
3
- "version": "1.20.1",
3
+ "version": "1.25.0",
4
4
  "description": "AI business infrastructure from the terminal — CRM, payments, voice AI, 116 agents, 52 industry templates. solid clone plumber → instant business. Also: programmatic TS SDK via @solidnumber/cli/sdk.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -86,6 +86,7 @@
86
86
  "figures": "^6.1.0",
87
87
  "gradient-string": "^3.0.0",
88
88
  "inquirer": "^9.2.0",
89
+ "jsonld": "^9.0.0",
89
90
  "ora": "^8.0.0",
90
91
  "update-notifier": "^7.3.1"
91
92
  },