@solidnumber/cli 1.16.2 → 1.19.5

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 (79) hide show
  1. package/README.md +2 -1
  2. package/dist/commands/accounting.js +3 -0
  3. package/dist/commands/accounting.js.map +1 -1
  4. package/dist/commands/analytics.js +2 -0
  5. package/dist/commands/analytics.js.map +1 -1
  6. package/dist/commands/audit.js +9 -0
  7. package/dist/commands/audit.js.map +1 -1
  8. package/dist/commands/billing.js +16 -0
  9. package/dist/commands/billing.js.map +1 -1
  10. package/dist/commands/context.d.ts.map +1 -1
  11. package/dist/commands/context.js +51 -12
  12. package/dist/commands/context.js.map +1 -1
  13. package/dist/commands/crm.js +15 -0
  14. package/dist/commands/crm.js.map +1 -1
  15. package/dist/commands/dashboard.d.ts.map +1 -1
  16. package/dist/commands/dashboard.js +1 -0
  17. package/dist/commands/dashboard.js.map +1 -1
  18. package/dist/commands/demo.js +4 -1
  19. package/dist/commands/demo.js.map +1 -1
  20. package/dist/commands/dev.js +1 -0
  21. package/dist/commands/dev.js.map +1 -1
  22. package/dist/commands/domains.js +5 -0
  23. package/dist/commands/domains.js.map +1 -1
  24. package/dist/commands/export.js +1 -0
  25. package/dist/commands/export.js.map +1 -1
  26. package/dist/commands/graph.d.ts +26 -0
  27. package/dist/commands/graph.d.ts.map +1 -0
  28. package/dist/commands/graph.js +355 -0
  29. package/dist/commands/graph.js.map +1 -0
  30. package/dist/commands/inventory.js +5 -0
  31. package/dist/commands/inventory.js.map +1 -1
  32. package/dist/commands/kb.js +47 -0
  33. package/dist/commands/kb.js.map +1 -1
  34. package/dist/commands/llms.js +2 -0
  35. package/dist/commands/llms.js.map +1 -1
  36. package/dist/commands/logs.d.ts.map +1 -1
  37. package/dist/commands/logs.js +2 -0
  38. package/dist/commands/logs.js.map +1 -1
  39. package/dist/commands/notifications.js +1 -0
  40. package/dist/commands/notifications.js.map +1 -1
  41. package/dist/commands/pages.js +4 -0
  42. package/dist/commands/pages.js.map +1 -1
  43. package/dist/commands/payment.js +8 -0
  44. package/dist/commands/payment.js.map +1 -1
  45. package/dist/commands/sandbox.js +4 -0
  46. package/dist/commands/sandbox.js.map +1 -1
  47. package/dist/commands/schedule.js +9 -0
  48. package/dist/commands/schedule.js.map +1 -1
  49. package/dist/commands/seo.js +5 -0
  50. package/dist/commands/seo.js.map +1 -1
  51. package/dist/commands/services.js +3 -0
  52. package/dist/commands/services.js.map +1 -1
  53. package/dist/commands/status.d.ts.map +1 -1
  54. package/dist/commands/status.js +1 -0
  55. package/dist/commands/status.js.map +1 -1
  56. package/dist/commands/storage.js +1 -0
  57. package/dist/commands/storage.js.map +1 -1
  58. package/dist/commands/support.js +1 -0
  59. package/dist/commands/support.js.map +1 -1
  60. package/dist/commands/test.d.ts.map +1 -1
  61. package/dist/commands/test.js +4 -0
  62. package/dist/commands/test.js.map +1 -1
  63. package/dist/commands/webhooks.js +4 -1
  64. package/dist/commands/webhooks.js.map +1 -1
  65. package/dist/index.js +43 -26
  66. package/dist/index.js.map +1 -1
  67. package/dist/lib/api-client.d.ts +25 -0
  68. package/dist/lib/api-client.d.ts.map +1 -1
  69. package/dist/lib/api-client.js +8 -10
  70. package/dist/lib/api-client.js.map +1 -1
  71. package/dist/lib/command-kit.d.ts +1 -0
  72. package/dist/lib/command-kit.d.ts.map +1 -1
  73. package/dist/lib/command-kit.js +1 -0
  74. package/dist/lib/command-kit.js.map +1 -1
  75. package/dist/lib/graph-walker.d.ts +95 -0
  76. package/dist/lib/graph-walker.d.ts.map +1 -0
  77. package/dist/lib/graph-walker.js +387 -0
  78. package/dist/lib/graph-walker.js.map +1 -0
  79. package/package.json +3 -2
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+ /**
3
+ * Graph walker for JSON-LD tenant context.
4
+ *
5
+ * Consumes the output of `GET /api/v1/cli/context?format=jsonld` —
6
+ * a Schema.org + solid:* typed graph — and offers the primitives the
7
+ * `solid graph` CLI command (and anything else that wants to navigate
8
+ * the tenant context) needs: a normalised adjacency map, BFS up to N
9
+ * hops from a root IRI, filters by @type, and a short-form expander
10
+ * (``kb/42`` → full IRI).
11
+ *
12
+ * The walker is intentionally schema-light: it treats any string-valued
13
+ * field whose value is an `@id` found in the graph as an outbound edge,
14
+ * plus anything declared ``@type: @id`` in the document's @context. This
15
+ * means the moment a new relationship predicate is added to
16
+ * `services/ai_context_jsonld.py` it is walkable without changing this
17
+ * file.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.buildAdjacency = buildAdjacency;
21
+ exports.bfs = bfs;
22
+ exports.bfsOut = bfsOut;
23
+ exports.nodesOfType = nodesOfType;
24
+ exports.listTypes = listTypes;
25
+ exports.resolveIri = resolveIri;
26
+ exports.subgraph = subgraph;
27
+ exports.validate = validate;
28
+ /**
29
+ * Edge discovery — which predicates in a node are links to other nodes.
30
+ *
31
+ * Approach: any string value that matches an ``@id`` already in the
32
+ * graph is considered an outbound edge; any array of strings whose
33
+ * entries match IDs is a bag of outbound edges. That covers every
34
+ * edge declared in the current @context (``provider``, ``company``,
35
+ * ``withinTier``, ``inIndustry``, ``shelfOf``, ``clonedFromTemplate``,
36
+ * ``handles``, ``operatesOn``, ``offers``, ``supersededBy``, ...) plus
37
+ * any future ones, without having to enumerate them here.
38
+ */
39
+ function collectEdges(node, knownIds) {
40
+ const out = [];
41
+ for (const [key, value] of Object.entries(node)) {
42
+ if (key.startsWith('@'))
43
+ continue;
44
+ if (typeof value === 'string' && knownIds.has(value) && value !== node['@id']) {
45
+ out.push({ predicate: key, target: value });
46
+ }
47
+ else if (Array.isArray(value)) {
48
+ for (const item of value) {
49
+ if (typeof item === 'string' && knownIds.has(item) && item !== node['@id']) {
50
+ out.push({ predicate: key, target: item });
51
+ }
52
+ else if (item && typeof item === 'object' && '@id' in item) {
53
+ const embeddedId = item['@id'];
54
+ if (typeof embeddedId === 'string' && knownIds.has(embeddedId) && embeddedId !== node['@id']) {
55
+ out.push({ predicate: key, target: embeddedId });
56
+ }
57
+ }
58
+ }
59
+ }
60
+ else if (value && typeof value === 'object' && '@id' in value) {
61
+ // Embedded node reference (e.g. nested schema:Offer) — treat its
62
+ // @id as an outbound edge when it resolves inside the graph.
63
+ const embeddedId = value['@id'];
64
+ if (typeof embeddedId === 'string' && knownIds.has(embeddedId) && embeddedId !== node['@id']) {
65
+ out.push({ predicate: key, target: embeddedId });
66
+ }
67
+ }
68
+ }
69
+ return out;
70
+ }
71
+ /**
72
+ * Build an adjacency map keyed by @id. Every node's outbound and
73
+ * inbound edges are precomputed so BFS + reverse lookup are O(1).
74
+ */
75
+ function buildAdjacency(doc) {
76
+ const graph = doc.graph ?? [];
77
+ const map = new Map();
78
+ const knownIds = new Set(graph.map((n) => n['@id']));
79
+ for (const node of graph) {
80
+ map.set(node['@id'], { node, outEdges: [], inEdges: [] });
81
+ }
82
+ for (const node of graph) {
83
+ const edges = collectEdges(node, knownIds);
84
+ const entry = map.get(node['@id']);
85
+ if (!entry)
86
+ continue;
87
+ entry.outEdges = edges;
88
+ for (const e of edges) {
89
+ const targetEntry = map.get(e.target);
90
+ if (targetEntry) {
91
+ targetEntry.inEdges.push({ predicate: e.predicate, source: node['@id'] });
92
+ }
93
+ }
94
+ }
95
+ return map;
96
+ }
97
+ /**
98
+ * BFS outward from a root IRI. Returns the set of visited IDs; depth
99
+ * limit is the maximum number of edges traversed from the root.
100
+ * ``hops = 0`` returns just the root; ``hops = 1`` returns root + all
101
+ * direct neighbors; etc.
102
+ */
103
+ function bfs(adj, root, hops) {
104
+ if (!adj.has(root))
105
+ return new Set();
106
+ const visited = new Set([root]);
107
+ if (hops <= 0)
108
+ return visited;
109
+ let frontier = [root];
110
+ for (let depth = 0; depth < hops; depth++) {
111
+ const next = [];
112
+ for (const id of frontier) {
113
+ const entry = adj.get(id);
114
+ if (!entry)
115
+ continue;
116
+ for (const e of entry.outEdges) {
117
+ if (!visited.has(e.target)) {
118
+ visited.add(e.target);
119
+ next.push(e.target);
120
+ }
121
+ }
122
+ // Inbound edges too — a "relationships around X" view should show
123
+ // the things that point AT X, not just the things X points at.
124
+ // The user can drop this via --directed.
125
+ for (const e of entry.inEdges) {
126
+ if (!visited.has(e.source)) {
127
+ visited.add(e.source);
128
+ next.push(e.source);
129
+ }
130
+ }
131
+ }
132
+ frontier = next;
133
+ if (!frontier.length)
134
+ break;
135
+ }
136
+ return visited;
137
+ }
138
+ /** Directed variant — only outbound edges. */
139
+ function bfsOut(adj, root, hops) {
140
+ if (!adj.has(root))
141
+ return new Set();
142
+ const visited = new Set([root]);
143
+ if (hops <= 0)
144
+ return visited;
145
+ let frontier = [root];
146
+ for (let depth = 0; depth < hops; depth++) {
147
+ const next = [];
148
+ for (const id of frontier) {
149
+ const entry = adj.get(id);
150
+ if (!entry)
151
+ continue;
152
+ for (const e of entry.outEdges) {
153
+ if (!visited.has(e.target)) {
154
+ visited.add(e.target);
155
+ next.push(e.target);
156
+ }
157
+ }
158
+ }
159
+ frontier = next;
160
+ if (!frontier.length)
161
+ break;
162
+ }
163
+ return visited;
164
+ }
165
+ /**
166
+ * Return every node whose @type array contains ``targetType``. Handles
167
+ * both string and array shapes. ``targetType`` may be a bare Schema.org
168
+ * fragment (``"Service"``), a Solid# vocab term (``"solid:Agent"``), or
169
+ * a full IRI; we match suffix-wise so casual inputs work.
170
+ */
171
+ function nodesOfType(doc, targetType) {
172
+ const graph = doc.graph ?? [];
173
+ const needle = targetType.toLowerCase();
174
+ return graph.filter((n) => {
175
+ const t = n['@type'];
176
+ if (!t)
177
+ return false;
178
+ const arr = Array.isArray(t) ? t : [t];
179
+ return arr.some((ty) => {
180
+ const s = String(ty).toLowerCase();
181
+ return s === needle || s.endsWith(':' + needle) || s.endsWith('/' + needle);
182
+ });
183
+ });
184
+ }
185
+ /** Enumerate every distinct @type value in the graph, sorted. */
186
+ function listTypes(doc) {
187
+ const graph = doc.graph ?? [];
188
+ const seen = new Set();
189
+ for (const n of graph) {
190
+ const t = n['@type'];
191
+ if (!t)
192
+ continue;
193
+ const arr = Array.isArray(t) ? t : [t];
194
+ for (const ty of arr)
195
+ seen.add(String(ty));
196
+ }
197
+ return [...seen].sort();
198
+ }
199
+ /**
200
+ * Short-form expander. Accepts the bare argument the user typed on the
201
+ * CLI and returns the full IRI when it can be resolved:
202
+ *
203
+ * "kb/42" → docRoot + "/kb/42"
204
+ * "co/61/service/3" → SOLID + "/co/61/service/3"
205
+ * "https://solidnumber.com/co/61/kb/42" → unchanged (already full)
206
+ * "tier/builder" → SOLID + "/vocab/tier/builder"
207
+ *
208
+ * ``docRoot`` should be the graph document's own ``@id`` (the tenant
209
+ * Organization) so relative paths resolve against the caller's tenant.
210
+ */
211
+ function resolveIri(input, docRoot) {
212
+ const trimmed = input.trim();
213
+ if (trimmed.startsWith('http://') || trimmed.startsWith('https://'))
214
+ return trimmed;
215
+ // "vocab/<type>/<slug>" or "tier/<slug>" — platform-wide.
216
+ const platformPrefixes = ['tier/', 'industry/', 'shelf/', 'agent-default/', 'cli-tool/', 'kb-template/'];
217
+ if (platformPrefixes.some((p) => trimmed.startsWith(p))) {
218
+ return `https://solidnumber.com/vocab/${trimmed}`;
219
+ }
220
+ if (trimmed.startsWith('vocab/')) {
221
+ return `https://solidnumber.com/${trimmed}`;
222
+ }
223
+ // "co/<id>/<type>/<entity>" — full company-scoped path sans scheme.
224
+ if (trimmed.startsWith('co/')) {
225
+ return `https://solidnumber.com/${trimmed}`;
226
+ }
227
+ // Relative to this tenant's doc root, e.g. "kb/42" → "<doc>/kb/42".
228
+ if (docRoot)
229
+ return `${docRoot.replace(/\/$/, '')}/${trimmed}`;
230
+ return trimmed;
231
+ }
232
+ /** Extract a subgraph (a fresh JsonLdDocument) containing only the
233
+ * nodes in ``ids`` — useful for ``solid graph --json`` output. */
234
+ function subgraph(doc, ids) {
235
+ const graph = (doc.graph ?? []).filter((n) => ids.has(n['@id']));
236
+ return {
237
+ '@context': doc['@context'],
238
+ '@id': doc['@id'],
239
+ '@type': doc['@type'],
240
+ graph,
241
+ };
242
+ }
243
+ /**
244
+ * Per-type required-field registry. Matched against the @type array
245
+ * using the same suffix rules as ``nodesOfType``. Each required field
246
+ * is either a predicate that must be present and non-empty, or an
247
+ * edge that must resolve inside @graph.
248
+ *
249
+ * Missing required fields are ERROR by default; edge targets that
250
+ * exist but don't resolve in-document are ERROR. Structural issues
251
+ * (like a duplicate @id) are ERROR too.
252
+ *
253
+ * The registry is permissive: unknown types don't produce issues.
254
+ * New types are validated the moment they're added to this map.
255
+ */
256
+ const REQUIRED_FIELDS = [
257
+ { matchType: 'Organization', fields: ['name'] },
258
+ { matchType: 'solid:Company', fields: ['name', 'identifier'] },
259
+ { matchType: 'Service', fields: ['name', 'provider'] },
260
+ { matchType: 'Product', fields: ['name', 'provider'] },
261
+ { matchType: 'solid:KnowledgeBaseEntry', fields: ['name', 'company'] },
262
+ { matchType: 'solid:Agent', fields: ['name'] },
263
+ { matchType: 'solid:WebsitePage', fields: ['name', 'company'] },
264
+ { matchType: 'solid:Site', fields: ['name', 'company'] },
265
+ { matchType: 'solid:AgentChain', fields: ['name', 'company'] },
266
+ { matchType: 'solid:InboundWebhook', fields: ['solid:eventKey', 'company'] },
267
+ { matchType: 'solid:CustomDomain', fields: ['name', 'company'] },
268
+ { matchType: 'solid:Tier', fields: ['name'] },
269
+ { matchType: 'solid:Industry', fields: ['name'] },
270
+ ];
271
+ function nodeTypeMatches(node, target) {
272
+ const t = node['@type'];
273
+ if (!t)
274
+ return false;
275
+ const arr = Array.isArray(t) ? t : [t];
276
+ const needle = target.toLowerCase();
277
+ return arr.some((ty) => {
278
+ const s = String(ty).toLowerCase();
279
+ return s === needle || s.endsWith(':' + needle) || s.endsWith('/' + needle);
280
+ });
281
+ }
282
+ function hasNonEmptyField(node, field) {
283
+ const v = node[field];
284
+ if (v === undefined || v === null || v === '')
285
+ return false;
286
+ if (Array.isArray(v) && v.length === 0)
287
+ return false;
288
+ if (typeof v === 'object' && !Array.isArray(v) && Object.keys(v).length === 0)
289
+ return false;
290
+ return true;
291
+ }
292
+ function validate(doc) {
293
+ const issues = [];
294
+ const graph = doc.graph ?? [];
295
+ const ids = new Set();
296
+ let edgeCount = 0;
297
+ // Pass 1: duplicate @id detection + build the id set.
298
+ for (const node of graph) {
299
+ const id = node['@id'];
300
+ if (!id) {
301
+ issues.push({
302
+ severity: 'error',
303
+ code: 'missing_id',
304
+ nodeId: '(unnamed)',
305
+ message: `node lacks @id — graph cannot reference it`,
306
+ });
307
+ continue;
308
+ }
309
+ if (ids.has(id)) {
310
+ issues.push({
311
+ severity: 'error',
312
+ code: 'duplicate_id',
313
+ nodeId: id,
314
+ message: `@id appears more than once in @graph`,
315
+ });
316
+ }
317
+ ids.add(id);
318
+ }
319
+ // Pass 2: per-node edge + required-field checks.
320
+ for (const node of graph) {
321
+ const id = node['@id'];
322
+ if (!id)
323
+ continue;
324
+ // Required fields per type.
325
+ for (const rule of REQUIRED_FIELDS) {
326
+ if (!nodeTypeMatches(node, rule.matchType))
327
+ continue;
328
+ for (const field of rule.fields) {
329
+ if (!hasNonEmptyField(node, field)) {
330
+ issues.push({
331
+ severity: 'error',
332
+ code: 'missing_required',
333
+ nodeId: id,
334
+ message: `@type ${rule.matchType} requires field "${field}" — missing or empty`,
335
+ });
336
+ }
337
+ }
338
+ }
339
+ // Edge targets — any string value resolving to an IRI-shaped id
340
+ // should exist in @graph. This is the same edge-discovery logic
341
+ // the walker uses; dangling edges = bad graph.
342
+ for (const [key, value] of Object.entries(node)) {
343
+ if (key.startsWith('@'))
344
+ continue;
345
+ const targets = [];
346
+ if (typeof value === 'string' && /^https?:\/\//.test(value)) {
347
+ targets.push(value);
348
+ }
349
+ else if (Array.isArray(value)) {
350
+ for (const item of value) {
351
+ if (typeof item === 'string' && /^https?:\/\//.test(item))
352
+ targets.push(item);
353
+ }
354
+ }
355
+ else if (value && typeof value === 'object' && '@id' in value) {
356
+ const inner = value['@id'];
357
+ if (typeof inner === 'string' && /^https?:\/\//.test(inner))
358
+ targets.push(inner);
359
+ }
360
+ for (const target of targets) {
361
+ edgeCount++;
362
+ // External IRIs (outside solidnumber.com) aren't expected to
363
+ // resolve inside @graph — e.g. schema:image might point at a
364
+ // CDN URL. We only enforce resolution for solidnumber.com IDs.
365
+ if (!target.startsWith('https://solidnumber.com'))
366
+ continue;
367
+ if (target === id)
368
+ continue; // self-ref is benign
369
+ if (!ids.has(target)) {
370
+ issues.push({
371
+ severity: 'error',
372
+ code: 'dangling_edge',
373
+ nodeId: id,
374
+ message: `"${key}" → ${target} — target not in @graph`,
375
+ });
376
+ }
377
+ }
378
+ }
379
+ }
380
+ return {
381
+ ok: issues.filter((i) => i.severity === 'error').length === 0,
382
+ issues,
383
+ nodeCount: graph.length,
384
+ edgeCount,
385
+ };
386
+ }
387
+ //# sourceMappingURL=graph-walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-walker.js","sourceRoot":"","sources":["../../src/lib/graph-walker.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.16.2",
3
+ "version": "1.19.5",
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": {
@@ -32,8 +32,9 @@
32
32
  "test:security": "jest --testPathPattern=company-isolation --forceExit",
33
33
  "verify:schemas": "ts-node scripts/verify-schemas.ts",
34
34
  "audit": "npm audit --audit-level=high",
35
+ "audit:prod": "npm audit --omit=dev --audit-level=high",
35
36
  "prepublish:check": "bash scripts/prepublish.sh",
36
- "prepublishOnly": "npm run build && npm test && npm run test:security"
37
+ "prepublishOnly": "npm run build && npm test && npm run test:security && npm run audit:prod"
37
38
  },
38
39
  "keywords": [
39
40
  "cli",