@intentius/chant 0.124.44 → 0.124.46
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.
- package/dist/capabilities/aws.paths +148 -0
- package/dist/capabilities/base-mappings.json +122 -0
- package/dist/capabilities/catalog.d.ts +89 -0
- package/dist/capabilities/catalog.d.ts.map +1 -0
- package/dist/capabilities/catalog.js +204 -0
- package/dist/capabilities/language.d.ts +103 -0
- package/dist/capabilities/language.d.ts.map +1 -0
- package/dist/capabilities/language.js +335 -0
- package/dist/capabilities/matcher.d.ts +65 -0
- package/dist/capabilities/matcher.d.ts.map +1 -0
- package/dist/capabilities/matcher.js +299 -0
- package/dist/capabilities/view.d.ts +207 -0
- package/dist/capabilities/view.d.ts.map +1 -0
- package/dist/capabilities/view.js +484 -0
- package/dist/ci-identity.d.ts +183 -12
- package/dist/ci-identity.d.ts.map +1 -1
- package/dist/ci-identity.js +362 -53
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +1 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +17 -1
- package/dist/cli/handlers/declared-graph.d.ts +44 -0
- package/dist/cli/handlers/declared-graph.d.ts.map +1 -0
- package/dist/cli/handlers/declared-graph.js +87 -0
- package/dist/cli/handlers/graph.d.ts +25 -0
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +93 -87
- package/dist/cli/handlers/pr-env.d.ts +8 -2
- package/dist/cli/handlers/pr-env.d.ts.map +1 -1
- package/dist/cli/handlers/pr-env.js +127 -225
- package/dist/cli/handlers/pr.d.ts +3 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +1 -0
- package/dist/cli/handlers/search-count.d.ts +89 -0
- package/dist/cli/handlers/search-count.d.ts.map +1 -0
- package/dist/cli/handlers/search-count.js +132 -0
- package/dist/cli/handlers/search.d.ts +358 -6
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +1065 -155
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +23 -3
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/server.js +3 -0
- package/dist/cli/mcp/tools/capabilities.d.ts +7 -0
- package/dist/cli/mcp/tools/capabilities.d.ts.map +1 -0
- package/dist/cli/mcp/tools/capabilities.js +27 -0
- package/dist/cli/mcp/workspace-tools.d.ts +3 -1
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.js +47 -2
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +64 -17
- package/dist/cli/registry.d.ts +22 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/cli-support.d.ts +2 -0
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +4 -2
- package/dist/components/fan-out-support.d.ts +3 -0
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/fan-out-support.js +1 -1
- package/dist/components/pr-env-ports.d.ts +29 -0
- package/dist/components/pr-env-ports.d.ts.map +1 -0
- package/dist/components/pr-env-ports.js +77 -0
- package/dist/components/pr-env-run.d.ts +254 -0
- package/dist/components/pr-env-run.d.ts.map +1 -0
- package/dist/components/pr-env-run.js +376 -0
- package/dist/components/pr-environment.d.ts +91 -15
- package/dist/components/pr-environment.d.ts.map +1 -1
- package/dist/components/pr-environment.js +95 -9
- package/dist/components/pr-pipeline.d.ts +10 -1
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/config-environments.d.ts +92 -0
- package/dist/config-environments.d.ts.map +1 -0
- package/dist/config-environments.js +102 -0
- package/dist/config.d.ts +24 -84
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -96
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-detail.js +15 -3
- package/dist/graph-effective.d.ts +33 -2
- package/dist/graph-effective.d.ts.map +1 -1
- package/dist/graph-effective.js +215 -68
- package/dist/graph-ir.d.ts +23 -0
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-ir.js +130 -0
- package/dist/graph-sub-template.d.ts +11 -0
- package/dist/graph-sub-template.d.ts.map +1 -0
- package/dist/graph-sub-template.js +19 -0
- package/dist/lexicon.d.ts +9 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/observe.d.ts +28 -0
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/observe.js +23 -1
- package/dist/lint/rule.d.ts +6 -0
- package/dist/lint/rule.d.ts.map +1 -1
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/live-endpoint.d.ts.map +1 -1
- package/dist/live-endpoint.js +1 -1
- package/dist/observation.d.ts +48 -1
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +21 -5
- package/dist/op/activities/activity-contracts.d.ts +4 -4
- package/dist/op/op-waves.d.ts +17 -0
- package/dist/op/op-waves.d.ts.map +1 -1
- package/dist/op/op-waves.js +23 -1
- package/dist/pr-forge.d.ts +15 -1
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +28 -16
- package/dist/pr-requires.d.ts +5 -1
- package/dist/pr-requires.d.ts.map +1 -1
- package/dist/wave-runtime.mjs +251 -250
- package/dist/workspace/capabilities-contract.d.ts +66 -0
- package/dist/workspace/capabilities-contract.d.ts.map +1 -0
- package/dist/workspace/capabilities-contract.js +107 -0
- package/dist/workspace/capabilities.schema.json +229 -0
- package/dist/workspace/ci-cloud-identity.d.ts +3 -1
- package/dist/workspace/ci-cloud-identity.d.ts.map +1 -1
- package/dist/workspace/ci-cloud-identity.js +16 -1
- package/dist/workspace/ci-run.d.ts +35 -8
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +95 -21
- package/dist/workspace/ci-secrets.d.ts.map +1 -1
- package/dist/workspace/ci-secrets.js +4 -3
- package/dist/workspace/compose-graph.d.ts +9 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/compose-graph.js +3 -1
- package/dist/workspace/conformance/index.d.ts +1 -1
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/index.js +39 -2
- package/dist/workspace/declaration.d.ts +10 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +17 -1
- package/dist/workspace/declaration.schema.json +36 -1
- package/dist/workspace/graph-cache.d.ts +8 -0
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cache.js +27 -3
- package/dist/workspace/graph-cli.d.ts +39 -2
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +66 -24
- package/dist/workspace/graph.schema.json +148 -0
- package/dist/workspace/kind-readers.d.ts +3 -0
- package/dist/workspace/kind-readers.d.ts.map +1 -1
- package/dist/workspace/kind-readers.js +7 -1
- package/dist/workspace/member-commands.d.ts +10 -1
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/member-commands.js +17 -1
- package/dist/workspace/nested-graph.d.ts +2 -0
- package/dist/workspace/nested-graph.d.ts.map +1 -1
- package/dist/workspace/nested-graph.js +32 -1
- package/dist/workspace/reason-codes.d.ts +10 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +12 -0
- package/dist/workspace/search-cli.d.ts +204 -0
- package/dist/workspace/search-cli.d.ts.map +1 -0
- package/dist/workspace/search-cli.js +466 -0
- package/dist/workspace/search-contract.d.ts +56 -0
- package/dist/workspace/search-contract.d.ts.map +1 -0
- package/dist/workspace/search-contract.js +70 -0
- package/dist/workspace/search.schema.json +822 -0
- package/package.json +1 -1
- package/src/__snapshots__/okf.test.ts.snap +10 -0
- package/src/capabilities/aws.paths +148 -0
- package/src/capabilities/base-mappings.json +122 -0
- package/src/capabilities/catalog.ts +230 -0
- package/src/capabilities/language.test.ts +191 -0
- package/src/capabilities/language.ts +373 -0
- package/src/capabilities/matcher.ts +315 -0
- package/src/capabilities/view-compose.test.ts +76 -0
- package/src/capabilities/view.ts +631 -0
- package/src/ci-identity-targets.test.ts +275 -0
- package/src/ci-identity.ts +394 -61
- package/src/cli/commands/lint.ts +1 -0
- package/src/cli/handlers/build.ts +15 -1
- package/src/cli/handlers/declared-graph.ts +99 -0
- package/src/cli/handlers/graph.test.ts +94 -3
- package/src/cli/handlers/graph.ts +123 -96
- package/src/cli/handlers/pr-env.ts +135 -227
- package/src/cli/handlers/pr.ts +4 -0
- package/src/cli/handlers/search-build-roots.test.ts +144 -0
- package/src/cli/handlers/search-count.test.ts +191 -0
- package/src/cli/handlers/search-count.ts +165 -0
- package/src/cli/handlers/search-json.test.ts +333 -0
- package/src/cli/handlers/search-live.test.ts +387 -0
- package/src/cli/handlers/search-paths.test.ts +235 -0
- package/src/cli/handlers/search.ts +1312 -166
- package/src/cli/main.test.ts +28 -3
- package/src/cli/main.ts +23 -3
- package/src/cli/mcp/server.test.ts +3 -3
- package/src/cli/mcp/server.ts +3 -0
- package/src/cli/mcp/tools/capabilities.ts +32 -0
- package/src/cli/mcp/workspace-tools.e2e.test.ts +21 -1
- package/src/cli/mcp/workspace-tools.ts +47 -2
- package/src/cli/parse-args.ts +52 -13
- package/src/cli/registry.ts +22 -0
- package/src/components/cli-support.ts +6 -1
- package/src/components/fan-out-support.ts +4 -1
- package/src/components/pr-env-ports.ts +89 -0
- package/src/components/pr-env-run-bundle.test.ts +54 -0
- package/src/components/pr-env-run.test.ts +290 -0
- package/src/components/pr-env-run.ts +563 -0
- package/src/components/pr-environment.ts +161 -13
- package/src/components/pr-pipeline.ts +10 -1
- package/src/config-environments.ts +133 -0
- package/src/config.ts +37 -124
- package/src/graph-detail.ts +15 -3
- package/src/graph-effective.ts +226 -75
- package/src/graph-ir.test.ts +163 -0
- package/src/graph-ir.ts +147 -0
- package/src/graph-sub-template.ts +22 -0
- package/src/lexicon.ts +10 -0
- package/src/lifecycle/observe.test.ts +27 -1
- package/src/lifecycle/observe.ts +43 -1
- package/src/lint/rule.ts +6 -0
- package/src/live-endpoint.ts +1 -1
- package/src/observation.test.ts +25 -0
- package/src/observation.ts +69 -5
- package/src/op/op-waves.ts +38 -1
- package/src/pr-forge-bundle.test.ts +1 -1
- package/src/pr-forge.ts +44 -17
- package/src/pr-requires.test.ts +43 -6
- package/src/pr-requires.ts +5 -1
- package/src/workspace/capabilities-contract.test.ts +88 -0
- package/src/workspace/capabilities-contract.ts +132 -0
- package/src/workspace/capabilities.schema.json +229 -0
- package/src/workspace/ci-cloud-identity.test.ts +20 -0
- package/src/workspace/ci-cloud-identity.ts +14 -1
- package/src/workspace/ci-run.test.ts +74 -1
- package/src/workspace/ci-run.ts +122 -29
- package/src/workspace/ci-secrets.test.ts +1 -1
- package/src/workspace/ci-secrets.ts +4 -3
- package/src/workspace/compose-graph.ts +10 -1
- package/src/workspace/conformance/conformance.e2e.test.ts +14 -1
- package/src/workspace/conformance/index.ts +31 -2
- package/src/workspace/declaration.schema.json +36 -1
- package/src/workspace/declaration.test.ts +7 -0
- package/src/workspace/declaration.ts +24 -2
- package/src/workspace/graph-cache.ts +27 -3
- package/src/workspace/graph-cli.ts +96 -24
- package/src/workspace/graph.schema.json +148 -0
- package/src/workspace/kind-readers.e2e.test.ts +28 -0
- package/src/workspace/kind-readers.test.ts +1 -1
- package/src/workspace/kind-readers.ts +7 -1
- package/src/workspace/member-commands.ts +22 -1
- package/src/workspace/nested-graph.ts +32 -1
- package/src/workspace/reason-codes.test.ts +7 -0
- package/src/workspace/reason-codes.ts +12 -0
- package/src/workspace/search-cli.e2e.test.ts +305 -0
- package/src/workspace/search-cli.ts +591 -0
- package/src/workspace/search-contract.ts +95 -0
- package/src/workspace/search.schema.json +822 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { terraformType } from "../../graph-effective.js";
|
|
2
|
+
// The one reading of a terraform node's type lives with the folds that also
|
|
3
|
+
// select on it, so `--count-by kind` and `kind:` cannot disagree (#4366).
|
|
4
|
+
export { terraformType };
|
|
5
|
+
/** The group a node with no value for the grouped dimension is counted under. */
|
|
6
|
+
export const NONE_GROUP = "(none)";
|
|
7
|
+
/** The module group of a Terraform block declared in the root module itself. */
|
|
8
|
+
export const ROOT_MODULE_GROUP = "(root)";
|
|
9
|
+
/** Parse a `--count-by` value, or say what the accepted spellings are. */
|
|
10
|
+
export function parseCountBy(raw) {
|
|
11
|
+
const value = raw.trim();
|
|
12
|
+
if (value === "kind")
|
|
13
|
+
return { by: "kind" };
|
|
14
|
+
if (value === "module")
|
|
15
|
+
return { by: "module" };
|
|
16
|
+
const attr = /^attr:(.+)$/.exec(value);
|
|
17
|
+
if (attr && attr[1].trim())
|
|
18
|
+
return { by: "attr", name: attr[1].trim() };
|
|
19
|
+
return {
|
|
20
|
+
error: `--count-by "${raw}" is not a grouping`,
|
|
21
|
+
hint: "group by one of: --count-by kind, --count-by module, --count-by attr:<name>",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** A Terraform node's root name, from its attrs or the first segment of its id. */
|
|
25
|
+
function terraformRoot(n) {
|
|
26
|
+
const attrs = (n.attrs ?? {});
|
|
27
|
+
if (typeof attrs.root === "string")
|
|
28
|
+
return attrs.root;
|
|
29
|
+
const slash = n.id.indexOf("/");
|
|
30
|
+
return slash === -1 ? "" : n.id.slice(0, slash);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The module a Terraform node sits in: its call chain as Terraform writes it
|
|
34
|
+
* (`module.cdn`, `module.cdn.module.bucket`), or `(root)` for a block of the
|
|
35
|
+
* root module itself. The chain is on `attrs.callers`; an entity key
|
|
36
|
+
* `<root>/module.cdn/<address>` carries the same chain when it is absent.
|
|
37
|
+
*/
|
|
38
|
+
function terraformModule(n) {
|
|
39
|
+
const attrs = (n.attrs ?? {});
|
|
40
|
+
const callers = Array.isArray(attrs.callers)
|
|
41
|
+
? attrs.callers.filter((c) => typeof c === "string")
|
|
42
|
+
: n.id.split("/").slice(1, -1);
|
|
43
|
+
return callers.length === 0 ? ROOT_MODULE_GROUP : callers.join(".");
|
|
44
|
+
}
|
|
45
|
+
/** An attribute's value as a group name, matched by exact name and then case-insensitively, as `--show` does. */
|
|
46
|
+
function attrGroup(n, name) {
|
|
47
|
+
const attrs = (n.attrs ?? {});
|
|
48
|
+
const key = name in attrs ? name : Object.keys(attrs).find((k) => k.toLowerCase() === name.toLowerCase());
|
|
49
|
+
const v = key === undefined ? undefined : attrs[key];
|
|
50
|
+
if (v === undefined || v === null || v === "")
|
|
51
|
+
return NONE_GROUP;
|
|
52
|
+
return typeof v === "object" ? JSON.stringify(v) : String(v);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The group one node belongs to.
|
|
56
|
+
*
|
|
57
|
+
* `module` on a Terraform node is its call chain. When the graph holds more
|
|
58
|
+
* than one Terraform root, the chain is prefixed with the root (`app/(root)`,
|
|
59
|
+
* `net/module.vpc`): `module.vpc` in two roots is two modules, applied
|
|
60
|
+
* separately, and counting them as one would add up resources that never sit
|
|
61
|
+
* in the same state. A node of another lexicon groups under the composite that
|
|
62
|
+
* expanded it, chant's own unit of reuse, or `(none)`.
|
|
63
|
+
*/
|
|
64
|
+
export function groupOf(n, countBy, multiRoot = false) {
|
|
65
|
+
if (countBy.by === "kind")
|
|
66
|
+
return terraformType(n) ?? (n.kind || NONE_GROUP);
|
|
67
|
+
if (countBy.by === "attr")
|
|
68
|
+
return attrGroup(n, countBy.name);
|
|
69
|
+
if (n.lexicon === "terraform") {
|
|
70
|
+
const module = terraformModule(n);
|
|
71
|
+
return multiRoot ? `${terraformRoot(n) || NONE_GROUP}/${module}` : module;
|
|
72
|
+
}
|
|
73
|
+
return n.compositeParent || NONE_GROUP;
|
|
74
|
+
}
|
|
75
|
+
/** Whether the graph holds blocks from more than one Terraform root. */
|
|
76
|
+
export function hasManyTerraformRoots(ir) {
|
|
77
|
+
const roots = new Set();
|
|
78
|
+
for (const n of ir.nodes)
|
|
79
|
+
if (n.lexicon === "terraform")
|
|
80
|
+
roots.add(terraformRoot(n));
|
|
81
|
+
return roots.size > 1;
|
|
82
|
+
}
|
|
83
|
+
/** Count `matches` per group, sorted by count (highest first) and then by name. */
|
|
84
|
+
export function countGroups(matches, countBy, multiRoot = false) {
|
|
85
|
+
return groupMembers(matches, countBy, multiRoot).map(({ group, count }) => ({ group, count }));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The groups with the ids of the matches in each, in match order (#4382), in
|
|
89
|
+
* the order {@link countGroups} gives. `count` is always `ids.length`. A
|
|
90
|
+
* reader that draws the groups (behold#922) lights each group's nodes from
|
|
91
|
+
* `ids`, so it never has to read a node's group itself.
|
|
92
|
+
*/
|
|
93
|
+
export function groupMembers(matches, countBy, multiRoot = false) {
|
|
94
|
+
const ids = new Map();
|
|
95
|
+
for (const n of matches) {
|
|
96
|
+
const g = groupOf(n, countBy, multiRoot);
|
|
97
|
+
const list = ids.get(g);
|
|
98
|
+
if (list)
|
|
99
|
+
list.push(n.id);
|
|
100
|
+
else
|
|
101
|
+
ids.set(g, [n.id]);
|
|
102
|
+
}
|
|
103
|
+
return [...ids]
|
|
104
|
+
.map(([group, members]) => ({ group, count: members.length, ids: members }))
|
|
105
|
+
.sort((a, b) => b.count - a.count || (a.group < b.group ? -1 : a.group > b.group ? 1 : 0));
|
|
106
|
+
}
|
|
107
|
+
export function countsJson(query, source, groups, countBy, liveFailures = []) {
|
|
108
|
+
return {
|
|
109
|
+
query,
|
|
110
|
+
source,
|
|
111
|
+
countBy: countByLabel(countBy),
|
|
112
|
+
groups,
|
|
113
|
+
total: groups.reduce((sum, g) => sum + g.count, 0),
|
|
114
|
+
...(liveFailures.length > 0 ? { liveFailures } : {}),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** The label a `--count-by` value is printed with on the total line. */
|
|
118
|
+
function countByLabel(countBy) {
|
|
119
|
+
return countBy.by === "attr" ? `attr:${countBy.name}` : countBy.by;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Render grouped counts: one `<count> <group>` line per group, counts right
|
|
123
|
+
* aligned, then the total. The total is the number of matches, which is the
|
|
124
|
+
* sum of the group counts by construction.
|
|
125
|
+
*/
|
|
126
|
+
export function formatCounts(groups, countBy) {
|
|
127
|
+
const total = groups.reduce((sum, g) => sum + g.count, 0);
|
|
128
|
+
const width = String(groups[0]?.count ?? 0).length;
|
|
129
|
+
const lines = groups.map((g) => `${String(g.count).padStart(width)} ${g.group}`);
|
|
130
|
+
lines.push(`— ${total} total · ${groups.length} group${groups.length === 1 ? "" : "s"} by ${countByLabel(countBy)}`);
|
|
131
|
+
return lines;
|
|
132
|
+
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { type GraphIR, type IRNode } from "../../graph-ir.js";
|
|
2
|
+
import type { CapabilityPack, View } from "../../capabilities/view.js";
|
|
2
3
|
import { type LiveDiffResult } from "../../lifecycle/live-diff.js";
|
|
3
4
|
import type { LiveObservation } from "../../graph-ir.js";
|
|
4
5
|
import type { ResourceMetadata } from "../../lexicon.js";
|
|
5
6
|
import type { ObservationDepth } from "../../lifecycle/types.js";
|
|
7
|
+
import { type CountBy } from "./search-count.js";
|
|
6
8
|
import type { CommandContext } from "../registry.js";
|
|
9
|
+
import { type SearchErrorCode, type SearchFailure } from "../../workspace/search-contract.js";
|
|
7
10
|
/**
|
|
8
11
|
* `chant search <query> [--live --env <name>]` — answer an estate question with
|
|
9
12
|
* a COMPACT result instead of the whole graph. The point (measured on aws-bench,
|
|
@@ -12,11 +15,14 @@ import type { CommandContext } from "../registry.js";
|
|
|
12
15
|
*
|
|
13
16
|
* Query grammar (space-separated terms, all must match — AND):
|
|
14
17
|
* bare word case-insensitive substring over id, kind, and attrs
|
|
15
|
-
* kind:<substr> node kind contains <substr> (e.g. kind:EC2::Instance)
|
|
18
|
+
* kind:<substr> node kind contains <substr> (e.g. kind:EC2::Instance);
|
|
19
|
+
* on a terraform resource, its type (kind:aws_instance, kind:aws_iam_)
|
|
16
20
|
* tag:<key>=<val> a Tags entry with Key=key and Value containing val
|
|
17
21
|
* attr:<name>=<val> attribute <name> equals/contains <val>
|
|
18
22
|
* ->kind:X / ->attr:.. this node has an edge TO a node matching the right side
|
|
19
23
|
* <-kind:X / <-attr:.. this node has an edge FROM a node matching the right side
|
|
24
|
+
* ->*X, ->{n}X, ->{m,n}X the far end is any depth / n / m..n hops away (#4359)
|
|
25
|
+
* ->[via=a]X, ->[to=a]X only edges through consumer attr a / reading producer attr a
|
|
20
26
|
*
|
|
21
27
|
* The edge operators are the point of "edge-aware" search (#1139): a small
|
|
22
28
|
* model shouldn't hand-join instance→subnet→public across many results — one
|
|
@@ -28,13 +34,96 @@ import type { CommandContext } from "../registry.js";
|
|
|
28
34
|
* thousands.
|
|
29
35
|
*/
|
|
30
36
|
export declare function runSearch(ctx: CommandContext): Promise<number>;
|
|
37
|
+
/** A search's arguments refused before anything is read, or its parsed terms and grouping. */
|
|
38
|
+
export type SearchArgsCheck = {
|
|
39
|
+
error: {
|
|
40
|
+
code: SearchErrorCode;
|
|
41
|
+
message: string;
|
|
42
|
+
hint?: string;
|
|
43
|
+
};
|
|
44
|
+
} | {
|
|
45
|
+
terms: Term[];
|
|
46
|
+
countBy?: CountBy;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Check a search's query and flags before anything is read (#4374): the
|
|
50
|
+
* grammar, `--count-by`, and the flags that need or exclude each other. The
|
|
51
|
+
* rules `chant search` and `chant workspace search` share, so the workspace
|
|
52
|
+
* form refuses once, with the same code and message, instead of once per
|
|
53
|
+
* member. `snapshot` is the snapshot asked for and the flag that asked:
|
|
54
|
+
* `--snapshot`, or plain search's `--at`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function checkSearchArgs(args: {
|
|
57
|
+
countBy?: string;
|
|
58
|
+
checkLive?: boolean;
|
|
59
|
+
checkSnapshot?: boolean;
|
|
60
|
+
failOnDrift?: boolean;
|
|
61
|
+
live?: boolean;
|
|
62
|
+
env?: string;
|
|
63
|
+
}, query: string, snapshot: {
|
|
64
|
+
ref?: string;
|
|
65
|
+
flag: string;
|
|
66
|
+
}): SearchArgsCheck;
|
|
67
|
+
/**
|
|
68
|
+
* Print the capability catalog (#4375): the `capabilities` document under
|
|
69
|
+
* `--json`, a line per capability otherwise. It takes no query and no other
|
|
70
|
+
* search flag, since it answers nothing about the estate. Shared by `chant
|
|
71
|
+
* search` and `chant workspace search`, which differ only in the lexicons
|
|
72
|
+
* they report on.
|
|
73
|
+
*/
|
|
74
|
+
export declare function printCapabilities(args: {
|
|
75
|
+
json?: boolean;
|
|
76
|
+
live?: boolean;
|
|
77
|
+
env?: string;
|
|
78
|
+
snapshot?: string;
|
|
79
|
+
at?: string;
|
|
80
|
+
countBy?: string;
|
|
81
|
+
explain?: boolean;
|
|
82
|
+
show?: string;
|
|
83
|
+
}, query: string, lexicons: string[]): Promise<number>;
|
|
84
|
+
/**
|
|
85
|
+
* Answer capability terms over a graph that is not this project's own (#4375):
|
|
86
|
+
* `chant workspace search` composes its members' graphs and views and asks
|
|
87
|
+
* here, so the rules run once over the whole of it. Given packs, the view is
|
|
88
|
+
* built here; given a view, it is the one the members' own chants mapped
|
|
89
|
+
* (#4378). Returns the rows
|
|
90
|
+
* as `--json` carries them, or the refusal for a capability the query names
|
|
91
|
+
* wrongly.
|
|
92
|
+
*/
|
|
93
|
+
export declare function answerOverGraph(ir: GraphIR, terms: Term[], query: string, packsOrView: CapabilityPack[] | View): {
|
|
94
|
+
matches: SearchJson["matches"];
|
|
95
|
+
capabilities: NonNullable<SearchJson["capabilities"]>;
|
|
96
|
+
} | {
|
|
97
|
+
error: {
|
|
98
|
+
message: string;
|
|
99
|
+
hint?: string;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
/** Whether a term, or the leaf under it, names a capability (#4375). */
|
|
103
|
+
export declare function usesCapability(t: Term): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Which read answered a live search's matches, when the lexicon reports it
|
|
106
|
+
* (#2267) and at least one answer came from the plan (#4384). Absent for a
|
|
107
|
+
* plain live or state answer, so those documents are unchanged.
|
|
108
|
+
*/
|
|
109
|
+
export interface ReadDepth {
|
|
110
|
+
/** `plan` or `live+plan` when every read match came that way, else `mixed`. */
|
|
111
|
+
depth?: "plan" | "live+plan" | "mixed";
|
|
112
|
+
/** The distinct reads that answered the matches, sorted. */
|
|
113
|
+
reads?: string[];
|
|
114
|
+
/** The plan read was asked for and failed: the read that answered instead. */
|
|
115
|
+
planFellBackTo?: "state" | "live" | "declared";
|
|
116
|
+
}
|
|
31
117
|
/** Where an answer's facts came from, for the provenance line (#1266). */
|
|
32
|
-
type AnswerSource = {
|
|
118
|
+
export type AnswerSource = {
|
|
33
119
|
kind: "declared";
|
|
34
|
-
} | {
|
|
120
|
+
} | ({
|
|
35
121
|
kind: "live";
|
|
36
|
-
}
|
|
122
|
+
} & ReadDepth)
|
|
123
|
+
/** `snapshot` is the ref asked for (`latest`), `commit` the snapshot commit it named (#4374). */
|
|
124
|
+
| {
|
|
37
125
|
kind: "snapshot";
|
|
126
|
+
snapshot?: string;
|
|
38
127
|
commit: string;
|
|
39
128
|
timestamp: string;
|
|
40
129
|
};
|
|
@@ -96,7 +185,9 @@ declare function ambientHint(matches: IRNode[], ambientKinds: string[], asked: b
|
|
|
96
185
|
* already done. That is a fact about the query, printed for every query, and it
|
|
97
186
|
* encodes no expected answer.
|
|
98
187
|
*/
|
|
99
|
-
declare function
|
|
188
|
+
declare function provenanceLine(matches: IRNode[], source: AnswerSource, recorded?: string, liveFailures?: string[], derived?: string[]): string;
|
|
189
|
+
/** Print {@link provenanceLine}: the text footer. */
|
|
190
|
+
declare function provenance(matches: IRNode[], source: AnswerSource, recorded?: string, liveFailures?: string[], derived?: string[]): void;
|
|
100
191
|
/** Union `LiveObservation.resources` across lexicons into one name-keyed map. */
|
|
101
192
|
declare function mergeResources(observations: LiveObservation[]): Record<string, ResourceMetadata>;
|
|
102
193
|
/** Restrict a name-keyed map to the matched ids — the whole of "query-scoped". */
|
|
@@ -112,6 +203,40 @@ declare function pickResources<T>(map: Record<string, T>, ids: Set<string>): Rec
|
|
|
112
203
|
* look — stays distinct from both, the same #1089 tri-state everywhere else.
|
|
113
204
|
*/
|
|
114
205
|
declare function renderDrift(diff: LiveDiffResult, checked: number, direction: "live" | "snapshot", depth?: ObservationDepth): number;
|
|
206
|
+
/** The query-scoped drift check as `--json` carries it (#4367). See {@link SearchJson}. */
|
|
207
|
+
export interface SearchDriftJson {
|
|
208
|
+
against: "live" | "snapshot";
|
|
209
|
+
/** Matched rows checked. */
|
|
210
|
+
checked?: number;
|
|
211
|
+
/** Rows that drifted: missing + orphan + disappeared + drifted, as the text summary counts. */
|
|
212
|
+
count?: number;
|
|
213
|
+
missing?: string[];
|
|
214
|
+
orphan?: string[];
|
|
215
|
+
disappeared?: string[];
|
|
216
|
+
drifted?: {
|
|
217
|
+
id: string;
|
|
218
|
+
path: string;
|
|
219
|
+
old?: unknown;
|
|
220
|
+
new?: unknown;
|
|
221
|
+
}[];
|
|
222
|
+
newlyObserved?: string[];
|
|
223
|
+
runtimeChildren?: {
|
|
224
|
+
id: string;
|
|
225
|
+
type: string;
|
|
226
|
+
owner: string;
|
|
227
|
+
}[];
|
|
228
|
+
unobserved?: {
|
|
229
|
+
id: string;
|
|
230
|
+
type?: string;
|
|
231
|
+
reason: string;
|
|
232
|
+
detail?: string;
|
|
233
|
+
}[];
|
|
234
|
+
/** The snapshot was recorded deeper than the identity-level comparison made here. */
|
|
235
|
+
depth?: ObservationDepth;
|
|
236
|
+
/** --check-snapshot found no snapshot to check against: the reason, and no other field. */
|
|
237
|
+
unavailable?: string;
|
|
238
|
+
}
|
|
239
|
+
declare function searchDriftJson(diff: LiveDiffResult, checked: number, against: "live" | "snapshot", depth?: ObservationDepth): SearchDriftJson;
|
|
115
240
|
/**
|
|
116
241
|
* Name the facts chant computed for the kinds in this result that the query did not use.
|
|
117
242
|
*
|
|
@@ -135,6 +260,29 @@ declare function derivedSurface(terms: Term[], matches: IRNode[], ir: GraphIR, b
|
|
|
135
260
|
* any expected answer, so it stays a fair, question-agnostic capability.
|
|
136
261
|
*/
|
|
137
262
|
declare function explain(terms: Term[], matches: IRNode[], ir: GraphIR, byId: Map<string, IRNode>, query: string): void;
|
|
263
|
+
/**
|
|
264
|
+
* The facts behind the `--explain` footer, shared by the text and `--json`
|
|
265
|
+
* (#4367). The universe is every node of the matched kinds (every node when
|
|
266
|
+
* nothing matched); a near-miss is a node of that universe the query
|
|
267
|
+
* excluded, with the first term it fails.
|
|
268
|
+
*/
|
|
269
|
+
declare function explainData(terms: Term[], matches: IRNode[], ir: GraphIR, byId: Map<string, IRNode>): {
|
|
270
|
+
universe: {
|
|
271
|
+
matched: number;
|
|
272
|
+
of: number;
|
|
273
|
+
kinds: string[];
|
|
274
|
+
};
|
|
275
|
+
evidence: {
|
|
276
|
+
id: string;
|
|
277
|
+
attr: string;
|
|
278
|
+
via: string;
|
|
279
|
+
}[];
|
|
280
|
+
nearMisses: {
|
|
281
|
+
id: string;
|
|
282
|
+
term?: Term;
|
|
283
|
+
}[];
|
|
284
|
+
moreExcluded: number;
|
|
285
|
+
};
|
|
138
286
|
/**
|
|
139
287
|
* On a miss, name the attributes the queried kind actually carries. A graph knows
|
|
140
288
|
* its own schema, so a caller who guessed an attribute name — or did not know a
|
|
@@ -145,8 +293,129 @@ declare function explain(terms: Term[], matches: IRNode[], ir: GraphIR, byId: Ma
|
|
|
145
293
|
*/
|
|
146
294
|
declare function availableAttrs(terms: Term[], ir: GraphIR): void;
|
|
147
295
|
declare function describeTerm(t: Term): string;
|
|
296
|
+
/**
|
|
297
|
+
* `chant search --json` (#4359, #4367): the whole answer as one document on
|
|
298
|
+
* stdout, read by behold (behold#913). Warnings and errors still go to stderr;
|
|
299
|
+
* the exit code is the text path's. It is the `search` document of the read
|
|
300
|
+
* contract (#4374, `workspace/search.schema.json`): every document opens with
|
|
301
|
+
* `$schema`, `contract` and `chant`, then `workspace` when the project belongs
|
|
302
|
+
* to one, and `at: null`, since plain search reads the working tree.
|
|
303
|
+
*
|
|
304
|
+
* {
|
|
305
|
+
* "$schema": "https://intentius.io/chant/schemas/workspace/search/v1/search.schema.json",
|
|
306
|
+
* "contract": 1, "chant": "0.124.46", "workspace"?: { "name", "root" }, "at": null,
|
|
307
|
+
* "query": "kind:aws_instance ->*kind:aws_vpc",
|
|
308
|
+
* "source": { "kind": "declared" | "live" | "snapshot", "env"?, "snapshot"?, "commit"?, "timestamp"? },
|
|
309
|
+
* "matches": [
|
|
310
|
+
* { "id": "east::web", "displayId": "web", "kind": "Terraform::Resource", "physicalId"?: "i-1",
|
|
311
|
+
* "unobserved"?: "read-failed", "show"?: { "InstanceType": "t3.micro" },
|
|
312
|
+
* "paths": [ { "term": "->*kind:aws_vpc", "dir": "out",
|
|
313
|
+
* "hops": [ { "from": "web", "fromAttr": "subnet_id", "to": "a", "toAttr": "id" },
|
|
314
|
+
* { "from": "a", "fromAttr": "vpc_id", "to": "main", "toAttr": "id" } ] } ] }
|
|
315
|
+
* ],
|
|
316
|
+
* "provenance": "observed live · bound 2/2",
|
|
317
|
+
* "liveFailures"?: ["aws: ..."],
|
|
318
|
+
* "explain"?: { "universe": { "matched": 2, "of": 6, "kinds": ["aws_instance"] },
|
|
319
|
+
* "evidence": [ { "id": "web", "attr": "internetFacing", "via": "..." } ],
|
|
320
|
+
* "nearMisses": [ { "id": "db", "fails": "attr:internetFacing=true" } ],
|
|
321
|
+
* "moreExcluded": 0 },
|
|
322
|
+
* "drift"?: { "against": "live" | "snapshot", ... see SearchDriftJson }
|
|
323
|
+
* }
|
|
324
|
+
*
|
|
325
|
+
* A refused query or invocation prints the head, `query` and
|
|
326
|
+
* `error: { code, message, hint? }` instead, and exits 1. The code is from the
|
|
327
|
+
* read contract's closed list (`SEARCH_ERROR_CODES`).
|
|
328
|
+
*
|
|
329
|
+
* `kind` is the IR kind, so a Terraform block's is `Terraform::Resource`;
|
|
330
|
+
* `kind:aws_instance` matches it by its resource type (#4366).
|
|
331
|
+
*
|
|
332
|
+
* `id` is the graph's full id, stack-qualified (`stack::name`) where the graph
|
|
333
|
+
* qualifies it; `displayId` is the bare name the text row prints. `hops` is in
|
|
334
|
+
* walk order from the match; each hop keeps the edge's own direction (see
|
|
335
|
+
* {@link PathHop}). `paths` is empty when the query has no positive edge
|
|
336
|
+
* term. `show` is present when `--show` was given, holding the requested
|
|
337
|
+
* attributes a row carries, under the name the graph spells them with.
|
|
338
|
+
* `explain` is present with `--explain`; `drift` with `--check-live` or
|
|
339
|
+
* `--check-snapshot`.
|
|
340
|
+
*/
|
|
341
|
+
export interface SearchJson {
|
|
342
|
+
query: string;
|
|
343
|
+
source: AnswerSource & {
|
|
344
|
+
env?: string;
|
|
345
|
+
};
|
|
346
|
+
matches: {
|
|
347
|
+
id: string;
|
|
348
|
+
displayId: string;
|
|
349
|
+
kind?: string;
|
|
350
|
+
physicalId?: string;
|
|
351
|
+
unobserved?: string;
|
|
352
|
+
show?: Record<string, unknown>;
|
|
353
|
+
paths: {
|
|
354
|
+
term: string;
|
|
355
|
+
dir: "out" | "in";
|
|
356
|
+
hops: PathHop[];
|
|
357
|
+
because?: {
|
|
358
|
+
capability: string;
|
|
359
|
+
id: string;
|
|
360
|
+
hops: PathHop[];
|
|
361
|
+
}[];
|
|
362
|
+
}[];
|
|
363
|
+
}[];
|
|
364
|
+
provenance?: string;
|
|
365
|
+
/** Present when every match is a planned create (#4372): how many. See the schema. */
|
|
366
|
+
plannedCreates?: number;
|
|
367
|
+
liveFailures?: string[];
|
|
368
|
+
explain?: {
|
|
369
|
+
universe: {
|
|
370
|
+
matched: number;
|
|
371
|
+
of: number;
|
|
372
|
+
kinds: string[];
|
|
373
|
+
};
|
|
374
|
+
evidence: {
|
|
375
|
+
id: string;
|
|
376
|
+
attr: string;
|
|
377
|
+
via: string;
|
|
378
|
+
}[];
|
|
379
|
+
nearMisses: {
|
|
380
|
+
id: string;
|
|
381
|
+
fails?: string;
|
|
382
|
+
}[];
|
|
383
|
+
moreExcluded: number;
|
|
384
|
+
};
|
|
385
|
+
drift?: SearchDriftJson;
|
|
386
|
+
/**
|
|
387
|
+
* Present when the query names a capability (#4375): each one, the
|
|
388
|
+
* observation its facts were derived from, and what it does not evaluate.
|
|
389
|
+
*/
|
|
390
|
+
capabilities?: {
|
|
391
|
+
name: string;
|
|
392
|
+
source: AnswerSource["kind"];
|
|
393
|
+
notEvaluated: string[];
|
|
394
|
+
}[];
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* A refusal under `--json` (#4367): the same message and hint stderr carries,
|
|
398
|
+
* with its code from the read contract's closed list (#4374).
|
|
399
|
+
*/
|
|
400
|
+
export type SearchErrorJson = SearchFailure;
|
|
401
|
+
declare function searchErrorJson(query: string, error: {
|
|
402
|
+
code: SearchErrorCode;
|
|
403
|
+
message: string;
|
|
404
|
+
hint?: string;
|
|
405
|
+
}): SearchErrorJson;
|
|
406
|
+
declare function searchJson(query: string, source: AnswerSource, matches: IRNode[], terms: Term[], ir: GraphIR, byId: Map<string, IRNode>, liveFailures?: string[], extra?: {
|
|
407
|
+
env?: string;
|
|
408
|
+
show?: string[];
|
|
409
|
+
provenance?: string;
|
|
410
|
+
plannedCreates?: number;
|
|
411
|
+
capabilities?: SearchJson["capabilities"];
|
|
412
|
+
explain?: ReturnType<typeof explainData>;
|
|
413
|
+
drift?: SearchDriftJson;
|
|
414
|
+
}): SearchJson;
|
|
415
|
+
/** A term as the query grammar spells it, `!` and ASCII arrows included (#4367). */
|
|
416
|
+
declare function termText(t: Term): string;
|
|
148
417
|
export interface Term {
|
|
149
|
-
kind: "word" | "kind" | "tag" | "attr" | "edge";
|
|
418
|
+
kind: "word" | "kind" | "tag" | "attr" | "edge" | "cap";
|
|
150
419
|
/** `!term` — the node must NOT satisfy this (#1280). */
|
|
151
420
|
negated?: boolean;
|
|
152
421
|
a: string;
|
|
@@ -154,12 +423,36 @@ export interface Term {
|
|
|
154
423
|
/** For edge terms: the direction and the sub-predicate matched at the far end. */
|
|
155
424
|
dir?: "out" | "in";
|
|
156
425
|
sub?: Term;
|
|
426
|
+
/**
|
|
427
|
+
* For edge terms (#4359): how many hops the far end may be away. Absent on a
|
|
428
|
+
* plain `->`/`<-`, which is exactly one hop. `max` is `Infinity` for `*`.
|
|
429
|
+
*/
|
|
430
|
+
depth?: {
|
|
431
|
+
min: number;
|
|
432
|
+
max: number;
|
|
433
|
+
};
|
|
434
|
+
/** For edge terms (#4359): every edge on the path goes through this consumer attribute (`IREdge.viaAttr`). */
|
|
435
|
+
viaAttr?: string;
|
|
436
|
+
/** For edge terms (#4359): every edge on the path reads this producer attribute (`IREdge.toAttr`). */
|
|
437
|
+
toAttr?: string;
|
|
438
|
+
/**
|
|
439
|
+
* For edge terms (#4375): walk this edge capability (`reaches`,
|
|
440
|
+
* `grants(s3:GetObject)`) instead of the graph's own edges. A `cap:` leaf
|
|
441
|
+
* keeps its call in `a`.
|
|
442
|
+
*/
|
|
443
|
+
capability?: string;
|
|
157
444
|
/**
|
|
158
445
|
* For kind terms: the kinds this term actually means, resolved against the
|
|
159
446
|
* graph (see {@link resolveKindTerms}). Absent when nothing resolved it, in
|
|
160
447
|
* which case the substring rule applies unchanged.
|
|
161
448
|
*/
|
|
162
449
|
kinds?: Set<string>;
|
|
450
|
+
/**
|
|
451
|
+
* For kind terms (#4366): the terraform resource types this term means,
|
|
452
|
+
* resolved against the graph. A terraform resource matches the term when its
|
|
453
|
+
* type is in here, whatever `kinds` says.
|
|
454
|
+
*/
|
|
455
|
+
tfTypes?: Set<string>;
|
|
163
456
|
}
|
|
164
457
|
/**
|
|
165
458
|
* Decide which kinds a `kind:` term means, given what is in the graph.
|
|
@@ -182,15 +475,72 @@ export interface Term {
|
|
|
182
475
|
* Substring is kept as the fallback, so `kind:Gateway` still finds both
|
|
183
476
|
* `InternetGateway` and `VPCGatewayAttachment` — a genuine substring search
|
|
184
477
|
* that no segment rule would serve. Most specific wins; nothing else changes.
|
|
478
|
+
*
|
|
479
|
+
* A terraform resource is `Terraform::Resource` whatever it is, so the term is
|
|
480
|
+
* also read against each resource's type (#4366), with the same boundary rule
|
|
481
|
+
* on `_`: `kind:aws_iam_role` means that type exactly and never
|
|
482
|
+
* `aws_iam_role_policy`, and a term ending in `_` (`kind:aws_iam_`) or a bare
|
|
483
|
+
* provider name (`kind:aws`) means every type it begins. A data source's type
|
|
484
|
+
* keeps its `data.` prefix (`kind:data.aws_ami`), the same type `--count-by kind`
|
|
485
|
+
* groups it under, so `kind:aws_ami` is not a data source. A term that names a
|
|
486
|
+
* type turns off the substring fallback for the IR kind, so `kind:aws_instance`
|
|
487
|
+
* is the instances and nothing found by accident.
|
|
185
488
|
*/
|
|
186
489
|
export declare function resolveKindTerms(terms: Term[], nodes: IRNode[]): void;
|
|
187
490
|
declare function parseQuery(query: string): Term[];
|
|
188
491
|
declare function matchTerm(n: IRNode, t: Term, ir?: GraphIR, byId?: Map<string, IRNode>): boolean;
|
|
492
|
+
/**
|
|
493
|
+
* One edge on the path a match was reached by (#4359), in walk order from the
|
|
494
|
+
* match outward. `from` and `to` keep the edge's own direction (`from` holds
|
|
495
|
+
* the reference, `to` is what it names), whichever way the term walked, so a
|
|
496
|
+
* reader can find the edge in the graph by its endpoints. Node ids are the
|
|
497
|
+
* graph's full ids, stack qualification included.
|
|
498
|
+
*/
|
|
499
|
+
export interface PathHop {
|
|
500
|
+
from: string;
|
|
501
|
+
/** The consumer attribute the reference flows through (`IREdge.viaAttr`), when known. */
|
|
502
|
+
fromAttr?: string;
|
|
503
|
+
to: string;
|
|
504
|
+
/** The producer attribute read (`IREdge.toAttr`), when known. */
|
|
505
|
+
toAttr?: string;
|
|
506
|
+
/**
|
|
507
|
+
* On a capability's path (#4375): the name the capability rules give this
|
|
508
|
+
* edge (`subnet`, `statement`, `resource`). Its `from` may be a node inside
|
|
509
|
+
* another (a policy statement, `<holder>#policy[0].Statement[1]`).
|
|
510
|
+
*/
|
|
511
|
+
edge?: string;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* The shortest path by which an edge term reaches `n` (#4359), or null.
|
|
515
|
+
*
|
|
516
|
+
* Breadth-first over the edges in the term's direction, keeping only edges
|
|
517
|
+
* whose attributes satisfy its qualifier, and accepting a node that satisfies
|
|
518
|
+
* the target leaf (any node when the term has none) at a depth inside the
|
|
519
|
+
* term's range. A plain `->`/`<-` is the range 1..1.
|
|
520
|
+
*
|
|
521
|
+
* Termination on a cycle: a state is (node, depth capped at the range's
|
|
522
|
+
* minimum). Past the minimum, arriving at a node again by a longer walk can
|
|
523
|
+
* reach nothing the first arrival could not, so it is not queued twice. The
|
|
524
|
+
* state space is finite and the walk always ends.
|
|
525
|
+
*/
|
|
526
|
+
declare function findPath(n: IRNode, t: Term, ir: GraphIR, byId: Map<string, IRNode>): PathHop[] | null;
|
|
527
|
+
/**
|
|
528
|
+
* A path as one line of `id.attr` steps, read from the match outward (#4359).
|
|
529
|
+
* Walking `->`, each hop reads `consumer.via -> producer.attr`; walking `<-`,
|
|
530
|
+
* `producer.attr <- consumer.via`. Hops are joined with `; `.
|
|
531
|
+
*/
|
|
532
|
+
declare function formatPath(hops: PathHop[], dir: "out" | "in"): string;
|
|
189
533
|
declare function formatRow(n: IRNode, show: string[]): string;
|
|
190
534
|
/** Internals exposed for unit tests. */
|
|
191
535
|
export declare const __searchInternals: {
|
|
192
536
|
parseQuery: typeof parseQuery;
|
|
193
537
|
matchTerm: typeof matchTerm;
|
|
538
|
+
findPath: typeof findPath;
|
|
539
|
+
formatPath: typeof formatPath;
|
|
540
|
+
searchJson: typeof searchJson;
|
|
541
|
+
searchErrorJson: typeof searchErrorJson;
|
|
542
|
+
explainData: typeof explainData;
|
|
543
|
+
termText: typeof termText;
|
|
194
544
|
formatRow: typeof formatRow;
|
|
195
545
|
explain: typeof explain;
|
|
196
546
|
describeTerm: typeof describeTerm;
|
|
@@ -200,7 +550,9 @@ export declare const __searchInternals: {
|
|
|
200
550
|
regionSpread: typeof regionSpread;
|
|
201
551
|
showMiss: typeof showMiss;
|
|
202
552
|
provenance: typeof provenance;
|
|
553
|
+
provenanceLine: typeof provenanceLine;
|
|
203
554
|
renderDrift: typeof renderDrift;
|
|
555
|
+
searchDriftJson: typeof searchDriftJson;
|
|
204
556
|
mergeResources: typeof mergeResources;
|
|
205
557
|
pickResources: typeof pickResources;
|
|
206
558
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0E,KAAK,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/search.ts"],"names":[],"mappings":"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"}
|