@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.
Files changed (111) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +47 -0
  3. package/dist/agent/adapters.d.ts +43 -0
  4. package/dist/agent/adapters.d.ts.map +1 -0
  5. package/dist/agent/adapters.js +52 -0
  6. package/dist/agent/adapters.js.map +1 -0
  7. package/dist/agent/tools.d.ts +105 -0
  8. package/dist/agent/tools.d.ts.map +1 -0
  9. package/dist/agent/tools.js +311 -0
  10. package/dist/agent/tools.js.map +1 -0
  11. package/dist/cli.d.ts +37 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +306 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/conversation.d.ts +108 -0
  16. package/dist/conversation.d.ts.map +1 -0
  17. package/dist/conversation.js +698 -0
  18. package/dist/conversation.js.map +1 -0
  19. package/dist/decide.d.ts +43 -0
  20. package/dist/decide.d.ts.map +1 -0
  21. package/dist/decide.js +125 -0
  22. package/dist/decide.js.map +1 -0
  23. package/dist/derive.d.ts +84 -0
  24. package/dist/derive.d.ts.map +1 -0
  25. package/dist/derive.js +302 -0
  26. package/dist/derive.js.map +1 -0
  27. package/dist/edit.d.ts +70 -0
  28. package/dist/edit.d.ts.map +1 -0
  29. package/dist/edit.js +97 -0
  30. package/dist/edit.js.map +1 -0
  31. package/dist/figure.d.ts +53 -0
  32. package/dist/figure.d.ts.map +1 -0
  33. package/dist/figure.js +86 -0
  34. package/dist/figure.js.map +1 -0
  35. package/dist/index.d.ts +44 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +31 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/intelligence.d.ts +132 -0
  40. package/dist/intelligence.d.ts.map +1 -0
  41. package/dist/intelligence.js +463 -0
  42. package/dist/intelligence.js.map +1 -0
  43. package/dist/local.d.ts +192 -0
  44. package/dist/local.d.ts.map +1 -0
  45. package/dist/local.js +365 -0
  46. package/dist/local.js.map +1 -0
  47. package/dist/loop.d.ts +84 -0
  48. package/dist/loop.d.ts.map +1 -0
  49. package/dist/loop.js +173 -0
  50. package/dist/loop.js.map +1 -0
  51. package/dist/mcp-stdio.d.ts +38 -0
  52. package/dist/mcp-stdio.d.ts.map +1 -0
  53. package/dist/mcp-stdio.js +83 -0
  54. package/dist/mcp-stdio.js.map +1 -0
  55. package/dist/pins.d.ts +29 -0
  56. package/dist/pins.d.ts.map +1 -0
  57. package/dist/pins.js +60 -0
  58. package/dist/pins.js.map +1 -0
  59. package/dist/plan.d.ts +150 -0
  60. package/dist/plan.d.ts.map +1 -0
  61. package/dist/plan.js +303 -0
  62. package/dist/plan.js.map +1 -0
  63. package/dist/providers/insight.d.ts +14 -0
  64. package/dist/providers/insight.d.ts.map +1 -0
  65. package/dist/providers/insight.js +81 -0
  66. package/dist/providers/insight.js.map +1 -0
  67. package/dist/providers/invariant.d.ts +14 -0
  68. package/dist/providers/invariant.d.ts.map +1 -0
  69. package/dist/providers/invariant.js +123 -0
  70. package/dist/providers/invariant.js.map +1 -0
  71. package/dist/providers/jev.d.ts +115 -0
  72. package/dist/providers/jev.d.ts.map +1 -0
  73. package/dist/providers/jev.js +148 -0
  74. package/dist/providers/jev.js.map +1 -0
  75. package/dist/providers/lens.d.ts +24 -0
  76. package/dist/providers/lens.d.ts.map +1 -0
  77. package/dist/providers/lens.js +36 -0
  78. package/dist/providers/lens.js.map +1 -0
  79. package/dist/providers/llm.d.ts +25 -0
  80. package/dist/providers/llm.d.ts.map +1 -0
  81. package/dist/providers/llm.js +44 -0
  82. package/dist/providers/llm.js.map +1 -0
  83. package/dist/providers/schema.d.ts +12 -0
  84. package/dist/providers/schema.d.ts.map +1 -0
  85. package/dist/providers/schema.js +508 -0
  86. package/dist/providers/schema.js.map +1 -0
  87. package/dist/providers/structure.d.ts +14 -0
  88. package/dist/providers/structure.d.ts.map +1 -0
  89. package/dist/providers/structure.js +211 -0
  90. package/dist/providers/structure.js.map +1 -0
  91. package/dist/questions.d.ts +162 -0
  92. package/dist/questions.d.ts.map +1 -0
  93. package/dist/questions.js +316 -0
  94. package/dist/questions.js.map +1 -0
  95. package/dist/run.d.ts +202 -0
  96. package/dist/run.d.ts.map +1 -0
  97. package/dist/run.js +453 -0
  98. package/dist/run.js.map +1 -0
  99. package/dist/space.d.ts +50 -0
  100. package/dist/space.d.ts.map +1 -0
  101. package/dist/space.js +55 -0
  102. package/dist/space.js.map +1 -0
  103. package/dist/types.d.ts +122 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/usage.d.ts +10 -0
  108. package/dist/usage.d.ts.map +1 -0
  109. package/dist/usage.js +59 -0
  110. package/dist/usage.js.map +1 -0
  111. package/package.json +61 -0
package/dist/run.js ADDED
@@ -0,0 +1,453 @@
1
+ import { isCurrent, labelOf } from "@graview/core";
2
+ import { applyPlan, planFrom } from "./plan.js";
3
+ import { jevCostUsd } from "./providers/jev.js";
4
+ import { nodeState, pairQuestion, questionsForInvariant, questionsForKind, questionsForMutation, scoreToValue, } from "./questions.js";
5
+ /** How sure, 0–1, to three places — a truth's is its distance from even. */
6
+ const confidenceOf = (answer) => Math.round((answer.type === "noul" ? Math.abs(answer.noul - 0.5) * 2 : answer.confidence) * 1000) / 1000;
7
+ /** The distribution, highest first, as options a person could take. */
8
+ const distributionOf = (answer) => {
9
+ if (answer.type === "noul") {
10
+ return [
11
+ { value: "yes", probability: answer.noul },
12
+ { value: "no", probability: 1 - answer.noul },
13
+ ].sort((a, b) => b.probability - a.probability);
14
+ }
15
+ return Object.entries(answer.probabilities)
16
+ .map(([value, probability]) => ({ value, probability }))
17
+ .sort((a, b) => b.probability - a.probability);
18
+ };
19
+ /**
20
+ * WHY AN ANSWER IS A QUESTION. A split — the top two options within
21
+ * `within` of each other — is a question for a person, not an answer with
22
+ * a low number beside it; and an answer below the floor is a shrug. Either
23
+ * is offered. Undefined means it is an answer.
24
+ */
25
+ export function offerOf(answer, options = {}) {
26
+ const floor = options.floor ?? 0.5;
27
+ const within = options.splitWithin ?? 0.15;
28
+ const [first, second] = distributionOf(answer);
29
+ if (first && second && first.probability - second.probability <= within)
30
+ return "split";
31
+ if (confidenceOf(answer) < floor)
32
+ return "unsure";
33
+ return undefined;
34
+ }
35
+ /** The answer as the value the argument wants. */
36
+ export function valueOf(question, answer) {
37
+ switch (answer.type) {
38
+ case "choice":
39
+ return answer.choice;
40
+ case "noul":
41
+ return answer.noul >= 0.5;
42
+ case "score":
43
+ return scoreToValue({ min: question.scale?.min ?? 0 }, answer.score);
44
+ default:
45
+ return undefined;
46
+ }
47
+ }
48
+ function currentOfKind(store, kind, today) {
49
+ const definition = store.schema.tryDefinition(kind);
50
+ return store.graph.nodesOfKind(kind).filter((node) => isCurrent(definition, node, today));
51
+ }
52
+ /**
53
+ * THE QUESTIONS A STEP ASKS, per node, without asking them — so a run can
54
+ * be read before it is run and refused before it costs anything.
55
+ */
56
+ function questionsOfStep(store, step, today) {
57
+ if ("fill" in step) {
58
+ const nodes = currentOfKind(store, step.fill, today).filter((node) => step.where?.(node) ?? true);
59
+ const all = questionsForKind(store, step.fill).filter((q) => q.about === "field" && q.writes !== undefined);
60
+ const visits = nodes.map((node) => ({
61
+ nodeId: node.id,
62
+ state: nodeState(store, node.id),
63
+ questions: all.filter((q) => {
64
+ if (q.about !== "field")
65
+ return false;
66
+ if (step.fields && !step.fields.includes(q.field))
67
+ return false;
68
+ if ((step.including ?? "unset") === "unset") {
69
+ const held = node[q.field];
70
+ return held === undefined || held === null || held === "";
71
+ }
72
+ return true;
73
+ }),
74
+ }));
75
+ return { what: `fill ${step.fields ? step.fields.join(", ") : "every typed field"} of every ${step.fill}`, visits: visits.filter((v) => v.questions.length > 0) };
76
+ }
77
+ if ("ask" in step) {
78
+ const mutation = store.mutation(step.ask);
79
+ const subjectArg = mutation.subject?.arg;
80
+ const nodes = currentOfKind(store, step.over, today).filter((node) => step.where?.(node) ?? true);
81
+ const visits = nodes.map((node) => {
82
+ const given = { ...(subjectArg ? { [subjectArg]: node.id } : {}), ...(step.given?.(node) ?? {}) };
83
+ return { nodeId: node.id, state: nodeState(store, node.id), questions: questionsForMutation(store, step.ask, given) };
84
+ });
85
+ return { what: `ask "${mutation.title ?? step.ask}" of every ${step.over}`, visits: visits.filter((v) => v.questions.length > 0) };
86
+ }
87
+ if ("judge" in step) {
88
+ const violations = store.violations().filter((v) => v.invariant === step.judge);
89
+ const visits = violations.map((violation) => ({
90
+ ...(violation.subjectId ? { nodeId: violation.subjectId } : {}),
91
+ state: {
92
+ ...(violation.subjectId ? nodeState(store, violation.subjectId) : {}),
93
+ broken: violation.message,
94
+ implicated: violation.nodeIds.map((id) => {
95
+ const node = store.graph.getNode(id);
96
+ return node ? labelOf(store.schema.tryDefinition(node.kind), node) : id;
97
+ }),
98
+ },
99
+ questions: questionsForInvariant(store, step.judge, violation).filter((q) => q.about === "repair"),
100
+ violation,
101
+ }));
102
+ return { what: `judge every violation of "${step.judge}"`, visits: visits.filter((v) => v.questions.length > 0) };
103
+ }
104
+ const subjects = currentOfKind(store, step.over, today);
105
+ const others = currentOfKind(store, step.against, today);
106
+ const visits = [];
107
+ for (const a of subjects) {
108
+ const questions = [];
109
+ for (const b of others) {
110
+ if (step.where && !step.where(a, b))
111
+ continue;
112
+ const question = pairQuestion(store, step.pair, a.id, b.id);
113
+ if (question)
114
+ questions.push(question);
115
+ }
116
+ if (questions.length > 0) {
117
+ const state = { ...nodeState(store, a.id), against: others.map((b) => ({ id: b.id, ...nodeState(store, b.id) })) };
118
+ visits.push({ nodeId: a.id, state, questions });
119
+ }
120
+ }
121
+ return { what: `ask "${store.mutation(step.pair).title ?? step.pair}" of every ${step.over} against every ${step.against}`, visits };
122
+ }
123
+ /** What a run would do, counted, before it does any of it. */
124
+ export function readRun(store, run, options = {}) {
125
+ const steps = run.steps.map((step, index) => {
126
+ const { what, visits } = questionsOfStep(store, step, options.today);
127
+ const questions = visits.reduce((sum, visit) => sum + visit.questions.length, 0);
128
+ const chars = visits.reduce((sum, visit) => sum + JSON.stringify({ state: visit.state, questions: Object.fromEntries(visit.questions.map((q) => [q.id, q.question])) }).length, 0);
129
+ return { step: index, what, nodes: visits.length, questions, calls: visits.length, chars };
130
+ });
131
+ const questions = steps.reduce((sum, step) => sum + step.questions, 0);
132
+ const calls = steps.reduce((sum, step) => sum + step.calls, 0);
133
+ const approxInputTokens = Math.ceil(steps.reduce((sum, step) => sum + step.chars, 0) / 4);
134
+ const approxUsd = jevCostUsd(approxInputTokens);
135
+ let refused;
136
+ if (run.budget?.questions !== undefined && questions > run.budget.questions) {
137
+ refused = `This run would ask ${questions} questions and its budget is ${run.budget.questions}. It did not begin.`;
138
+ }
139
+ else if (run.budget?.usd !== undefined && approxUsd > run.budget.usd) {
140
+ refused = `This run would cost about $${approxUsd.toFixed(4)} and its budget is $${run.budget.usd}. It did not begin.`;
141
+ }
142
+ return {
143
+ name: run.name,
144
+ steps: steps.map(({ chars: _chars, ...step }) => step),
145
+ questions,
146
+ calls,
147
+ approxInputTokens,
148
+ approxUsd,
149
+ ...(refused ? { refused } : {}),
150
+ };
151
+ }
152
+ /** A run's reading, in words a person can weigh before pressing. */
153
+ export function describeRun(reading) {
154
+ const lines = [
155
+ `${reading.name}: ${reading.questions} questions over ${reading.calls} calls, about $${reading.approxUsd.toFixed(4)}.`,
156
+ ...reading.steps.map((step) => `${step.step + 1}. ${step.what} — ${step.nodes} node${step.nodes === 1 ? "" : "s"}, ${step.questions} question${step.questions === 1 ? "" : "s"}.`),
157
+ ];
158
+ if (reading.refused)
159
+ lines.push(`REFUSED: ${reading.refused}`);
160
+ return lines.join("\n");
161
+ }
162
+ /** The calls one visit's answers become. */
163
+ function callsFrom(store, step, visit, answers, index, sureness = {}) {
164
+ const out = [];
165
+ const nodeLabel = (id) => {
166
+ const node = id ? store.graph.getNode(id) : undefined;
167
+ return node ? labelOf(store.schema.tryDefinition(node.kind), node) : undefined;
168
+ };
169
+ /*
170
+ * AN ANSWER OR A QUESTION. A call is made only from an answer that IS
171
+ * one; a split or a shrug becomes an offered question at the node, each
172
+ * option carrying the call it would be — so the person's press lands
173
+ * through the same path the run's own confident calls do.
174
+ */
175
+ const one = (question, answer, call, withValue) => {
176
+ const confidence = confidenceOf(answer);
177
+ const because = offerOf(answer, sureness);
178
+ const base = {
179
+ step: index,
180
+ ...(visit.nodeId ? { nodeId: visit.nodeId } : {}),
181
+ question,
182
+ answer,
183
+ confidence,
184
+ };
185
+ if (!because || !withValue)
186
+ return { ...base, ...(call ? { call: { ...call, confidence } } : {}) };
187
+ const label = nodeLabel(visit.nodeId);
188
+ const offered = {
189
+ id: question.id,
190
+ ...(visit.nodeId ? { nodeId: visit.nodeId } : {}),
191
+ ...(label ? { nodeLabel: label } : {}),
192
+ asks: question.question.instructions,
193
+ because,
194
+ confidence,
195
+ options: distributionOf(answer).map((option) => {
196
+ const would = withValue(option.value);
197
+ return { ...option, ...(would ? { call: { ...would, confidence: option.probability } } : {}) };
198
+ }),
199
+ };
200
+ return { ...base, offered };
201
+ };
202
+ if ("fill" in step) {
203
+ for (const question of visit.questions) {
204
+ const answer = answers[question.id];
205
+ if (!answer || question.about !== "field" || !question.writes || !visit.nodeId)
206
+ continue;
207
+ const value = valueOf(question, answer);
208
+ const writes = question.writes;
209
+ const nodeId = visit.nodeId;
210
+ const called = (held) => ({
211
+ mutation: writes.mutation,
212
+ args: { [writes.subjectArg]: nodeId, [writes.arg]: held },
213
+ why: `${question.field} of ${nodeLabel(nodeId) ?? nodeId}: ${String(held)}`,
214
+ });
215
+ out.push(one(question, answer, called(value), (option) => answer.type === "noul"
216
+ ? called(option === "yes")
217
+ : answer.type === "score"
218
+ ? called(scoreToValue({ min: question.scale?.min ?? 0 }, Number(option)))
219
+ : called(option)));
220
+ }
221
+ return out;
222
+ }
223
+ if ("ask" in step) {
224
+ const mutation = store.mutation(step.ask);
225
+ const subjectArg = mutation.subject?.arg;
226
+ const node = visit.nodeId ? store.graph.getNode(visit.nodeId) : undefined;
227
+ const args = {
228
+ ...(subjectArg && visit.nodeId ? { [subjectArg]: visit.nodeId } : {}),
229
+ ...(node ? (step.given?.(node) ?? {}) : {}),
230
+ };
231
+ let least = 1;
232
+ const parts = [];
233
+ let complete = true;
234
+ for (const question of visit.questions) {
235
+ const answer = answers[question.id];
236
+ if (!answer || question.about !== "argument") {
237
+ complete = false;
238
+ continue;
239
+ }
240
+ args[question.arg] = valueOf(question, answer);
241
+ least = Math.min(least, confidenceOf(answer));
242
+ parts.push(`${question.arg}: ${String(args[question.arg])}`);
243
+ }
244
+ const call = complete
245
+ ? { mutation: step.ask, args, why: `${mutation.title ?? step.ask} — ${parts.join(", ")}`, confidence: least }
246
+ : undefined;
247
+ /*
248
+ * One call carries every argument, so ONE unsure argument makes the
249
+ * whole call a question: the options are that argument's, each with
250
+ * the rest of the call as decided.
251
+ */
252
+ for (const question of visit.questions) {
253
+ const answer = answers[question.id];
254
+ if (!answer || question.about !== "argument")
255
+ continue;
256
+ out.push(one(question, answer, call, (option) => call
257
+ ? {
258
+ ...call,
259
+ args: {
260
+ ...call.args,
261
+ [question.arg]: answer.type === "noul"
262
+ ? option === "yes"
263
+ : answer.type === "score"
264
+ ? scoreToValue({ min: question.scale?.min ?? 0 }, Number(option))
265
+ : option,
266
+ },
267
+ }
268
+ : undefined));
269
+ }
270
+ return out;
271
+ }
272
+ if ("judge" in step) {
273
+ for (const question of visit.questions) {
274
+ const answer = answers[question.id];
275
+ if (!answer || question.about !== "repair" || answer.type !== "choice")
276
+ continue;
277
+ const chosen = question.options[answer.choice];
278
+ if (!chosen)
279
+ continue;
280
+ const called = (key) => {
281
+ const option = question.options[key];
282
+ if (!option)
283
+ return undefined;
284
+ return {
285
+ mutation: option.mutation,
286
+ args: { ...option.args },
287
+ why: `${visit.violation?.message ?? question.invariant}: ${question.question.type === "choice" ? (question.question.criteria[key] ?? key) : key}`,
288
+ };
289
+ };
290
+ out.push(one(question, answer, called(answer.choice), called));
291
+ }
292
+ return out;
293
+ }
294
+ const threshold = step.threshold ?? 0.5;
295
+ const mutation = store.mutation(step.pair);
296
+ const subjectArg = mutation.subject?.arg;
297
+ for (const question of visit.questions) {
298
+ const answer = answers[question.id];
299
+ if (!answer || answer.type !== "noul" || question.about !== "argument" || !subjectArg)
300
+ continue;
301
+ const otherId = question.other;
302
+ const holds = answer.noul >= threshold;
303
+ const yes = otherId
304
+ ? {
305
+ mutation: step.pair,
306
+ args: { [subjectArg]: visit.nodeId, [question.arg]: otherId },
307
+ why: `${question.question.instructions.split("?")[0]} — yes`,
308
+ }
309
+ : undefined;
310
+ out.push(one(question, answer, holds ? yes : undefined, (option) => (option === "yes" ? yes : undefined)));
311
+ }
312
+ return out;
313
+ }
314
+ /**
315
+ * Runs the run. Every visit to a node is announced through `onCall` as a
316
+ * read of that node — the same shape a seat's tool calls take, so the
317
+ * Activity rail marks where the run is without a second reporting path.
318
+ */
319
+ export async function runFrom(store, run, options) {
320
+ const author = options.author ?? { kind: "agent", id: run.name, session: `run-${Date.now().toString(36)}` };
321
+ const batch = options.batch ?? `run:${run.name}:${Date.now().toString(36)}`;
322
+ const land = options.land ?? "review";
323
+ const reading = readRun(store, run, options.today !== undefined ? { today: options.today } : {});
324
+ const usage = { questions: 0, calls: 0, inputTokens: 0, usd: 0 };
325
+ const planOptions = { ...(options.app ? { app: options.app } : {}), principal: options.principal ?? author };
326
+ const empty = planFrom(store, [], planOptions);
327
+ if (reading.refused) {
328
+ return { name: run.name, author, batch, reading, steps: [], plan: empty, questions: [], usage, refused: reading.refused };
329
+ }
330
+ /* The Decide the run started with. A rung switched underneath does not move it. */
331
+ const decide = options.decide;
332
+ const steps = [];
333
+ const everything = [];
334
+ let stopped;
335
+ let applied;
336
+ for (let index = 0; index < run.steps.length; index++) {
337
+ const step = run.steps[index];
338
+ /* Re-read on the live graph: an earlier step may have changed what is unset. */
339
+ const { what, visits } = questionsOfStep(store, step, options.today);
340
+ const answered = [];
341
+ const nodes = [];
342
+ let asked = 0;
343
+ for (const visit of visits) {
344
+ const at = new Date().toISOString();
345
+ const node = visit.nodeId ? store.graph.getNode(visit.nodeId) : undefined;
346
+ const announced = {
347
+ name: "decide",
348
+ args: { step: index, what, ...(node ? { kind: node.kind, node: visit.nodeId } : {}) },
349
+ mutating: false,
350
+ at,
351
+ };
352
+ options.onCall?.({ ...announced, phase: "running" });
353
+ const questions = {};
354
+ for (const q of visit.questions)
355
+ questions[q.id] = q.question;
356
+ let decided;
357
+ try {
358
+ decided = await decide(visit.state, questions);
359
+ }
360
+ catch (error) {
361
+ const why = error instanceof Error ? error.message : String(error);
362
+ options.onCall?.({ ...announced, phase: "failed", error: why });
363
+ stopped = { at: index, why };
364
+ break;
365
+ }
366
+ asked += visit.questions.length;
367
+ usage.questions += visit.questions.length;
368
+ usage.calls += 1;
369
+ usage.inputTokens += decided.usage.inputTokens;
370
+ if (visit.nodeId)
371
+ nodes.push(visit.nodeId);
372
+ options.onCall?.({ ...announced, phase: "ok", ...(visit.nodeId ? { reads: [visit.nodeId] } : {}) });
373
+ answered.push(...callsFrom(store, step, visit, decided.answers, index, {
374
+ ...(options.floor !== undefined ? { floor: options.floor } : {}),
375
+ ...(options.splitWithin !== undefined ? { splitWithin: options.splitWithin } : {}),
376
+ }));
377
+ }
378
+ if (stopped)
379
+ break;
380
+ /*
381
+ * A call with any offered argument is a question, not a proposal: the
382
+ * whole call waits on the person's press.
383
+ */
384
+ const asked_of_person = new Set(answered.filter((a) => a.offered).map((a) => a.call).filter(Boolean));
385
+ const proposals = [...new Set(answered.map((a) => a.call).filter((call) => call !== undefined && !asked_of_person.has(call)))];
386
+ const questions = answered.map((a) => a.offered).filter((q) => q !== undefined);
387
+ const plan = planFrom(store, proposals, planOptions);
388
+ let landed;
389
+ if (land === "each-step" && plan.ready.length > 0) {
390
+ landed = applyPlan(store, plan, { author, batch, keepWhatRan: true });
391
+ applied = landed;
392
+ }
393
+ const outcome = {
394
+ step: index,
395
+ what,
396
+ nodes,
397
+ asked,
398
+ answered,
399
+ proposals,
400
+ questions,
401
+ plan,
402
+ ...(landed
403
+ ? { applied: { batch: landed.batch, applied: landed.applied, made: landed.made, ...(landed.stoppedAt ? { stoppedAt: landed.stoppedAt } : {}) } }
404
+ : {}),
405
+ };
406
+ steps.push(outcome);
407
+ everything.push(...proposals);
408
+ const verdict = options.judge?.(outcome) ?? true;
409
+ if (verdict !== true) {
410
+ stopped = { at: index, why: verdict };
411
+ break;
412
+ }
413
+ }
414
+ usage.usd = jevCostUsd(usage.inputTokens);
415
+ const plan = land === "each-step" ? planFrom(store, [], planOptions) : planFrom(store, everything, planOptions);
416
+ return {
417
+ name: run.name,
418
+ author,
419
+ batch,
420
+ reading,
421
+ steps,
422
+ plan,
423
+ questions: steps.flatMap((step) => step.questions),
424
+ ...(applied ? { applied } : {}),
425
+ usage,
426
+ ...(stopped ? { stopped } : {}),
427
+ };
428
+ }
429
+ /**
430
+ * A RUN, SPOKEN BY THE SEAT. What it asked, what it proposes, what it is
431
+ * asking the person — as one ChatReply, so the outcome travels the seat's
432
+ * own surfaces: the thread, the rail, a figure's bubble. The confident
433
+ * calls are proposals; the split or unsure ones are questions standing at
434
+ * their nodes; a refusal or a stop is said, not logged.
435
+ */
436
+ export function replyFromRun(result) {
437
+ if (result.refused)
438
+ return { say: result.refused, proposals: [] };
439
+ const proposals = result.plan.ready.map((entry) => entry.call);
440
+ const questions = result.questions;
441
+ const parts = [
442
+ `Asked ${result.usage.questions} question${result.usage.questions === 1 ? "" : "s"} over ${result.steps.length} step${result.steps.length === 1 ? "" : "s"}.`,
443
+ proposals.length > 0 ? `${proposals.length} change${proposals.length === 1 ? "" : "s"} proposed.` : "Nothing to change.",
444
+ questions.length > 0 ? `${questions.length} question${questions.length === 1 ? "" : "s"} for you.` : "",
445
+ result.stopped ? `Stopped at step ${result.stopped.at + 1}: ${result.stopped.why}` : "",
446
+ ].filter(Boolean);
447
+ return { say: parts.join(" "), proposals, ...(questions.length > 0 ? { questions } : {}) };
448
+ }
449
+ /** Lands a reviewed run as one batch, attributed to the run's own seat. One undo. */
450
+ export function landRun(store, result, plan = result.plan) {
451
+ return applyPlan(store, plan, { author: result.author, batch: result.batch });
452
+ }
453
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAA8D,MAAM,eAAe,CAAC;AAE/G,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAmE,MAAM,WAAW,CAAC;AAEjH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,GAIb,MAAM,gBAAgB,CAAC;AAmJxB,4EAA4E;AAC5E,MAAM,YAAY,GAAG,CAAC,MAAc,EAAU,EAAE,CAC9C,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAE3G,uEAAuE;AACvE,MAAM,cAAc,GAAG,CAAC,MAAc,EAAuE,EAAE;IAC7G,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO;YACL,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE;YAC1C,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE;SAC9C,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;SACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,UAAsE,EAAE;IAC9G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM;QAAE,OAAO,OAAO,CAAC;IACxF,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,OAAO,CAAC,QAAyB,EAAE,MAAc;IAC/D,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAsB,KAAe,EAAE,IAAY,EAAE,KAAc;IACvF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpD,OAAQ,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAClE,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CACnC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CACtB,KAAe,EACf,IAAa,EACb,KAAc;IAEd,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAClG,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC5G,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1B,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;oBAAE,OAAO,KAAK,CAAC;gBACtC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAChE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;oBAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC3B,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC5D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;SACH,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB,aAAa,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IACpK,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;QACzC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAClG,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAClG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACxH,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,QAAQ,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,cAAc,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IACrI,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC5C,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,KAAK,EAAE;gBACL,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrE,MAAM,EAAE,SAAS,CAAC,OAAO;gBACzB,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;oBACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACrC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAc,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpF,CAAC,CAAC;aACH;YACD,SAAS,EAAE,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;YAClG,SAAS;SACV,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,IAAI,EAAE,6BAA6B,IAAI,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IACpH,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,MAAM,GAAuE,EAAE,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAsB,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAE,SAAS;YAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,QAAQ;gBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACnH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,kBAAkB,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC;AACvI,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,OAAO,CAAsB,KAAe,EAAE,GAAmB,EAAE,UAAuC,EAAE;IAC1H,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC1C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CACzB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAClJ,CAAC,CACF,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAChD,IAAI,OAA2B,CAAC;IAChC,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC5E,OAAO,GAAG,sBAAsB,SAAS,gCAAgC,GAAG,CAAC,MAAM,CAAC,SAAS,qBAAqB,CAAC;IACrH,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,IAAI,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACvE,OAAO,GAAG,8BAA8B,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,GAAG,CAAC,MAAM,CAAC,GAAG,qBAAqB,CAAC;IACzH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;QACtD,SAAS;QACT,KAAK;QACL,iBAAiB;QACjB,SAAS;QACT,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,OAAmB;IAC7C,MAAM,KAAK,GAAG;QACZ,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,mBAAmB,OAAO,CAAC,KAAK,kBAAkB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACtH,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;KACnL,CAAC;IACF,IAAI,OAAO,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4CAA4C;AAC5C,SAAS,SAAS,CAChB,KAAe,EACf,IAAa,EACb,KAAmH,EACnH,OAAyC,EACzC,KAAa,EACb,WAAuE,EAAE;IAEzE,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,CAAC,EAAsB,EAAsB,EAAE;QAC/D,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAc,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3F,CAAC,CAAC;IACF;;;;;OAKG;IACH,MAAM,GAAG,GAAG,CACV,QAAyB,EACzB,MAAc,EACd,IAAkB,EAClB,SAAsD,EAC5C,EAAE;QACZ,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,KAAK;YACX,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,QAAQ;YACR,MAAM;YACN,UAAU;SACX,CAAC;QACF,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACnG,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAoB;YAC/B,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY;YACpC,OAAO;YACP,UAAU;YACV,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtC,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACjG,CAAC,CAAC;SACH,CAAC;QACF,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC,CAAC;IACF,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,SAAS;YACzF,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,CAAC,IAAa,EAAe,EAAE,CAAC,CAAC;gBAC9C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;gBACzD,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE;aAC5E,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAC9C,MAAM,CAAC,IAAI,KAAK,MAAM;gBACpB,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC;gBAC1B,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;oBACvB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CACrB,CACF,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,MAAM,IAAI,GAA4B;YACpC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC;QACF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC7C,QAAQ,GAAG,KAAK,CAAC;gBACjB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC/C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,GAA4B,QAAQ;YAC5C,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;YAC7G,CAAC,CAAC,SAAS,CAAC;QACd;;;;WAIG;QACH,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU;gBAAE,SAAS;YACvD,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CACrC,IAAI;gBACF,CAAC,CAAC;oBACE,GAAG,IAAI;oBACP,IAAI,EAAE;wBACJ,GAAG,IAAI,CAAC,IAAI;wBACZ,CAAC,QAAQ,CAAC,GAAG,CAAC,EACZ,MAAM,CAAC,IAAI,KAAK,MAAM;4BACpB,CAAC,CAAC,MAAM,KAAK,KAAK;4BAClB,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;gCACvB,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gCACjE,CAAC,CAAC,MAAM;qBACf;iBACF;gBACH,CAAC,CAAC,SAAS,CACd,CACF,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACjF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,MAAM,GAAG,CAAC,GAAW,EAA2B,EAAE;gBACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrC,IAAI,CAAC,MAAM;oBAAE,OAAO,SAAS,CAAC;gBAC9B,OAAO;oBACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE;oBACxB,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,OAAO,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;iBAClJ,CAAC;YACJ,CAAC,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;IACzC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,UAAU;YAAE,SAAS;QAChG,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;QACvC,MAAM,GAAG,GAA4B,OAAO;YAC1C,CAAC,CAAC;gBACE,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;gBAC7D,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ;aAC7D;YACH,CAAC,CAAC,SAAS,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAe,EACf,GAAmB,EACnB,OAAsB;IAEtB,MAAM,MAAM,GAAc,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IACvH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACjE,MAAM,WAAW,GAAmB,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;IAC7H,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5H,CAAC;IACD,mFAAmF;IACnF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,IAAI,OAAgD,CAAC;IACrD,IAAI,OAAmC,CAAC;IAExC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC;QAC/B,gFAAgF;QAChF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1E,MAAM,SAAS,GAAG;gBAChB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;gBACrF,QAAQ,EAAE,KAAK;gBACf,EAAE;aACH,CAAC;YACF,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,MAAM,SAAS,GAA6B,EAAE,CAAC;YAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS;gBAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YAC9D,IAAI,OAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBAChE,OAAO,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gBAC7B,MAAM;YACR,CAAC;YACD,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;YAChC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;YAC1C,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpG,QAAQ,CAAC,IAAI,CACX,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;gBACvD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnF,CAAC,CACH,CAAC;QACJ,CAAC;QACD,IAAI,OAAO;YAAE,MAAM;QACnB;;;WAGG;QACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtG,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpJ,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACtG,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,MAAkC,CAAC;QACvC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAgB;YAC3B,IAAI,EAAE,KAAK;YACX,IAAI;YACJ,KAAK;YACL,KAAK;YACL,QAAQ;YACR,SAAS;YACT,SAAS;YACT,IAAI;YACJ,GAAG,CAAC,MAAM;gBACR,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChJ,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;QACjD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YACtC,MAAM;QACR,CAAC;IACH,CAAC;IACD,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAChH,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM;QACN,KAAK;QACL,OAAO;QACP,KAAK;QACL,IAAI;QACJ,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAsB,MAAoB;IACpE,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,MAAM,KAAK,GAAG;QACZ,SAAS,MAAM,CAAC,KAAK,CAAC,SAAS,YAAY,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;QAC7J,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,UAAU,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,oBAAoB;QACxH,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE;QACvG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE;KACxF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7F,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,OAAO,CAAsB,KAAe,EAAE,MAAoB,EAAE,OAAa,MAAM,CAAC,IAAI;IAC1G,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * A MODEL'S ANSWER ABOUT A SPACE, CHECKED AGAINST THE SPACE.
3
+ *
4
+ * `validateProposals` checks that a model's calls name acts that exist and
5
+ * arguments that parse. That catches everything except the thing a model is
6
+ * actually likely to get wrong when you hand it photographs and ask where
7
+ * things are, which is WHERE THINGS ARE.
8
+ *
9
+ * A product asked one to place a property's areas on a plan. Its prompt said
10
+ * — and had said since the first version — that an area inside another must
11
+ * be drawn inside it and a thing must be placed inside the area it stands
12
+ * in. Nothing looked. The answer came back as seven full-width horizontal
13
+ * bands stacked down the page, every one of them lying across its
14
+ * neighbours, and the app accepted it line for line and drew it.
15
+ *
16
+ * A stated rule nobody enforces is worse than no rule: it tells the model it
17
+ * got away with something, and it tells the person the answer was checked.
18
+ *
19
+ * Bands-down-the-page is what this failure looks like nearly every time, and
20
+ * it has one cause: no view from above, so the shapes are being guessed from
21
+ * ground-level frames. The useful response is not to fix the coordinates but
22
+ * to hand the sentences back and ask again.
23
+ */
24
+ export interface SpacePoint {
25
+ readonly x: number;
26
+ readonly y: number;
27
+ }
28
+ export type Ring = readonly SpacePoint[];
29
+ /**
30
+ * Ray casting. Whether a point is inside a ring.
31
+ *
32
+ * A point exactly ON an edge is decided by which edge the ray happens to
33
+ * cross, so one side of a shape reads in and the other out. That is the
34
+ * standard behaviour of this algorithm and it is fine for what this is for —
35
+ * a model's coordinates are never exactly on a line — but it is not a thing
36
+ * to build on.
37
+ */
38
+ export declare function inside(point: SpacePoint, ring: Ring): boolean;
39
+ /** Whether every corner of one ring is inside another. */
40
+ export declare const within: (inner: Ring, outer: Ring) => boolean;
41
+ /**
42
+ * Whether two areas lie ACROSS each other, rather than merely touching.
43
+ *
44
+ * The test is mutual: each has a corner in the other. Two areas that share
45
+ * an edge, or whose corners graze, fail this and should — a property is a
46
+ * jigsaw and its pieces meet. What it catches is interpenetration, which is
47
+ * the thing that cannot be true of two pieces of ground.
48
+ */
49
+ export declare const across: (a: Ring, b: Ring) => boolean;
50
+ //# sourceMappingURL=space.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,IAAI,GAAG,SAAS,UAAU,EAAE,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAU7D;AAED,0DAA0D;AAC1D,eAAO,MAAM,MAAM,GAAI,OAAO,IAAI,EAAE,OAAO,IAAI,KAAG,OAAyD,CAAC;AAE5G;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,GAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAG,OACsC,CAAC"}
package/dist/space.js ADDED
@@ -0,0 +1,55 @@
1
+ /**
2
+ * A MODEL'S ANSWER ABOUT A SPACE, CHECKED AGAINST THE SPACE.
3
+ *
4
+ * `validateProposals` checks that a model's calls name acts that exist and
5
+ * arguments that parse. That catches everything except the thing a model is
6
+ * actually likely to get wrong when you hand it photographs and ask where
7
+ * things are, which is WHERE THINGS ARE.
8
+ *
9
+ * A product asked one to place a property's areas on a plan. Its prompt said
10
+ * — and had said since the first version — that an area inside another must
11
+ * be drawn inside it and a thing must be placed inside the area it stands
12
+ * in. Nothing looked. The answer came back as seven full-width horizontal
13
+ * bands stacked down the page, every one of them lying across its
14
+ * neighbours, and the app accepted it line for line and drew it.
15
+ *
16
+ * A stated rule nobody enforces is worse than no rule: it tells the model it
17
+ * got away with something, and it tells the person the answer was checked.
18
+ *
19
+ * Bands-down-the-page is what this failure looks like nearly every time, and
20
+ * it has one cause: no view from above, so the shapes are being guessed from
21
+ * ground-level frames. The useful response is not to fix the coordinates but
22
+ * to hand the sentences back and ask again.
23
+ */
24
+ /**
25
+ * Ray casting. Whether a point is inside a ring.
26
+ *
27
+ * A point exactly ON an edge is decided by which edge the ray happens to
28
+ * cross, so one side of a shape reads in and the other out. That is the
29
+ * standard behaviour of this algorithm and it is fine for what this is for —
30
+ * a model's coordinates are never exactly on a line — but it is not a thing
31
+ * to build on.
32
+ */
33
+ export function inside(point, ring) {
34
+ let within = false;
35
+ for (let i = 0, j = ring.length - 1; i < ring.length; j = i, i += 1) {
36
+ const a = ring[i];
37
+ const b = ring[j];
38
+ if (a.y > point.y !== b.y > point.y && point.x < ((b.x - a.x) * (point.y - a.y)) / (b.y - a.y) + a.x) {
39
+ within = !within;
40
+ }
41
+ }
42
+ return within;
43
+ }
44
+ /** Whether every corner of one ring is inside another. */
45
+ export const within = (inner, outer) => inner.every((corner) => inside(corner, outer));
46
+ /**
47
+ * Whether two areas lie ACROSS each other, rather than merely touching.
48
+ *
49
+ * The test is mutual: each has a corner in the other. Two areas that share
50
+ * an edge, or whose corners graze, fail this and should — a property is a
51
+ * jigsaw and its pieces meet. What it catches is interpenetration, which is
52
+ * the thing that cannot be true of two pieces of ground.
53
+ */
54
+ export const across = (a, b) => a.some((corner) => inside(corner, b)) && b.some((corner) => inside(corner, a));
55
+ //# sourceMappingURL=space.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space.js","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,KAAiB,EAAE,IAAU;IAClD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,MAAM,GAAG,CAAC,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAW,EAAE,KAAW,EAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAE5G;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAO,EAAE,CAAO,EAAW,EAAE,CAClD,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC"}