@graview/studio 0.0.0-stage → 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 (67) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +31 -2
  3. package/dist/agent-panel.d.ts +11 -0
  4. package/dist/agent-panel.d.ts.map +1 -0
  5. package/dist/agent-panel.js +334 -0
  6. package/dist/agent-panel.js.map +1 -0
  7. package/dist/agent.d.ts +24 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +371 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/changes.d.ts +49 -0
  12. package/dist/changes.d.ts.map +1 -0
  13. package/dist/changes.js +217 -0
  14. package/dist/changes.js.map +1 -0
  15. package/dist/from-declaration.d.ts +13 -0
  16. package/dist/from-declaration.d.ts.map +1 -0
  17. package/dist/from-declaration.js +204 -0
  18. package/dist/from-declaration.js.map +1 -0
  19. package/dist/in-place.d.ts +27 -0
  20. package/dist/in-place.d.ts.map +1 -0
  21. package/dist/in-place.js +151 -0
  22. package/dist/in-place.js.map +1 -0
  23. package/dist/index.d.ts +24 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +15 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lens.d.ts +9 -0
  28. package/dist/lens.d.ts.map +1 -0
  29. package/dist/lens.js +40 -0
  30. package/dist/lens.js.map +1 -0
  31. package/dist/meta.d.ts +2648 -0
  32. package/dist/meta.d.ts.map +1 -0
  33. package/dist/meta.js +553 -0
  34. package/dist/meta.js.map +1 -0
  35. package/dist/migration.d.ts +15 -0
  36. package/dist/migration.d.ts.map +1 -0
  37. package/dist/migration.js +82 -0
  38. package/dist/migration.js.map +1 -0
  39. package/dist/place.d.ts +61 -0
  40. package/dist/place.d.ts.map +1 -0
  41. package/dist/place.js +328 -0
  42. package/dist/place.js.map +1 -0
  43. package/dist/rewrite.d.ts +28 -0
  44. package/dist/rewrite.d.ts.map +1 -0
  45. package/dist/rewrite.js +52 -0
  46. package/dist/rewrite.js.map +1 -0
  47. package/dist/source.d.ts +69 -0
  48. package/dist/source.d.ts.map +1 -0
  49. package/dist/source.js +465 -0
  50. package/dist/source.js.map +1 -0
  51. package/dist/studio.d.ts +64 -0
  52. package/dist/studio.d.ts.map +1 -0
  53. package/dist/studio.js +96 -0
  54. package/dist/studio.js.map +1 -0
  55. package/dist/to-declaration.d.ts +24 -0
  56. package/dist/to-declaration.d.ts.map +1 -0
  57. package/dist/to-declaration.js +439 -0
  58. package/dist/to-declaration.js.map +1 -0
  59. package/dist/write-in-place.d.ts +27 -0
  60. package/dist/write-in-place.d.ts.map +1 -0
  61. package/dist/write-in-place.js +61 -0
  62. package/dist/write-in-place.js.map +1 -0
  63. package/dist/zod-source.d.ts +7 -0
  64. package/dist/zod-source.d.ts.map +1 -0
  65. package/dist/zod-source.js +124 -0
  66. package/dist/zod-source.js.map +1 -0
  67. package/package.json +58 -3
package/dist/agent.js ADDED
@@ -0,0 +1,371 @@
1
+ import { drawFigure, graphResponder, nearestFigure, validateProposals, } from "@graview/tools";
2
+ const squeeze = (text) => text.toLowerCase().replace(/[^a-z0-9]+/g, "");
3
+ /** Singular and plural of a word, squeezed, so "tasks" finds the kind "task". */
4
+ const forms = (word) => {
5
+ const one = squeeze(word);
6
+ const out = [one, `${one}s`, `${one}es`];
7
+ if (one.endsWith("ies"))
8
+ out.push(`${one.slice(0, -3)}y`);
9
+ if (one.endsWith("s"))
10
+ out.push(one.slice(0, -1));
11
+ return out;
12
+ };
13
+ /**
14
+ * THE TYPE A NAME IMPLIES, and nothing cleverer.
15
+ *
16
+ * "a due date" is a date and "how many" is a number, in every domain that
17
+ * has ever existed. Where the name says nothing, the answer is a string —
18
+ * never a guess dressed up as a decision, because the person is about to
19
+ * see the act before they keep it and can change it there.
20
+ */
21
+ export function typeFromName(name) {
22
+ const said = name.toLowerCase();
23
+ if (/\b(date|due|deadline|when|day|birthday|expires?|starts?|ends?)\b/.test(said))
24
+ return "date";
25
+ if (/\b(count|number|quantity|amount|size|age|price|cost|hours?|minutes?|score|rank)\b/.test(said))
26
+ return "number";
27
+ if (/^(is|has|was|can|should)\b|\b(done|complete|completed|active|archived|urgent|flag)\b/.test(said))
28
+ return "boolean";
29
+ if (/\b(notes?|note|description|comment|comments|body|summary|detail|details)\b/.test(said))
30
+ return "text";
31
+ return "string";
32
+ }
33
+ /** The graph-native studio conversation: the declaration, in its own words. */
34
+ export function studioResponder(options = {}) {
35
+ const floor = graphResponder();
36
+ return async (store, text, context) => {
37
+ const asked = text.toLowerCase();
38
+ const said = squeeze(text);
39
+ /*
40
+ * A QUESTION IS NEVER A CHANGE — the same rule the graph responder
41
+ * keeps. "what roles are there?" must not propose adding one.
42
+ */
43
+ const question = /\?\s*$/.test(text) ||
44
+ /^\s*(what|who|whom|whose|which|when|where|why|how|is|are|was|were|does|do|did|can|could|should|would|will|has|have)\b/.test(asked);
45
+ /*
46
+ * A SENTENCE THAT OPENS WITH AN INSTRUCTION IS NOT A QUESTION.
47
+ *
48
+ * The branches below answer questions about the declaration, and they
49
+ * recognised them by the words they contained rather than by what the
50
+ * sentence was doing. "Add a Meal kind, with the name of the food and
51
+ * how many people it feeds" contains "kind" and "how many", so it was
52
+ * answered with an inventory of the kinds — and answered as a FACT,
53
+ * which takes the turn away from the model entirely. The one sentence
54
+ * most needing a model's help was the one guaranteed not to reach it.
55
+ */
56
+ const imperative = /^\s*(add|give|put|attach|link|connect|tie|relate|make|create|draw|declare|rename|remove|delete|set|call)\b/.test(asked);
57
+ /**
58
+ * A FACT the declaration holds: what kinds there are, what an act
59
+ * writes, who may take it. No model may replace one of these.
60
+ */
61
+ const grounded = (say, proposals = []) => ({
62
+ say,
63
+ proposals: validateProposals(store, proposals),
64
+ grounded: true,
65
+ });
66
+ /**
67
+ * A READING of what somebody wants changed — right often enough to be
68
+ * the floor, and never so right that a model should be kept out of it.
69
+ * Where a model is on the ladder this goes up as a starting point; where
70
+ * none is, it is the answer.
71
+ */
72
+ const reading = (say, proposals = []) => ({
73
+ say,
74
+ proposals: validateProposals(store, proposals),
75
+ });
76
+ /**
77
+ * A sentence this rung could not read. Honest, and a dead end on its
78
+ * own — so it is marked, and a surface with no model chosen can offer
79
+ * the one that reads any phrasing.
80
+ */
81
+ const unsure = (say) => ({ say, proposals: [], unsure: true });
82
+ const all = (kind) => [...store.graph.allNodes()].filter((node) => node.kind === kind);
83
+ const label = (node) => String(node?.["label"] ?? node?.id ?? "");
84
+ const out = (id, kind) => store.graph.out(id, kind);
85
+ const into = (id, kind) => store.graph.in(id, kind);
86
+ const list = (words) => words.length <= 1 ? (words[0] ?? "nothing") : `${words.slice(0, -1).join(", ")} and ${words[words.length - 1]}`;
87
+ /**
88
+ * The node of a meta-kind whose name (or plural) the message says,
89
+ * longest name first — and, where it matters, only within the PART of
90
+ * the sentence that names it.
91
+ *
92
+ * "every shift needs a volunteer" names two kinds and means a rule over
93
+ * the first: searching the whole sentence picked "volunteer" because it
94
+ * is the longer word, which is the seat confidently declaring a rule
95
+ * over the wrong thing. So each branch says where to look.
96
+ */
97
+ const named = (kind, within = said) => {
98
+ const hay = squeeze(within);
99
+ /*
100
+ * THE EARLIEST NAME WINS, AND ITS OWN NAME BEATS ITS PLURAL.
101
+ *
102
+ * Longest-match alone read "Add details to Meal. The name of the food
103
+ * and the number of people it can feed" as a field on USER — because
104
+ * the user kind's plural is "People", "people" is inside "number of
105
+ * people", and six letters beat four. The kind this sentence is about
106
+ * is the one it says FIRST after pointing at it; a plural buried in a
107
+ * description of something else is not a subject.
108
+ */
109
+ const hits = all(kind).flatMap((node) => {
110
+ const said = [
111
+ { text: label(node), rank: 0 },
112
+ { text: String(node["title"] ?? ""), rank: 0 },
113
+ { text: String(node["plural"] ?? ""), rank: 1 },
114
+ ].filter((one) => one.text.length > 0);
115
+ const found = said
116
+ .flatMap((one) => forms(one.text).map((form) => ({ form, rank: one.rank })))
117
+ .filter(({ form }) => form.length >= 3 && hay.includes(form))
118
+ .map(({ form, rank }) => ({ node, at: hay.indexOf(form), length: form.length, rank }))
119
+ .sort((a, b) => a.at - b.at || a.rank - b.rank || b.length - a.length);
120
+ return found.length > 0 ? [found[0]] : [];
121
+ });
122
+ return hits.sort((a, b) => a.at - b.at || a.rank - b.rank || b.length - a.length)[0]?.node;
123
+ };
124
+ /** The clause a phrase points at, cut at the first sentence end. */
125
+ const clause = (phrase) => (phrase ?? "").split(/[.;\n]/)[0] ?? "";
126
+ // ------------------------------------------------------------ figures
127
+ /*
128
+ * The drawing gap, recorded honestly when figures shipped: `drawFigure`
129
+ * carries the house style and judges its own answer with the checker's
130
+ * own function, and it was reachable from code and from the CLI and
131
+ * from nowhere a person sits. This is where a person sits.
132
+ */
133
+ const aboutFigures = /\b(figure|figures|drawing|drawn|draw|icon|picture)\b/.test(asked);
134
+ if (aboutFigures && !imperative && /\b(no|without|missing|which|what|any|lack|lacks|lacking)\b/.test(asked) && !/\bfor\b/.test(asked)) {
135
+ const kinds = all("kind");
136
+ const undrawn = kinds.filter((kind) => typeof kind["figure"] !== "string" || kind["figure"] === "");
137
+ return grounded(undrawn.length === 0
138
+ ? `Every kind is drawn — ${list(kinds.map((kind) => label(kind)))}.`
139
+ : `${undrawn.length} of ${kinds.length} ${kinds.length === 1 ? "kind has" : "kinds have"} no figure: ${list(undrawn.map((kind) => label(kind)))}. Ask me to draw one by name.`);
140
+ }
141
+ if (aboutFigures) {
142
+ const kind = named("kind");
143
+ if (!kind) {
144
+ return unsure(`Say which kind to draw — ${list(all("kind").map((one) => label(one)))} — and I will draw it in the house style.`);
145
+ }
146
+ const drawn = options.complete
147
+ ? await drawFigure(label(kind), typeof kind["description"] === "string" ? kind["description"] : undefined, options.complete)
148
+ : { kind: label(kind), figure: nearestFigure(label(kind)), from: "shipped", refused: ["nothing is behind the seat to draw with"] };
149
+ const propose = [
150
+ {
151
+ mutation: "set-figure",
152
+ args: { id: kind.id, figure: drawn.figure },
153
+ why: drawn.from === "model" ? "drawn in the house style and passed the checker's own figure test" : "the nearest shipped figure",
154
+ },
155
+ ];
156
+ return reading(drawn.from === "model"
157
+ ? `Drawn for ${label(kind)}, in the house style — the checker's own figure test passed it. Keep it or ask again for another.`
158
+ : `I did not draw it: ${list(drawn.refused ?? [])}. The nearest shipped figure is "${drawn.figure}", which is an honest placeholder rather than a drawing of ${label(kind)}.`, propose);
159
+ }
160
+ // ----------------------------------------------------- who may what
161
+ if (!imperative && /\bwho\b/.test(asked) && /\b(may|can|allowed|permitted|able)\b/.test(asked)) {
162
+ const act = named("act");
163
+ const grants = all("grant").filter((g) => (act ? out(g.id, "may").some((one) => one.id === act.id) || g["allActs"] === true : true));
164
+ if (grants.length === 0) {
165
+ return grounded(act
166
+ ? `No grant names ${label(act)}, so only a seat that may do anything can take it.`
167
+ : `This declaration grants nothing — every act is open to whoever is here.`);
168
+ }
169
+ const lines = grants.map((g) => {
170
+ const roles = g["everyone"] === true ? "everyone" : list(out(g.id, "lets").map((role) => label(role)));
171
+ const acts = g["allActs"] === true ? "every act" : list(out(g.id, "may").map((one) => String(one["title"] ?? label(one))));
172
+ const kinds = g["allKinds"] === true ? "" : ` on ${list(out(g.id, "allows-on").map((one) => label(one)))}`;
173
+ return `${roles} may ${acts}${kinds}${g["self"] === true ? ", on their own record only" : ""}`;
174
+ });
175
+ return grounded(`${lines.join("; ")}.`);
176
+ }
177
+ // ------------------------------------------- what an act does, exactly
178
+ const act = named("act");
179
+ if (act && !imperative && /\b(write|writes|do|does|change|changes|act|touch)\b/.test(asked)) {
180
+ const writes = Array.isArray(act["writes"]) ? act["writes"].map(String) : [];
181
+ const parts = [
182
+ writes.length > 0 ? `writes ${list(writes)}` : null,
183
+ out(act.id, "creates").length > 0 ? `brings ${list(out(act.id, "creates").map((one) => label(one)))} into being` : null,
184
+ out(act.id, "connects").length > 0 ? `makes the tie ${list(out(act.id, "connects").map((one) => label(one)))}` : null,
185
+ out(act.id, "severs").length > 0 ? `breaks the tie ${list(out(act.id, "severs").map((one) => label(one)))}` : null,
186
+ ].filter((part) => part !== null);
187
+ const on = out(act.id, "on").map((one) => label(one));
188
+ const repaired = into(act.id, "repairs").map((one) => label(one));
189
+ return grounded(`${String(act["title"] ?? label(act))} ${parts.length > 0 ? parts.join(", ") : "writes nothing the declaration names"}${on.length > 0 ? `, on ${list(on)}` : ""}.${act["destructive"] === true ? " It is destructive." : ""}${repaired.length > 0 ? ` It repairs ${list(repaired)}.` : ""}`);
190
+ }
191
+ // --------------------------------------------- what a rule judges
192
+ const rule = named("rule");
193
+ if (rule && !imperative && /\b(judge|judges|rule|hold|holds|check|checks|mean|means)\b/.test(asked)) {
194
+ const over = out(rule.id, "over").map((one) => label(one));
195
+ const repairs = out(rule.id, "repairs").map((one) => String(one["title"] ?? label(one)));
196
+ return grounded(`${String(rule["title"] ?? label(rule))} — ${String(rule["description"] ?? "no description")} It judges ${rule["wholeGraph"] === true ? "the whole graph" : over.length > 0 ? list(over) : "nothing"}${rule["judgesPast"] === true ? ", including the past" : ""}. ${repairs.length > 0 ? `Put right by ${list(repairs)}.` : "It names no repair, so the interface can only complain about it."}`);
197
+ }
198
+ // ------------------------------------------------------ what is here
199
+ if (!imperative && /\b(kind|kinds|shape|declare|declares|declared|model|models|track)\b/.test(asked) && /\b(what|which|list|show|how many|any)\b/.test(asked)) {
200
+ const kinds = all("kind");
201
+ const lines = kinds.map((kind) => {
202
+ const fields = into(kind.id, "of").length;
203
+ const edges = into(kind.id, "from-kind").length;
204
+ return `${label(kind)} (${fields} field${fields === 1 ? "" : "s"}, ${edges} relation${edges === 1 ? "" : "s"})`;
205
+ });
206
+ return grounded(`${kinds.length} kind${kinds.length === 1 ? "" : "s"}: ${list(lines)}. There ${all("act").length === 1 ? "is" : "are"} ${all("act").length} act${all("act").length === 1 ? "" : "s"} and ${all("rule").length} rule${all("rule").length === 1 ? "" : "s"}.`);
207
+ }
208
+ // --------------------------------- a role or a kind, named in words
209
+ /*
210
+ * "add a new Role for Participant" — and it must be THE FLOOR that
211
+ * answers it, not a model.
212
+ *
213
+ * The graph responder only recognises an act when the message contains
214
+ * its title exactly, so "add a new role" missed "Add a role", the floor
215
+ * returned an ungrounded answer, and the on-device model got the turn.
216
+ * It proposed `add-role` with no label at all, which the store then
217
+ * refused for the arguments — a dead end with the person's own sentence
218
+ * on one side of it and a zod error on the other.
219
+ */
220
+ const naming = /^\s*(?:add|create|make|declare)\b/.test(asked) || /\bnew\b/.test(asked);
221
+ if (naming && !question) {
222
+ const what = /\brole\b/.test(asked) ? "role" : /\bkind\b/.test(asked) ? "kind" : null;
223
+ if (what) {
224
+ /*
225
+ * What it is to be CALLED, from the ways people actually say it:
226
+ * in quotes, after "called"/"named"/"for", or in front of the word
227
+ * itself ("add a participant role"). Never guessed — with no name
228
+ * the seat asks for one rather than proposing an act that cannot
229
+ * apply.
230
+ */
231
+ const given = text.match(/["'“”']([^"'“”']+)["'“”']/)?.[1] ??
232
+ new RegExp(`\\b(?:called|named|for)\\s+(?:an?\\s+|the\\s+)?([A-Za-z][A-Za-z0-9 _-]*?)\\s*$`, "i").exec(text)?.[1] ??
233
+ new RegExp(`\\b([A-Za-z][\\w-]*)\\s+${what}s?\\b`, "i").exec(text)?.[1];
234
+ const called = given?.trim().replace(/^(a|an|the|new)\s+/i, "").trim();
235
+ if (!called || /^(new|a|an|the)$/i.test(called)) {
236
+ return unsure(`What should the ${what} be called? Say it in quotes, or "add a ${what} called …", and I will propose it.`);
237
+ }
238
+ if (what === "role") {
239
+ const already = all("role").find((role) => squeeze(label(role)) === squeeze(called));
240
+ if (already)
241
+ return grounded(`There is already a role called ${label(already)}.`);
242
+ return reading(`A new role, "${called}". It is a seat somebody can hold — grants are what let it do anything, so it can take no act until one says so.`, [{ mutation: "add-role", args: { label: called }, why: `you asked for a ${called} role` }]);
243
+ }
244
+ const already = all("kind").find((kind) => squeeze(label(kind)) === squeeze(called));
245
+ if (already)
246
+ return grounded(`There is already a kind called ${label(already)}.`);
247
+ return reading(`A new kind, "${called}", with a name to be called by. Check it below before you keep it.`, [{ mutation: "add-kind", args: { label: called }, why: `you asked for a ${called} kind` }]);
248
+ }
249
+ }
250
+ // ------------------------------------------------- a tie, said in words
251
+ /*
252
+ * "Attach Meals to Shifts" — which the floor did not know at all, so the
253
+ * turn fell through to a model, which proposed `add-edge` with no kind
254
+ * and no label and earned a validation refusal in zod's own words.
255
+ *
256
+ * Which end declares it is a real decision and the seat must not hide
257
+ * that it made one: a shift HAS meals, so the tie is declared on the
258
+ * shift and points at the meal. The reply says so, and the proposal is
259
+ * editable before it is kept.
260
+ */
261
+ const tying = /\b(attach|link|connect|relate|tie)\b.*\b(to|onto|with)\b/.test(asked) ||
262
+ /\b(has|have|holds?|carr(?:y|ies))\b\s+(?:many\s+|some\s+|a\s+|an\s+)?/.test(asked);
263
+ if (tying && !question) {
264
+ const joined = /\b(?:attach|link|connect|relate|tie)\b\s+(.+?)\s+\b(?:to|onto|with)\b\s*(.*)$/i.exec(text);
265
+ const owning = /^\s*(?:a|an|each|every|the)?\s*(.+?)\s+\b(?:has|have|holds|hold|carries|carry)\b\s+(?:many\s+|some\s+|a\s+|an\s+)?(.*)$/i.exec(text);
266
+ // "attach A to B" hangs the tie on B; "a B has A" already says B first.
267
+ const from = joined ? named("kind", clause(joined[2])) : owning ? named("kind", clause(owning[1])) : undefined;
268
+ const to = joined ? named("kind", clause(joined[1])) : owning ? named("kind", clause(owning[2])) : undefined;
269
+ if (from && to) {
270
+ const plural = String(to["plural"] ?? "") || `${label(to)}s`;
271
+ return reading(`A tie declared on ${label(from)}, pointing at ${label(to)} — a ${label(from)} has ${plural.toLowerCase()}. Change any of it below before you keep it.`, [
272
+ {
273
+ mutation: "add-edge",
274
+ args: {
275
+ kind: from.id,
276
+ to: to.id,
277
+ label: plural.toLowerCase(),
278
+ description: `its ${plural.toLowerCase()}`,
279
+ inverse: `the ${label(from)} it is on`,
280
+ cardinality: "many",
281
+ },
282
+ why: `you asked to tie ${label(to)} to ${label(from)}`,
283
+ },
284
+ ]);
285
+ }
286
+ if (joined || owning) {
287
+ return unsure(`Say both kinds by name and I will propose the tie — there ${all("kind").length === 1 ? "is" : "are"} ${list(all("kind").map((one) => label(one)))}.`);
288
+ }
289
+ }
290
+ // ----------------------------------------------- a field, said in words
291
+ /*
292
+ * "add a due date to tasks" — the shape a person actually says. The
293
+ * kind is named at the end, the field in the middle, and the type is
294
+ * whatever the name implies. Optional unless the person says otherwise:
295
+ * a required field added to a kind that already has records is a
296
+ * migration nobody asked for.
297
+ */
298
+ const adding = /^\s*(add|give|put)\b/.test(asked) && /\b(to|on|for)\b/.test(asked);
299
+ if (adding) {
300
+ const between = /\b(?:add|give|put)\b\s+(?:an?\s+|the\s+)?(.+?)\s+\b(?:to|on|for)\b\s*(.*)$/i.exec(text);
301
+ const field = between?.[1]?.trim();
302
+ /*
303
+ * The kind is what comes AFTER "to", read no further than the end of
304
+ * that sentence: everything after the full stop is a description of
305
+ * the FIELD, and letting it name the kind put "details" on the wrong
306
+ * one entirely.
307
+ */
308
+ const kind = named("kind", clause(between?.[2]));
309
+ if (!kind && field && between?.[2]) {
310
+ /*
311
+ * AND WHEN THE KIND IT POINTS AT IS NOT ONE, IT SAYS SO.
312
+ *
313
+ * Reaching past the clause for any kind name anywhere in the
314
+ * sentence is how "add details to Meal. The name of the food and
315
+ * the number of people it can feed" put a field on USER: no kind
316
+ * called Meal existed, and "people" is the user kind's plural.
317
+ * Guessing a subject from a description of something else is worse
318
+ * than asking.
319
+ */
320
+ return unsure(`There is no kind called "${clause(between[2]).trim()}". There ${all("kind").length === 1 ? "is" : "are"} ${list(all("kind").map((one) => label(one)))} — or ask me to add it first.`);
321
+ }
322
+ if (kind && field && !/\b(edge|relation|tie|act|rule|role)\b/i.test(field)) {
323
+ const type = typeFromName(field);
324
+ const required = /\brequired\b|\bmust\b|\balways\b/.test(asked);
325
+ return reading(`"${field}" reads as ${type === "text" ? "a long text" : `a ${type}`}, on ${label(kind)}${required ? ", required" : ", optional so the records that already exist stay valid"}. Check it below before you keep it.`, [
326
+ {
327
+ mutation: "add-field",
328
+ args: { kind: kind.id, label: field, type, required },
329
+ why: `you asked for "${field}" on ${label(kind)}`,
330
+ },
331
+ ]);
332
+ }
333
+ }
334
+ // ------------------------------------------------ a rule, said in words
335
+ const needs = /\b(every|each|all)\b.*\b(needs?|must|should|requires?|has to have)\b/.test(asked);
336
+ if (needs) {
337
+ const subject = /\b(?:every|each|all)\b\s+(.+?)\s+\b(?:needs?|must|should|requires?|has to have)\b/i.exec(text);
338
+ const kind = named("kind", subject?.[1] ?? said) ?? named("kind");
339
+ if (kind) {
340
+ const name = text
341
+ .trim()
342
+ .replace(/[.?!]+$/, "")
343
+ .toLowerCase()
344
+ .replace(/[^a-z0-9]+/g, "-")
345
+ .replace(/^-+|-+$/g, "")
346
+ .slice(0, 60);
347
+ return reading(`A rule over ${label(kind)}. The judgement itself is code — the studio declares the rule and names where its body goes; the file it writes says so where the checkout must fill it in.`, [
348
+ {
349
+ mutation: "add-rule",
350
+ args: { kind: kind.id, label: name, description: text.trim() },
351
+ why: `you said every ${label(kind)} needs it`,
352
+ },
353
+ ]);
354
+ }
355
+ }
356
+ // ------------------------------------ everything else the graph can say
357
+ /*
358
+ * AND WHEN NOTHING HERE COULD READ IT, that is worth saying rather than
359
+ * answering a different question. The graph responder's last resort is
360
+ * a description of the shape — true, and not what was asked — so an
361
+ * answer with nothing under it from a sentence that was plainly asking
362
+ * for a CHANGE is marked as unread, and a surface with no model chosen
363
+ * can offer the rung that reads any phrasing.
364
+ */
365
+ const fallback = await floor(store, text, context);
366
+ return fallback.grounded || fallback.proposals.length > 0 || question
367
+ ? fallback
368
+ : { ...fallback, unsure: true };
369
+ };
370
+ }
371
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { AnySchema, DeclarationChange, GraviewApp, StudioDoorSource } from "@graview/core";
2
+ import type { Reading } from "./to-declaration.js";
3
+ /**
4
+ * WHAT CHANGED, AS THE SOURCE MUST RECEIVE IT.
5
+ *
6
+ * The studio holds the declaration as a graph and knows the graph it opened
7
+ * on, so the difference between the two IS the change a person made — and
8
+ * saying it as changes rather than as files is what lets the dev server make
9
+ * it inside the checkout's own `defineNode` calls without flattening them.
10
+ *
11
+ * Things are matched by what they mean, not by node id: a field is its kind
12
+ * and its name, an edge its name, so an edge removed from the plot and
13
+ * declared again on the planting is one relation MOVED — and moves with its
14
+ * comments — rather than one deleted and a stranger added.
15
+ *
16
+ * An act or rule whose declaration changed is code the studio cannot write
17
+ * by itself: it is named in `rewrite`, to be rewritten by a person or a seat
18
+ * before anything is written. What the source cannot receive this way at
19
+ * all yet — a role, a grant, a renamed kind — is said, one sentence each,
20
+ * in `unwritten`, and nothing is written while that list has something in
21
+ * it: half a change applied is a checkout that disagrees with itself.
22
+ */
23
+ export interface SourceChanges {
24
+ readonly changes: readonly DeclarationChange[];
25
+ readonly rewrite: readonly Rewrite[];
26
+ readonly unwritten: readonly string[];
27
+ }
28
+ /** An act or rule that must be written afresh before the change can be, and why. */
29
+ export interface Rewrite {
30
+ readonly sort: "act" | "rule";
31
+ readonly name: string;
32
+ readonly why: string;
33
+ }
34
+ export declare function sourceChanges(before: Reading, after: Reading, base?: GraviewApp<AnySchema>): SourceChanges;
35
+ /**
36
+ * THE CODE A CHANGE LEAVES SAYING SOMETHING UNTRUE.
37
+ *
38
+ * The declaration moved `tended-by` from the plot to the planting; the act
39
+ * that ties a gardener to a plot still adds a `tended-by` edge FROM a plot,
40
+ * and the rule that every plot has a caretaker still reads one. Both
41
+ * compile. Both pass the checker, which judges declarations, not bodies.
42
+ * Both are wrong the moment the app runs.
43
+ *
44
+ * So every act and rule the checkout wrote is read for the names the change
45
+ * moved or took away, and each one that mentions them is named for
46
+ * rewriting — by a person, a seat, or a person saying it still holds.
47
+ */
48
+ export declare function codeTouched(changes: readonly DeclarationChange[], code: StudioDoorSource): readonly Rewrite[];
49
+ //# sourceMappingURL=changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGhG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,oFAAoF;AACpF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,aAAa,CAmJ1G;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,OAAO,EAAE,CA+B7G"}