@graview/tools 0.1.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.
- package/LICENSE +96 -0
- package/README.md +47 -0
- package/dist/agent/adapters.d.ts +43 -0
- package/dist/agent/adapters.d.ts.map +1 -0
- package/dist/agent/adapters.js +52 -0
- package/dist/agent/adapters.js.map +1 -0
- package/dist/agent/tools.d.ts +105 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +311 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/cli.d.ts +37 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +306 -0
- package/dist/cli.js.map +1 -0
- package/dist/conversation.d.ts +108 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +698 -0
- package/dist/conversation.js.map +1 -0
- package/dist/decide.d.ts +43 -0
- package/dist/decide.d.ts.map +1 -0
- package/dist/decide.js +125 -0
- package/dist/decide.js.map +1 -0
- package/dist/derive.d.ts +84 -0
- package/dist/derive.d.ts.map +1 -0
- package/dist/derive.js +302 -0
- package/dist/derive.js.map +1 -0
- package/dist/edit.d.ts +70 -0
- package/dist/edit.d.ts.map +1 -0
- package/dist/edit.js +97 -0
- package/dist/edit.js.map +1 -0
- package/dist/figure.d.ts +53 -0
- package/dist/figure.d.ts.map +1 -0
- package/dist/figure.js +86 -0
- package/dist/figure.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/intelligence.d.ts +132 -0
- package/dist/intelligence.d.ts.map +1 -0
- package/dist/intelligence.js +463 -0
- package/dist/intelligence.js.map +1 -0
- package/dist/local.d.ts +192 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +365 -0
- package/dist/local.js.map +1 -0
- package/dist/loop.d.ts +84 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +173 -0
- package/dist/loop.js.map +1 -0
- package/dist/mcp-stdio.d.ts +38 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +83 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/pins.d.ts +29 -0
- package/dist/pins.d.ts.map +1 -0
- package/dist/pins.js +60 -0
- package/dist/pins.js.map +1 -0
- package/dist/plan.d.ts +150 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +303 -0
- package/dist/plan.js.map +1 -0
- package/dist/providers/insight.d.ts +14 -0
- package/dist/providers/insight.d.ts.map +1 -0
- package/dist/providers/insight.js +81 -0
- package/dist/providers/insight.js.map +1 -0
- package/dist/providers/invariant.d.ts +14 -0
- package/dist/providers/invariant.d.ts.map +1 -0
- package/dist/providers/invariant.js +123 -0
- package/dist/providers/invariant.js.map +1 -0
- package/dist/providers/jev.d.ts +115 -0
- package/dist/providers/jev.d.ts.map +1 -0
- package/dist/providers/jev.js +148 -0
- package/dist/providers/jev.js.map +1 -0
- package/dist/providers/lens.d.ts +24 -0
- package/dist/providers/lens.d.ts.map +1 -0
- package/dist/providers/lens.js +36 -0
- package/dist/providers/lens.js.map +1 -0
- package/dist/providers/llm.d.ts +25 -0
- package/dist/providers/llm.d.ts.map +1 -0
- package/dist/providers/llm.js +44 -0
- package/dist/providers/llm.js.map +1 -0
- package/dist/providers/schema.d.ts +12 -0
- package/dist/providers/schema.d.ts.map +1 -0
- package/dist/providers/schema.js +508 -0
- package/dist/providers/schema.js.map +1 -0
- package/dist/providers/structure.d.ts +14 -0
- package/dist/providers/structure.d.ts.map +1 -0
- package/dist/providers/structure.js +211 -0
- package/dist/providers/structure.js.map +1 -0
- package/dist/questions.d.ts +162 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +316 -0
- package/dist/questions.js.map +1 -0
- package/dist/run.d.ts +202 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +453 -0
- package/dist/run.js.map +1 -0
- package/dist/space.d.ts +50 -0
- package/dist/space.d.ts.map +1 -0
- package/dist/space.js +55 -0
- package/dist/space.js.map +1 -0
- package/dist/types.d.ts +122 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/usage.d.ts +10 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +59 -0
- package/dist/usage.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import { argShape, humaniseField, nodeRefArgs, nounOf, withArticle } from "@graview/core";
|
|
2
|
+
const BASE_SCORE = 40;
|
|
3
|
+
/**
|
|
4
|
+
* Which typed mutations are legal across the WHOLE selection.
|
|
5
|
+
*
|
|
6
|
+
* The declaration already says which kinds a mutation acts on and which
|
|
7
|
+
* argument the subject binds to, so "all three selected nodes are duties, and
|
|
8
|
+
* reassign acts on duties" is a fact the schema can answer — no per-selection
|
|
9
|
+
* code, and a new node kind gets its affordances the moment it is declared.
|
|
10
|
+
*/
|
|
11
|
+
export function schemaProvider() {
|
|
12
|
+
return {
|
|
13
|
+
name: "schema",
|
|
14
|
+
derive({ store, selection, nodes, kindSelection, edgeSelection }) {
|
|
15
|
+
const affordances = [];
|
|
16
|
+
/*
|
|
17
|
+
* A selected LINE asks "what may be done to this relation". Mutations
|
|
18
|
+
* declare the edge kinds they make and break; endpoints prefill by
|
|
19
|
+
* matching each node-reference argument's accepted kinds against the
|
|
20
|
+
* edge's real ends — derived, never wired, and ambiguous matches stay
|
|
21
|
+
* open questions rather than guesses.
|
|
22
|
+
*/
|
|
23
|
+
if (nodes.length === 0 && edgeSelection.length > 0) {
|
|
24
|
+
for (const edge of edgeSelection) {
|
|
25
|
+
const fromNode = store.graph.getNode(edge.from);
|
|
26
|
+
const toNode = store.graph.getNode(edge.to);
|
|
27
|
+
if (!fromNode || !toNode)
|
|
28
|
+
continue;
|
|
29
|
+
for (const mutation of store.allMutations()) {
|
|
30
|
+
const makes = (mutation.connects ?? []).includes(edge.kind);
|
|
31
|
+
const breaks = (mutation.severs ?? []).includes(edge.kind);
|
|
32
|
+
if (!makes && !breaks)
|
|
33
|
+
continue;
|
|
34
|
+
const args = {};
|
|
35
|
+
const open = [];
|
|
36
|
+
const refs = nodeRefArgs(mutation.input);
|
|
37
|
+
for (const ref of refs) {
|
|
38
|
+
const takesFrom = ref.kinds.includes("*") || ref.kinds.includes(fromNode.kind);
|
|
39
|
+
const takesTo = ref.kinds.includes("*") || ref.kinds.includes(toNode.kind);
|
|
40
|
+
const fromOnly = takesFrom && !refs.some((other) => other !== ref && (other.kinds.includes(fromNode.kind) || other.kinds.includes("*")));
|
|
41
|
+
// Prefill only the unambiguous end; two arguments accepting
|
|
42
|
+
// the same kind stay open with candidates.
|
|
43
|
+
if (takesFrom && !takesTo)
|
|
44
|
+
args[ref.name] = edge.from;
|
|
45
|
+
else if (takesTo && !takesFrom)
|
|
46
|
+
args[ref.name] = edge.to;
|
|
47
|
+
else if (takesFrom && takesTo && fromOnly)
|
|
48
|
+
args[ref.name] = edge.from;
|
|
49
|
+
else {
|
|
50
|
+
// Ambiguity on a LINE resolves to the line: the only honest
|
|
51
|
+
// candidates for "break this" are this line's own two ends —
|
|
52
|
+
// a graph-wide picker here could sever an unrelated pair.
|
|
53
|
+
open.push({
|
|
54
|
+
name: ref.name,
|
|
55
|
+
kinds: ref.kinds,
|
|
56
|
+
candidates: [edge.from, edge.to],
|
|
57
|
+
shape: argShape(mutation.input, ref.name),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const name of otherRequiredArgs(mutation.input, "")) {
|
|
62
|
+
if (name in args || open.some((parameter) => parameter.name === name))
|
|
63
|
+
continue;
|
|
64
|
+
open.push({ name, shape: argShape(mutation.input, name) });
|
|
65
|
+
}
|
|
66
|
+
const askable = open.every((parameter) => parameter.optional === true
|
|
67
|
+
? true
|
|
68
|
+
: parameter.kinds !== undefined
|
|
69
|
+
? (parameter.candidates?.length ?? 0) > 0
|
|
70
|
+
: (parameter.candidates?.length ?? 0) > 0 ||
|
|
71
|
+
(parameter.shape !== undefined && parameter.shape.type !== "unknown"));
|
|
72
|
+
if (!askable)
|
|
73
|
+
continue;
|
|
74
|
+
/*
|
|
75
|
+
* A LINE DOES NOT OFFER THE ACT THAT WOULD MAKE IT.
|
|
76
|
+
*
|
|
77
|
+
* Both ends come from the line, so a mutation that only makes
|
|
78
|
+
* this edge kind arrives with nothing left to ask and nothing
|
|
79
|
+
* left to change: the relation it would create is the one you
|
|
80
|
+
* selected. Pressed, it was a one-press button that appeared to
|
|
81
|
+
* do nothing — and did do something, writing a second identical
|
|
82
|
+
* op into the history, undoable, describing a change that never
|
|
83
|
+
* happened.
|
|
84
|
+
*
|
|
85
|
+
* A make with a question still open is a different act (connect
|
|
86
|
+
* this end to something else), and a mutation that also breaks
|
|
87
|
+
* the kind is a move. Both stay.
|
|
88
|
+
*/
|
|
89
|
+
if (makes && !breaks && open.length === 0)
|
|
90
|
+
continue;
|
|
91
|
+
affordances.push({
|
|
92
|
+
id: `schema:edge:${mutation.name}:${edge.kind}:${edge.from}:${edge.to}`,
|
|
93
|
+
label: mutation.title ?? mutation.name,
|
|
94
|
+
provider: "schema",
|
|
95
|
+
mutation: mutation.name,
|
|
96
|
+
args,
|
|
97
|
+
open,
|
|
98
|
+
...(mutation.destructive ? { destructive: true } : {}),
|
|
99
|
+
// A break offered on the line itself outranks a make; both sit
|
|
100
|
+
// between plain schema actions and repairs.
|
|
101
|
+
score: (breaks ? 62 : 58) - open.length,
|
|
102
|
+
why: `this line is "${store.schema.edge(edge.kind)?.description ?? edge.kind.replace(/[-_]+/g, " ")}"`,
|
|
103
|
+
nodeIds: [edge.from, edge.to],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { affordances };
|
|
108
|
+
}
|
|
109
|
+
/*
|
|
110
|
+
* A selected KIND — a card, a district — asks a different question
|
|
111
|
+
* from a selected node: not "what can I do with this" but "how does
|
|
112
|
+
* the first one get here". Mutations declare what they create, so an
|
|
113
|
+
* empty kind card offers its own beginnings — which is the whole
|
|
114
|
+
* onboarding path of a blank graph, one derived affordance at a time.
|
|
115
|
+
*/
|
|
116
|
+
if (nodes.length === 0 && kindSelection.length > 0) {
|
|
117
|
+
const wanted = new Set(kindSelection);
|
|
118
|
+
const observations = [];
|
|
119
|
+
for (const mutation of store.allMutations()) {
|
|
120
|
+
if (!(mutation.creates ?? []).some((kind) => wanted.has(kind)))
|
|
121
|
+
continue;
|
|
122
|
+
const open = [];
|
|
123
|
+
for (const ref of nodeRefArgs(mutation.input)) {
|
|
124
|
+
const candidates = ref.kinds.includes("*")
|
|
125
|
+
? store.graph.allNodes().map((node) => node.id)
|
|
126
|
+
: ref.kinds.flatMap((kind) => store.graph.nodesOfKind(kind).map((node) => node.id));
|
|
127
|
+
open.push({
|
|
128
|
+
name: ref.name,
|
|
129
|
+
kinds: ref.kinds,
|
|
130
|
+
candidates,
|
|
131
|
+
shape: argShape(mutation.input, ref.name),
|
|
132
|
+
...(ref.optional ? { optional: true } : {}),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
for (const name of otherRequiredArgs(mutation.input, "")) {
|
|
136
|
+
if (open.some((parameter) => parameter.name === name))
|
|
137
|
+
continue;
|
|
138
|
+
open.push({ name, shape: argShape(mutation.input, name) });
|
|
139
|
+
}
|
|
140
|
+
const askable = open.every((parameter) => parameter.optional === true
|
|
141
|
+
? true
|
|
142
|
+
: parameter.kinds !== undefined
|
|
143
|
+
? // A node reference is only askable when real nodes exist to
|
|
144
|
+
// pick — "sow into which plot?" has no honest answer at zero
|
|
145
|
+
// plots, so the button waits for the first plot instead.
|
|
146
|
+
(parameter.candidates?.length ?? 0) > 0
|
|
147
|
+
: (parameter.candidates?.length ?? 0) > 0 ||
|
|
148
|
+
(parameter.shape !== undefined && parameter.shape.type !== "unknown"));
|
|
149
|
+
/*
|
|
150
|
+
* AN ACT WITHHELD FOR WANT OF A CANDIDATE IS NOT AN ACT THAT DOES
|
|
151
|
+
* NOT EXIST, and the difference is the whole onboarding of a blank
|
|
152
|
+
* graph.
|
|
153
|
+
*
|
|
154
|
+
* "creates: [kind] means an empty kind card offers its own
|
|
155
|
+
* beginnings" holds for the kinds at the ROOT of the dependency
|
|
156
|
+
* chain and stops there — because in any real domain almost every
|
|
157
|
+
* creating act connects to something, and an act that needs a zone
|
|
158
|
+
* cannot act when there are no zones. The derivation is right to
|
|
159
|
+
* withhold it; a form with an empty picker is worse than nothing.
|
|
160
|
+
*
|
|
161
|
+
* What was wrong is that it said nothing. A person meets eight
|
|
162
|
+
* districts, one of which offers a way in, and no explanation for
|
|
163
|
+
* the other seven. The unsatisfied argument already names the kind
|
|
164
|
+
* it wants, so the district can say it in the declaration's own
|
|
165
|
+
* words — and it is an observation rather than an action, because
|
|
166
|
+
* there is nothing to press yet.
|
|
167
|
+
*/
|
|
168
|
+
if (!askable) {
|
|
169
|
+
const waiting = open.filter((parameter) => parameter.optional !== true &&
|
|
170
|
+
parameter.kinds !== undefined &&
|
|
171
|
+
!parameter.kinds.includes("*") &&
|
|
172
|
+
(parameter.candidates?.length ?? 0) === 0);
|
|
173
|
+
if (waiting.length > 0) {
|
|
174
|
+
const wants = [
|
|
175
|
+
...new Set(waiting.flatMap((parameter) => parameter.kinds ?? [])),
|
|
176
|
+
].map((kind) => withArticle(nounOf(store.schema.tryDefinition(kind), kind)));
|
|
177
|
+
observations.push({
|
|
178
|
+
id: `schema:waits:${mutation.name}`,
|
|
179
|
+
text: `"${mutation.title ?? mutation.name}" cannot begin until there is ${wants.length === 1
|
|
180
|
+
? wants[0]
|
|
181
|
+
: `${wants.slice(0, -1).join(", ")} and ${wants[wants.length - 1]}`}.`,
|
|
182
|
+
nodeIds: [],
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
affordances.push({
|
|
188
|
+
id: `schema:add:${mutation.name}`,
|
|
189
|
+
label: mutation.title ?? mutation.name,
|
|
190
|
+
provider: "schema",
|
|
191
|
+
mutation: mutation.name,
|
|
192
|
+
args: {},
|
|
193
|
+
open,
|
|
194
|
+
score: BASE_SCORE - open.length,
|
|
195
|
+
why: `this makes ${(mutation.creates ?? [])
|
|
196
|
+
.filter((kind) => wanted.has(kind))
|
|
197
|
+
.map((kind) => withArticle(nounOf(store.schema.tryDefinition(kind), kind)))
|
|
198
|
+
.join(", ")}`,
|
|
199
|
+
nodeIds: [],
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return { affordances, observations };
|
|
203
|
+
}
|
|
204
|
+
if (nodes.length === 0)
|
|
205
|
+
return {};
|
|
206
|
+
const kinds = new Set(nodes.map((node) => node.kind));
|
|
207
|
+
/*
|
|
208
|
+
* CANDIDATES KNOW THE SUBJECT. A mutation that declares the edge
|
|
209
|
+
* kinds it severs is answerable from the graph: "take someone off
|
|
210
|
+
* it" offered on a run should offer the people ON that run — all
|
|
211
|
+
* five people is a lie four-fifths of the time — and offered with
|
|
212
|
+
* nobody aboard it should not be offered at all. `connects` narrows
|
|
213
|
+
* the other way: no offering to add who is already on.
|
|
214
|
+
*/
|
|
215
|
+
const across = (subjectId, edgeKinds, wantKinds) => {
|
|
216
|
+
const found = [];
|
|
217
|
+
for (const edge of store.graph.allEdges()) {
|
|
218
|
+
if (!edgeKinds.includes(edge.kind))
|
|
219
|
+
continue;
|
|
220
|
+
const other = edge.from === subjectId ? edge.to : edge.to === subjectId ? edge.from : null;
|
|
221
|
+
if (!other)
|
|
222
|
+
continue;
|
|
223
|
+
const node = store.graph.getNode(other);
|
|
224
|
+
if (!node)
|
|
225
|
+
continue;
|
|
226
|
+
if (!wantKinds.includes("*") && !wantKinds.includes(node.kind))
|
|
227
|
+
continue;
|
|
228
|
+
if (!found.includes(other))
|
|
229
|
+
found.push(other);
|
|
230
|
+
}
|
|
231
|
+
return found;
|
|
232
|
+
};
|
|
233
|
+
for (const mutation of store.allMutations()) {
|
|
234
|
+
const subject = mutation.subject;
|
|
235
|
+
if (!subject)
|
|
236
|
+
continue;
|
|
237
|
+
const accepted = subject.kinds === "*"
|
|
238
|
+
? true
|
|
239
|
+
: [...kinds].every((kind) => subject.kinds.includes(kind));
|
|
240
|
+
if (!accepted)
|
|
241
|
+
continue;
|
|
242
|
+
const subjectId = nodes.length === 1 ? nodes[0].id : null;
|
|
243
|
+
const severs = mutation.severs ?? [];
|
|
244
|
+
const connects = mutation.connects ?? [];
|
|
245
|
+
/*
|
|
246
|
+
* A PURE severing act with nothing attached is not an offer —
|
|
247
|
+
* "Restore one occurrence" with nothing skipped was a button that
|
|
248
|
+
* could only fail. A mutation that BOTH makes and breaks is a
|
|
249
|
+
* move/handover: it is exactly what an unattached subject needs,
|
|
250
|
+
* so it is never gated on attachment.
|
|
251
|
+
*/
|
|
252
|
+
if (subjectId &&
|
|
253
|
+
severs.length > 0 &&
|
|
254
|
+
connects.length === 0 &&
|
|
255
|
+
across(subjectId, severs, ["*"]).length === 0) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const open = [];
|
|
259
|
+
for (const ref of nodeRefArgs(mutation.input)) {
|
|
260
|
+
if (ref.name === subject.arg)
|
|
261
|
+
continue;
|
|
262
|
+
let candidates = ref.kinds.includes("*")
|
|
263
|
+
? store.graph.allNodes().map((node) => node.id)
|
|
264
|
+
: ref.kinds.flatMap((kind) => store.graph.nodesOfKind(kind).map((node) => node.id));
|
|
265
|
+
if (subjectId && connects.length > 0) {
|
|
266
|
+
/*
|
|
267
|
+
* Anything that CONNECTS offers only who is not already on —
|
|
268
|
+
* including a move (connects + severs), whose whole point is
|
|
269
|
+
* someone NEW. Reading severs first here offered "Reassign
|
|
270
|
+
* run" a list containing exactly the current assignee.
|
|
271
|
+
*/
|
|
272
|
+
const already = new Set(across(subjectId, connects, ref.kinds));
|
|
273
|
+
candidates = candidates.filter((id) => !already.has(id));
|
|
274
|
+
}
|
|
275
|
+
else if (subjectId && severs.length > 0) {
|
|
276
|
+
// A pure severing act reaches only what is actually attached.
|
|
277
|
+
candidates = across(subjectId, severs, ref.kinds);
|
|
278
|
+
}
|
|
279
|
+
open.push({
|
|
280
|
+
name: ref.name,
|
|
281
|
+
kinds: ref.kinds,
|
|
282
|
+
// Offering real ids is what turns "reassign" into "reassign to
|
|
283
|
+
// whom" without anyone wiring up a picker per mutation.
|
|
284
|
+
candidates: candidates.filter((id) => !selection.includes(id)),
|
|
285
|
+
shape: argShape(mutation.input, ref.name),
|
|
286
|
+
...(ref.optional ? { optional: true } : {}),
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
for (const name of otherRequiredArgs(mutation.input, subject.arg)) {
|
|
290
|
+
if (open.some((parameter) => parameter.name === name))
|
|
291
|
+
continue;
|
|
292
|
+
open.push({ name, shape: argShape(mutation.input, name) });
|
|
293
|
+
}
|
|
294
|
+
/*
|
|
295
|
+
* A ONE-PRESS ACT MUST BE ABLE TO ACT. An action with nothing
|
|
296
|
+
* required left to ask is offered as a single press — and pressed
|
|
297
|
+
* with only its subject, a derived edit whose every field is
|
|
298
|
+
* optional refused: "Nothing to change — give at least one of
|
|
299
|
+
* label a value", said on the button. Its inputs were inputs all
|
|
300
|
+
* along; being optional made them askable one at a time, not
|
|
301
|
+
* unnecessary. So an action that needs nothing more is rehearsed
|
|
302
|
+
* with what it has, and one that would refuse asks for its optional
|
|
303
|
+
* arguments instead, each of which may be skipped.
|
|
304
|
+
*/
|
|
305
|
+
if (open.length === 0 && subjectId) {
|
|
306
|
+
const optionalArgs = otherOptionalArgs(mutation.input, subject.arg);
|
|
307
|
+
if (optionalArgs.length > 0 && !rehearses(store, mutation.name, { [subject.arg]: subjectId })) {
|
|
308
|
+
for (const name of optionalArgs) {
|
|
309
|
+
const ref = nodeRefArgs(mutation.input).find((candidate) => candidate.name === name);
|
|
310
|
+
open.push({
|
|
311
|
+
name,
|
|
312
|
+
optional: true,
|
|
313
|
+
...(ref ? { kinds: ref.kinds } : {}),
|
|
314
|
+
shape: argShape(mutation.input, name),
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/*
|
|
320
|
+
* Only actions the interface can actually ASK FOR.
|
|
321
|
+
*
|
|
322
|
+
* An open argument with no candidates and no scalar shape — a
|
|
323
|
+
* structured object, say — has no honest prompt: the strip offered a
|
|
324
|
+
* text box whose every answer failed validation, which read as a
|
|
325
|
+
* button that does nothing. The mutation still exists and an agent
|
|
326
|
+
* supplies structured arguments natively; it is just not a button.
|
|
327
|
+
* Invariant repairs are unaffected — a rule that names a repair has
|
|
328
|
+
* already decided it is offerable.
|
|
329
|
+
*/
|
|
330
|
+
const askable = open.every((parameter) => parameter.optional === true
|
|
331
|
+
? true
|
|
332
|
+
: parameter.kinds !== undefined
|
|
333
|
+
? (parameter.candidates?.length ?? 0) > 0
|
|
334
|
+
: (parameter.candidates?.length ?? 0) > 0 ||
|
|
335
|
+
(parameter.shape !== undefined && parameter.shape.type !== "unknown"));
|
|
336
|
+
if (!askable)
|
|
337
|
+
continue;
|
|
338
|
+
const batch = nodes.map((node) => ({ [subject.arg]: node.id }));
|
|
339
|
+
/*
|
|
340
|
+
* AN ACT WITH NOTHING LEFT TO ASK MUST HAVE SOMETHING LEFT TO DO.
|
|
341
|
+
*
|
|
342
|
+
* One press, no arguments, and the mutation compiles to no
|
|
343
|
+
* primitives: "Close it" offered on something already closed. It was
|
|
344
|
+
* offered, pressed, and nothing happened — except a line in the
|
|
345
|
+
* activity rail claiming it had. Only asked where there is nothing
|
|
346
|
+
* left to ask, because an act still holding a question has not been
|
|
347
|
+
* decided yet, and only of the batch, so a selection of five where
|
|
348
|
+
* one is still open keeps the offer.
|
|
349
|
+
*/
|
|
350
|
+
if (open.length === 0 && !batch.some((args) => store.wouldChange({ name: mutation.name, args }))) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
affordances.push({
|
|
354
|
+
id: `schema:${mutation.name}`,
|
|
355
|
+
label: nodes.length > 1
|
|
356
|
+
? `${mutation.title ?? mutation.name} (${nodes.length})`
|
|
357
|
+
: (mutation.title ?? mutation.name),
|
|
358
|
+
provider: "schema",
|
|
359
|
+
mutation: mutation.name,
|
|
360
|
+
args: batch[0] ?? {},
|
|
361
|
+
open,
|
|
362
|
+
...(mutation.destructive ? { destructive: true } : {}),
|
|
363
|
+
...(severs.length > 0 || connects.length > 0 ? { ties: true } : {}),
|
|
364
|
+
...(nodes.length > 1 ? { batch } : {}),
|
|
365
|
+
// A mutation needing nothing more is readier than one needing three
|
|
366
|
+
// more answers, so it should surface above it.
|
|
367
|
+
score: BASE_SCORE - open.length,
|
|
368
|
+
why: nodes.length > 1
|
|
369
|
+
? `all ${nodes.length} selected nodes are ${[...kinds]
|
|
370
|
+
.map((kind) => (store.schema.tryDefinition(kind)?.plural ?? humaniseField(kind)).toLowerCase())
|
|
371
|
+
.join(" or ")}`
|
|
372
|
+
: `this is ${withArticle(nounOf(store.schema.tryDefinition(nodes[0].kind), nodes[0].kind))}`,
|
|
373
|
+
nodeIds: nodes.map((node) => node.id),
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
/*
|
|
377
|
+
* THE OTHER END OF THE TIE. "Take someone off it" declares a duty as
|
|
378
|
+
* its subject, but the person standing in a run's own view is the
|
|
379
|
+
* natural place to say "take THIS one off" — and the only offers there
|
|
380
|
+
* used to be rename and a destructive remove, which is how deleting a
|
|
381
|
+
* child from the household got clicked meaning "off this run". A
|
|
382
|
+
* mutation that declares what it severs or connects is offerable from
|
|
383
|
+
* either endpoint: the selected node fills its matching argument, and
|
|
384
|
+
* the subject's candidates come from the actual edges.
|
|
385
|
+
*/
|
|
386
|
+
if (nodes.length === 1) {
|
|
387
|
+
const chosen = nodes[0];
|
|
388
|
+
for (const mutation of store.allMutations()) {
|
|
389
|
+
const subject = mutation.subject;
|
|
390
|
+
const severs = mutation.severs ?? [];
|
|
391
|
+
const connects = mutation.connects ?? [];
|
|
392
|
+
if (!subject || (severs.length === 0 && connects.length === 0))
|
|
393
|
+
continue;
|
|
394
|
+
// Already offered the ordinary way when the selection IS the subject.
|
|
395
|
+
const subjectAccepts = subject.kinds === "*" ? "*" : subject.kinds;
|
|
396
|
+
if (subjectAccepts === "*" || subjectAccepts.includes(chosen.kind)) {
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const refs = nodeRefArgs(mutation.input);
|
|
400
|
+
const mine = refs.find((ref) => ref.name !== subject.arg &&
|
|
401
|
+
(ref.kinds.includes("*") || ref.kinds.includes(chosen.kind)));
|
|
402
|
+
if (!mine)
|
|
403
|
+
continue;
|
|
404
|
+
// Narrowed by the continue above: the subject names concrete kinds.
|
|
405
|
+
const subjectKinds = subjectAccepts;
|
|
406
|
+
const pool = subjectKinds.includes("*")
|
|
407
|
+
? store.graph.allNodes().map((node) => node.id)
|
|
408
|
+
: subjectKinds.flatMap((kind) => store.graph.nodesOfKind(kind).map((node) => node.id));
|
|
409
|
+
// Same rule as the forward direction: a move offers the NEW
|
|
410
|
+
// (everything not already tied), a pure sever offers the tied.
|
|
411
|
+
const attached = new Set(across(chosen.id, connects.length > 0 ? connects : severs, subjectKinds));
|
|
412
|
+
const subjectCandidates = connects.length > 0
|
|
413
|
+
? pool.filter((id) => !attached.has(id))
|
|
414
|
+
: pool.filter((id) => attached.has(id));
|
|
415
|
+
if (subjectCandidates.length === 0)
|
|
416
|
+
continue;
|
|
417
|
+
const open = [
|
|
418
|
+
{
|
|
419
|
+
name: subject.arg,
|
|
420
|
+
kinds: subjectKinds,
|
|
421
|
+
candidates: subjectCandidates,
|
|
422
|
+
shape: argShape(mutation.input, subject.arg),
|
|
423
|
+
},
|
|
424
|
+
];
|
|
425
|
+
for (const ref of refs) {
|
|
426
|
+
if (ref.name === mine.name || ref.name === subject.arg)
|
|
427
|
+
continue;
|
|
428
|
+
const pool = ref.kinds.includes("*")
|
|
429
|
+
? store.graph.allNodes().map((node) => node.id)
|
|
430
|
+
: ref.kinds.flatMap((kind) => store.graph.nodesOfKind(kind).map((node) => node.id));
|
|
431
|
+
open.push({
|
|
432
|
+
name: ref.name,
|
|
433
|
+
kinds: ref.kinds,
|
|
434
|
+
candidates: pool,
|
|
435
|
+
shape: argShape(mutation.input, ref.name),
|
|
436
|
+
...(ref.optional ? { optional: true } : {}),
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
for (const name of otherRequiredArgs(mutation.input, mine.name)) {
|
|
440
|
+
if (name === subject.arg || open.some((parameter) => parameter.name === name))
|
|
441
|
+
continue;
|
|
442
|
+
open.push({ name, shape: argShape(mutation.input, name) });
|
|
443
|
+
}
|
|
444
|
+
const askable = open.every((parameter) => parameter.optional === true
|
|
445
|
+
? true
|
|
446
|
+
: parameter.kinds !== undefined
|
|
447
|
+
? (parameter.candidates?.length ?? 0) > 0
|
|
448
|
+
: (parameter.candidates?.length ?? 0) > 0 ||
|
|
449
|
+
(parameter.shape !== undefined && parameter.shape.type !== "unknown"));
|
|
450
|
+
if (!askable)
|
|
451
|
+
continue;
|
|
452
|
+
affordances.push({
|
|
453
|
+
id: `schema:tie:${mutation.name}:${chosen.id}`,
|
|
454
|
+
/*
|
|
455
|
+
* THE FAR END'S OWN WORDS. `title` is written from the subject's
|
|
456
|
+
* side — "Hand it to someone", offered on the person, read as
|
|
457
|
+
* handing the person to someone. `fromTheOtherEnd` is the act's
|
|
458
|
+
* reading from here; without it the near-end title is all there
|
|
459
|
+
* is, and `graview check` says so by name.
|
|
460
|
+
*/
|
|
461
|
+
label: mutation.fromTheOtherEnd ?? mutation.title ?? mutation.name,
|
|
462
|
+
provider: "schema",
|
|
463
|
+
mutation: mutation.name,
|
|
464
|
+
args: { [mine.name]: chosen.id },
|
|
465
|
+
open,
|
|
466
|
+
ties: true,
|
|
467
|
+
...(mutation.destructive ? { destructive: true } : {}),
|
|
468
|
+
score: BASE_SCORE - open.length + 2,
|
|
469
|
+
why: `${severs.length > 0 ? "this one is on" : "this one could join"} ${open[0].candidates.length === 1 ? "it" : "one of these"}`,
|
|
470
|
+
nodeIds: [chosen.id],
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
return { affordances };
|
|
475
|
+
},
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
/** Required input fields that are not node references and not the subject. */
|
|
479
|
+
/** The arguments the input would accept unanswered, the subject aside. */
|
|
480
|
+
function otherOptionalArgs(input, subjectArg) {
|
|
481
|
+
const shape = input
|
|
482
|
+
.shape;
|
|
483
|
+
if (!shape)
|
|
484
|
+
return [];
|
|
485
|
+
return Object.entries(shape)
|
|
486
|
+
.filter(([name, field]) => name !== subjectArg && field.safeParse(undefined).success)
|
|
487
|
+
.map(([name]) => name);
|
|
488
|
+
}
|
|
489
|
+
/** Whether the mutation, called with exactly these arguments, would go through. */
|
|
490
|
+
function rehearses(store, name, args) {
|
|
491
|
+
try {
|
|
492
|
+
store.preview({ name, args });
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
return false;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
function otherRequiredArgs(input, subjectArg) {
|
|
500
|
+
const shape = input
|
|
501
|
+
.shape;
|
|
502
|
+
if (!shape)
|
|
503
|
+
return [];
|
|
504
|
+
return Object.entries(shape)
|
|
505
|
+
.filter(([name, field]) => name !== subjectArg && !field.safeParse(undefined).success)
|
|
506
|
+
.map(([name]) => name);
|
|
507
|
+
}
|
|
508
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/providers/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAA8B,MAAM,eAAe,CAAC;AAGtH,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE;YAC9D,MAAM,WAAW,GAAiB,EAAE,CAAC;YAErC;;;;;;eAMG;YACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;wBAAE,SAAS;oBACnC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;wBAC5C,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5D,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3D,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;4BAAE,SAAS;wBAChC,MAAM,IAAI,GAA4B,EAAE,CAAC;wBACzC,MAAM,IAAI,GAAoB,EAAE,CAAC;wBACjC,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;wBACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;4BACvB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC;4BACzF,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAc,CAAC,CAAC;4BACrF,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CACtC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAc,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CACzG,CAAC;4BACF,4DAA4D;4BAC5D,2CAA2C;4BAC3C,IAAI,SAAS,IAAI,CAAC,OAAO;gCAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;iCACjD,IAAI,OAAO,IAAI,CAAC,SAAS;gCAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;iCACpD,IAAI,SAAS,IAAI,OAAO,IAAI,QAAQ;gCAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;iCACjE,CAAC;gCACJ,4DAA4D;gCAC5D,6DAA6D;gCAC7D,0DAA0D;gCAC1D,IAAI,CAAC,IAAI,CAAC;oCACR,IAAI,EAAE,GAAG,CAAC,IAAI;oCACd,KAAK,EAAE,GAAG,CAAC,KAAK;oCAChB,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;oCAChC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;iCAC1C,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;wBACD,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;4BACzD,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;gCAAE,SAAS;4BAChF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC7D,CAAC;wBACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CACvC,SAAS,CAAC,QAAQ,KAAK,IAAI;4BACzB,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS;gCAC7B,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;gCACzC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;oCACvC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAC5E,CAAC;wBACF,IAAI,CAAC,OAAO;4BAAE,SAAS;wBACvB;;;;;;;;;;;;;;2BAcG;wBACH,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;4BAAE,SAAS;wBACpD,WAAW,CAAC,IAAI,CAAC;4BACf,EAAE,EAAE,eAAe,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;4BACvE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI;4BACtC,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,QAAQ,CAAC,IAAI;4BACvB,IAAI;4BACJ,IAAI;4BACJ,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BACtD,+DAA+D;4BAC/D,4CAA4C;4BAC5C,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM;4BACvC,GAAG,EAAE,iBAAiB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG;4BACtG,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;yBAC9B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,CAAC;YAED;;;;;;eAMG;YACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;gBACtC,MAAM,YAAY,GAAkB,EAAE,CAAC;gBACvC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;oBAC5C,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;wBAAE,SAAS;oBACnF,MAAM,IAAI,GAAoB,EAAE,CAAC;oBACjC,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;4BACxC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC/C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CACrD,CAAC;wBACN,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,KAAK,EAAE,GAAG,CAAC,KAAK;4BAChB,UAAU;4BACV,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;4BACzC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC5C,CAAC,CAAC;oBACL,CAAC;oBACD,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;wBACzD,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;4BAAE,SAAS;wBAChE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7D,CAAC;oBACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CACvC,SAAS,CAAC,QAAQ,KAAK,IAAI;wBACzB,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS;4BAC/B,CAAC,CAAC,4DAA4D;gCAC5D,6DAA6D;gCAC7D,yDAAyD;gCACzD,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;4BACzC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;gCACvC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAC1E,CAAC;oBACF;;;;;;;;;;;;;;;;;;uBAkBG;oBACH,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CACzB,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,QAAQ,KAAK,IAAI;4BAC3B,SAAS,CAAC,KAAK,KAAK,SAAS;4BAC7B,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;4BAC9B,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAC5C,CAAC;wBACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACvB,MAAM,KAAK,GAAG;gCACZ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;6BAClE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;4BAC7E,YAAY,CAAC,IAAI,CAAC;gCAChB,EAAE,EAAE,gBAAgB,QAAQ,CAAC,IAAI,EAAE;gCACnC,IAAI,EAAE,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,iCACvC,KAAK,CAAC,MAAM,KAAK,CAAC;oCAChB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oCACV,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EACrE,GAAG;gCACH,OAAO,EAAE,EAAE;6BACZ,CAAC,CAAC;wBACL,CAAC;wBACD,SAAS;oBACX,CAAC;oBACD,WAAW,CAAC,IAAI,CAAC;wBACf,EAAE,EAAE,cAAc,QAAQ,CAAC,IAAI,EAAE;wBACjC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI;wBACtC,QAAQ,EAAE,QAAQ;wBAClB,QAAQ,EAAE,QAAQ,CAAC,IAAI;wBACvB,IAAI,EAAE,EAAE;wBACR,IAAI;wBACJ,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM;wBAC/B,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;6BACxC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;6BAC5C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAc,CAAC,EAAE,IAAc,CAAC,CAAC,CAAC;6BAC9F,IAAI,CAAC,IAAI,CAAC,EAAE;wBACf,OAAO,EAAE,EAAE;qBACZ,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;YACvC,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAEtD;;;;;;;eAOG;YACH,MAAM,MAAM,GAAG,CACb,SAAiB,EACjB,SAA4B,EAC5B,SAA4B,EAClB,EAAE;gBACZ,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;oBAC1C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,SAAS;oBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC3F,IAAI,CAAC,KAAK;wBAAE,SAAS;oBACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACxC,IAAI,CAAC,IAAI;wBAAE,SAAS;oBACpB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAc,CAAC;wBAAE,SAAS;oBACnF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;YAEF,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;gBAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACjC,IAAI,CAAC,OAAO;oBAAE,SAAS;gBACvB,MAAM,QAAQ,GACZ,OAAO,CAAC,KAAK,KAAK,GAAG;oBACnB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,OAAO,CAAC,KAA2B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtF,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBAExB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACzC;;;;;;mBAMG;gBACH,IACE,SAAS;oBACT,MAAM,CAAC,MAAM,GAAG,CAAC;oBACjB,QAAQ,CAAC,MAAM,KAAK,CAAC;oBACrB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAC7C,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,GAAoB,EAAE,CAAC;gBACjC,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,GAAG;wBAAE,SAAS;oBACvC,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACtC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC/C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CACrD,CAAC;oBACN,IAAI,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrC;;;;;2BAKG;wBACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;wBAChE,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC3D,CAAC;yBAAM,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1C,8DAA8D;wBAC9D,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpD,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,+DAA+D;wBAC/D,wDAAwD;wBACxD,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;wBAC9D,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;wBACzC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5C,CAAC,CAAC;gBACL,CAAC;gBACD,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;wBAAE,SAAS;oBAChE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBAED;;;;;;;;;;mBAUG;gBACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;oBACnC,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;oBACpE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAA0C,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;wBACnI,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;4BAChC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;4BACrF,IAAI,CAAC,IAAI,CAAC;gCACR,IAAI;gCACJ,QAAQ,EAAE,IAAI;gCACd,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCACpC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;6BACtC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED;;;;;;;;;;mBAUG;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CACvC,SAAS,CAAC,QAAQ,KAAK,IAAI;oBACzB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS;wBAC/B,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;wBACzC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;4BACvC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAC1E,CAAC;gBACF,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAEhE;;;;;;;;;;mBAUG;gBACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;oBACjG,SAAS;gBACX,CAAC;gBACD,WAAW,CAAC,IAAI,CAAC;oBACf,EAAE,EAAE,UAAU,QAAQ,CAAC,IAAI,EAAE;oBAC7B,KAAK,EACH,KAAK,CAAC,MAAM,GAAG,CAAC;wBACd,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,GAAG;wBACxD,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC;oBACvC,QAAQ,EAAE,QAAQ;oBAClB,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;oBACpB,IAAI;oBACJ,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtD,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtC,oEAAoE;oBACpE,+CAA+C;oBAC/C,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM;oBAC/B,GAAG,EACD,KAAK,CAAC,MAAM,GAAG,CAAC;wBACd,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC,GAAG,KAAK,CAAC;6BACjD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAc,CAAC,EAAE,MAAM,IAAI,aAAa,CAAC,IAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;6BAClH,IAAI,CAAC,MAAM,CAAC,EAAE;wBACnB,CAAC,CAAC,WAAW,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAc,CAAC,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAc,CAAC,CAAC,EAAE;oBACtH,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;iBACtC,CAAC,CAAC;YACL,CAAC;YAED;;;;;;;;;eASG;YACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;gBACzB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;oBAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;oBACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;oBACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;oBACzC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;wBAAE,SAAS;oBACzE,sEAAsE;oBACtE,MAAM,cAAc,GACjB,OAAO,CAAC,KAAiB,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,OAAO,CAAC,KAA2B,CAAC;oBAClF,IAAI,cAAc,KAAK,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAc,CAAC,EAAE,CAAC;wBAC7E,SAAS;oBACX,CAAC;oBACD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CACpB,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,GAAG;wBACxB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAc,CAAC,CAAC,CACzE,CAAC;oBACF,IAAI,CAAC,IAAI;wBAAE,SAAS;oBACpB,oEAAoE;oBACpE,MAAM,YAAY,GAAG,cAAc,CAAC;oBACpC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACrC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC/C,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5B,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CACrD,CAAC;oBACN,4DAA4D;oBAC5D,+DAA+D;oBAC/D,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CACzE,CAAC;oBACF,MAAM,iBAAiB,GACrB,QAAQ,CAAC,MAAM,GAAG,CAAC;wBACjB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACxC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC5C,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;wBAAE,SAAS;oBAC7C,MAAM,IAAI,GAAoB;wBAC5B;4BACE,IAAI,EAAE,OAAO,CAAC,GAAG;4BACjB,KAAK,EAAE,YAAY;4BACnB,UAAU,EAAE,iBAAiB;4BAC7B,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;yBAC7C;qBACF,CAAC;oBACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,GAAG;4BAAE,SAAS;wBACjE,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;4BAClC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC/C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CACrD,CAAC;wBACN,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,KAAK,EAAE,GAAG,CAAC,KAAK;4BAChB,UAAU,EAAE,IAAI;4BAChB,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;4BACzC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC5C,CAAC,CAAC;oBACL,CAAC;oBACD,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChE,IAAI,IAAI,KAAK,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;4BAAE,SAAS;wBACxF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7D,CAAC;oBACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CACvC,SAAS,CAAC,QAAQ,KAAK,IAAI;wBACzB,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS;4BAC7B,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;4BACzC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;gCACvC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAC5E,CAAC;oBACF,IAAI,CAAC,OAAO;wBAAE,SAAS;oBACvB,WAAW,CAAC,IAAI,CAAC;wBACf,EAAE,EAAE,cAAc,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,EAAE;wBAC9C;;;;;;2BAMG;wBACH,KAAK,EAAE,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI;wBAClE,QAAQ,EAAE,QAAQ;wBAClB,QAAQ,EAAE,QAAQ,CAAC,IAAI;wBACvB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE;wBAChC,IAAI;wBACJ,IAAI,EAAE,IAAI;wBACV,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtD,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;wBACnC,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,UAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE;wBACnI,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,EAAE,WAAW,EAAE,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,SAAS,iBAAiB,CAAC,KAAc,EAAE,UAAkB;IAC3D,MAAM,KAAK,GAAI,KAAyF;SACrG,KAAK,CAAC;IACT,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;SACpF,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,mFAAmF;AACnF,SAAS,SAAS,CAChB,KAAwC,EACxC,IAAY,EACZ,IAA6B;IAE7B,IAAI,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,UAAkB;IAC3D,MAAM,KAAK,GAAI,KAAyF;SACrG,KAAK,CAAC;IACT,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;SACrF,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type AnySchema } from "@graview/core";
|
|
2
|
+
import type { AffordanceProvider } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* What is TRUE about this selection, and what that makes worth doing.
|
|
5
|
+
*
|
|
6
|
+
* Nothing here knows what a duty or a person is. It notices shared
|
|
7
|
+
* neighbours, agreement on a field, and the one node that breaks the
|
|
8
|
+
* agreement — then looks for a declared mutation that could resolve the
|
|
9
|
+
* difference. "Move the Wednesday run to Tuesday like the other three" comes
|
|
10
|
+
* out of this without anyone writing a rule about days, because the schema
|
|
11
|
+
* already said which mutation writes that field.
|
|
12
|
+
*/
|
|
13
|
+
export declare function structureProvider<S extends AnySchema>(): AffordanceProvider<S>;
|
|
14
|
+
//# sourceMappingURL=structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/providers/structure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,SAAS,EAAqB,MAAM,eAAe,CAAC;AACpH,OAAO,KAAK,EAAc,kBAAkB,EAAe,MAAM,aAAa,CAAC;AAO/E;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,SAAS,KAAK,kBAAkB,CAAC,CAAC,CAAC,CA+K9E"}
|