@llm4ts/flow 2.37.0 → 2.39.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 (56) hide show
  1. package/dist/Domains.d.ts +1 -1
  2. package/dist/Domains.d.ts.map +1 -1
  3. package/dist/Domains.js +7 -3
  4. package/dist/Domains.js.map +1 -1
  5. package/dist/Flow.d.ts +3 -1
  6. package/dist/Flow.d.ts.map +1 -1
  7. package/dist/Flow.js +1 -0
  8. package/dist/Flow.js.map +1 -1
  9. package/dist/GraphCache.d.ts +70 -0
  10. package/dist/GraphCache.d.ts.map +1 -0
  11. package/dist/GraphCache.js +111 -0
  12. package/dist/GraphCache.js.map +1 -0
  13. package/dist/GraphQuery.d.ts +67 -0
  14. package/dist/GraphQuery.d.ts.map +1 -0
  15. package/dist/GraphQuery.js +212 -0
  16. package/dist/GraphQuery.js.map +1 -0
  17. package/dist/GraphRender.d.ts +26 -0
  18. package/dist/GraphRender.d.ts.map +1 -0
  19. package/dist/GraphRender.js +154 -0
  20. package/dist/GraphRender.js.map +1 -0
  21. package/dist/GraphRules.d.ts +86 -0
  22. package/dist/GraphRules.d.ts.map +1 -0
  23. package/dist/GraphRules.js +246 -0
  24. package/dist/GraphRules.js.map +1 -0
  25. package/dist/GraphWorklist.d.ts +64 -0
  26. package/dist/GraphWorklist.d.ts.map +1 -0
  27. package/dist/GraphWorklist.js +283 -0
  28. package/dist/GraphWorklist.js.map +1 -0
  29. package/dist/Pack.d.ts +7 -0
  30. package/dist/Pack.d.ts.map +1 -1
  31. package/dist/Pack.js +9 -5
  32. package/dist/Pack.js.map +1 -1
  33. package/dist/Review.d.ts +12 -0
  34. package/dist/Review.d.ts.map +1 -1
  35. package/dist/Review.js +11 -1
  36. package/dist/Review.js.map +1 -1
  37. package/dist/Stories.d.ts +16 -0
  38. package/dist/Stories.d.ts.map +1 -1
  39. package/dist/Stories.js +42 -7
  40. package/dist/Stories.js.map +1 -1
  41. package/dist/Survey.d.ts +112 -3
  42. package/dist/Survey.d.ts.map +1 -1
  43. package/dist/Survey.js +644 -41
  44. package/dist/Survey.js.map +1 -1
  45. package/package.json +7 -2
  46. package/src/Domains.ts +7 -4
  47. package/src/Flow.ts +5 -1
  48. package/src/GraphCache.ts +191 -0
  49. package/src/GraphQuery.ts +315 -0
  50. package/src/GraphRender.ts +208 -0
  51. package/src/GraphRules.ts +293 -0
  52. package/src/GraphWorklist.ts +405 -0
  53. package/src/Pack.ts +15 -5
  54. package/src/Review.ts +25 -1
  55. package/src/Stories.ts +66 -12
  56. package/src/Survey.ts +846 -52
@@ -0,0 +1,246 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { PlanParseError } from "./FlowError.js";
4
+ import { fingerprintOf } from "./ReviewCache.js";
5
+ /**
6
+ * The pack's graph vocabulary (ADR 0030). A `## Node:` rule names a sub-file
7
+ * node kind, an `## Edge:` rule a captured link, a `## Join:` rule a link by
8
+ * attribute equality across files, a `## Probe:` a flow that must be
9
+ * connected end to end. `## Survey:` rules are folded in as file-to-file
10
+ * Edge rules so a pre-0030 pack produces the same graph.
11
+ */
12
+ export class NodeRule extends Schema.Class("NodeRule")({
13
+ kind: Schema.String,
14
+ files: Schema.String,
15
+ pattern: Schema.String,
16
+ descriptor: Schema.Boolean,
17
+ anchor: Schema.optionalKey(Schema.String),
18
+ /** `attr → named group` copies beyond the default "every group but name". */
19
+ attrs: Schema.Record(Schema.String, Schema.String)
20
+ }) {
21
+ }
22
+ export class EdgeRule extends Schema.Class("EdgeRule")({
23
+ kind: Schema.String,
24
+ files: Schema.String,
25
+ pattern: Schema.String,
26
+ fromKind: Schema.String,
27
+ toKind: Schema.String,
28
+ /** A folded `## Survey:` rule: the target is the first positional group (or the whole match), as before ADR 0030. */
29
+ positional: Schema.optionalKey(Schema.Boolean)
30
+ }) {
31
+ }
32
+ export const JoinMatchMode = Schema.Literals(["exact", "url"]);
33
+ export const JoinScope = Schema.Literals(["estate", "app", "file"]);
34
+ export class JoinRule extends Schema.Class("JoinRule")({
35
+ kind: Schema.String,
36
+ fromKind: Schema.String,
37
+ fromAttr: Schema.String,
38
+ toKind: Schema.String,
39
+ toAttr: Schema.String,
40
+ match: JoinMatchMode,
41
+ scope: JoinScope
42
+ }) {
43
+ }
44
+ export class ProbeRule extends Schema.Class("ProbeRule")({
45
+ name: Schema.String,
46
+ from: Schema.String,
47
+ to: Schema.String
48
+ }) {
49
+ }
50
+ export const emptyGraphRules = {
51
+ nodes: [],
52
+ edges: [],
53
+ joins: [],
54
+ probes: [],
55
+ worklistMax: 200,
56
+ batchSize: 20
57
+ };
58
+ /**
59
+ * `## Survey:` is an Edge rule between files whose first positional capture
60
+ * (or the whole match) is the target. The pattern is kept verbatim: rewriting
61
+ * its first `(` would break `(?:…)`, lookbehinds and escaped parens.
62
+ */
63
+ export const edgeRuleOfSurvey = (rule) => EdgeRule.make({
64
+ kind: rule.name,
65
+ files: rule.files,
66
+ pattern: rule.unit,
67
+ fromKind: "file",
68
+ toKind: "file",
69
+ positional: true
70
+ });
71
+ const fail = (message) => Effect.fail(PlanParseError.make({ message }));
72
+ const isValidRegExp = (source) => {
73
+ try {
74
+ new RegExp(source, "gm");
75
+ return true;
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ };
81
+ const fieldsOf = (lines) => Object.fromEntries(lines.flatMap((line) => {
82
+ const trimmed = line.replace(/^- /, "");
83
+ const index = trimmed.indexOf(":");
84
+ return index < 0 ? [] : [[trimmed.slice(0, index).trim(), trimmed.slice(index + 1).trim()]];
85
+ }));
86
+ const yes = (value) => value !== undefined && ["yes", "true", "on"].includes(value.trim().toLowerCase());
87
+ const attrCopies = (value) => Object.fromEntries((value ?? "")
88
+ .split(",")
89
+ .map((item) => item.trim())
90
+ .filter((item) => item.length > 0)
91
+ .flatMap((item) => {
92
+ const [attr, group] = item.split("=").map((part) => part.trim());
93
+ return attr !== undefined && group !== undefined && attr.length > 0 && group.length > 0
94
+ ? [[attr, group]]
95
+ : [];
96
+ }));
97
+ const kindAndAttr = (value) => {
98
+ const dot = (value ?? "").indexOf(".");
99
+ if (value === undefined || dot <= 0 || dot === value.length - 1) {
100
+ return undefined;
101
+ }
102
+ return [value.slice(0, dot).trim(), value.slice(dot + 1).trim()];
103
+ };
104
+ export const parseGraphRules = (sections, survey) => Effect.gen(function* () {
105
+ const nodes = [];
106
+ const edges = survey.map(edgeRuleOfSurvey);
107
+ const joins = [];
108
+ const probes = [];
109
+ let worklistMax = emptyGraphRules.worklistMax;
110
+ let batchSize = emptyGraphRules.batchSize;
111
+ for (const section of sections) {
112
+ const lines = section.split(/\r?\n/);
113
+ const heading = lines[0]?.trim() ?? "";
114
+ const fields = fieldsOf(lines.slice(1));
115
+ if (heading.startsWith("## Node: ")) {
116
+ const kind = heading.slice("## Node: ".length).trim();
117
+ if (fields.files === undefined || fields.pattern === undefined) {
118
+ return yield* fail(`'${heading}' needs 'files:' and 'pattern:'`);
119
+ }
120
+ if (!isValidRegExp(fields.pattern)) {
121
+ return yield* fail(`'${heading}' pattern is not a valid regex: ${fields.pattern}`);
122
+ }
123
+ if (!fields.pattern.includes("(?<name>")) {
124
+ return yield* fail(`'${heading}' pattern needs a (?<name>…) group`);
125
+ }
126
+ nodes.push(NodeRule.make({
127
+ kind,
128
+ files: fields.files,
129
+ pattern: fields.pattern,
130
+ descriptor: yes(fields.descriptor),
131
+ ...(fields.anchor === undefined ? {} : { anchor: fields.anchor }),
132
+ attrs: attrCopies(fields.attrs)
133
+ }));
134
+ }
135
+ else if (heading.startsWith("## Edge: ")) {
136
+ const kind = heading.slice("## Edge: ".length).trim();
137
+ if (fields.files === undefined || fields.pattern === undefined) {
138
+ return yield* fail(`'${heading}' needs 'files:' and 'pattern:'`);
139
+ }
140
+ if (!isValidRegExp(fields.pattern)) {
141
+ return yield* fail(`'${heading}' pattern is not a valid regex: ${fields.pattern}`);
142
+ }
143
+ if (!fields.pattern.includes("(?<to>")) {
144
+ return yield* fail(`'${heading}' pattern needs a (?<to>…) group`);
145
+ }
146
+ edges.push(EdgeRule.make({
147
+ kind,
148
+ files: fields.files,
149
+ pattern: fields.pattern,
150
+ fromKind: fields.from ?? "file",
151
+ toKind: fields.to ?? "file"
152
+ }));
153
+ }
154
+ else if (heading.startsWith("## Join: ")) {
155
+ const kind = heading.slice("## Join: ".length).trim();
156
+ const from = kindAndAttr(fields.from);
157
+ const to = kindAndAttr(fields.to);
158
+ if (from === undefined || to === undefined) {
159
+ return yield* fail(`'${heading}' needs 'from: <kind>.<attr>' and 'to: <kind>.<attr>'`);
160
+ }
161
+ const match = fields.match === "url" ? "url" : "exact";
162
+ const scope = fields.scope === "file" || fields.scope === "app" || fields.scope === "estate"
163
+ ? fields.scope
164
+ : match === "url"
165
+ ? "app"
166
+ : "estate";
167
+ joins.push(JoinRule.make({
168
+ kind,
169
+ fromKind: from[0],
170
+ fromAttr: from[1],
171
+ toKind: to[0],
172
+ toAttr: to[1],
173
+ match,
174
+ scope
175
+ }));
176
+ }
177
+ else if (heading.startsWith("## Probe: ")) {
178
+ const name = heading.slice("## Probe: ".length).trim();
179
+ if (fields.from === undefined || fields.to === undefined) {
180
+ return yield* fail(`'${heading}' needs 'from:' and 'to:'`);
181
+ }
182
+ probes.push(ProbeRule.make({ name, from: fields.from, to: fields.to }));
183
+ }
184
+ else if (heading === "## Graph") {
185
+ const max = Number.parseInt(fields["worklist-max"] ?? "", 10);
186
+ const batch = Number.parseInt(fields["batch-size"] ?? "", 10);
187
+ worklistMax = Number.isInteger(max) && max > 0 ? max : worklistMax;
188
+ batchSize = Number.isInteger(batch) && batch > 0 ? batch : batchSize;
189
+ }
190
+ }
191
+ const nodeKinds = new Set(["file", ...nodes.map((rule) => rule.kind)]);
192
+ for (const rule of edges) {
193
+ for (const kind of [rule.fromKind, rule.toKind]) {
194
+ if (!nodeKinds.has(kind)) {
195
+ return yield* fail(`'## Edge: ${rule.kind}' names node kind '${kind}' no '## Node:' declares`);
196
+ }
197
+ }
198
+ }
199
+ for (const rule of joins) {
200
+ for (const kind of [rule.fromKind, rule.toKind]) {
201
+ if (!nodeKinds.has(kind)) {
202
+ return yield* fail(`'## Join: ${rule.kind}' names node kind '${kind}' no '## Node:' declares`);
203
+ }
204
+ }
205
+ }
206
+ return { nodes, edges, joins, probes, worklistMax, batchSize };
207
+ });
208
+ /** Every edge kind the rules can produce: captured kinds plus join kinds. */
209
+ export const edgeKindsOf = (rules) => new Set([...rules.edges.map((rule) => rule.kind), ...rules.joins.map((rule) => rule.kind)]);
210
+ /** Changes when any rule that shapes the graph changes; probes and budgets do not. */
211
+ export const graphRulesHash = (rules) => fingerprintOf([JSON.stringify({ n: rules.nodes, e: rules.edges, j: rules.joins })]);
212
+ /** `${ctx}/a/b?x=1` → `/a/b`; `salva.do` → `/salva.do`; scheme, host and fragment dropped. */
213
+ export const normalizeUrl = (raw) => {
214
+ let url = raw.trim();
215
+ url = url.replace(/^(\$\{[^}]*\}|<%=[^%]*%>)/, "");
216
+ url = url.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/]+/i, "");
217
+ url = url.replace(/[?#].*$/, "");
218
+ if (!url.startsWith("/")) {
219
+ url = `/${url}`;
220
+ }
221
+ if (url.length > 1 && url.endsWith("/")) {
222
+ url = url.slice(0, -1);
223
+ }
224
+ return url;
225
+ };
226
+ /**
227
+ * Servlet-spec matching of a normalised request against a `url-pattern`:
228
+ * exact, then a `/*` prefix, then a `*.ext` extension. The extension case
229
+ * reads the raw pattern, since normalising `*.do` would prefix a slash.
230
+ */
231
+ export const matchUrl = (request, pattern) => {
232
+ const trimmed = pattern.trim();
233
+ if (trimmed.startsWith("*.")) {
234
+ return request.endsWith(trimmed.slice(1)) ? "extension" : undefined;
235
+ }
236
+ const target = normalizeUrl(trimmed);
237
+ if (request === target) {
238
+ return "exact";
239
+ }
240
+ if (target.endsWith("/*")) {
241
+ const prefix = target.slice(0, -2);
242
+ return request === prefix || request.startsWith(`${prefix}/`) ? "prefix" : undefined;
243
+ }
244
+ return undefined;
245
+ };
246
+ //# sourceMappingURL=GraphRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphRules.js","sourceRoot":"","sources":["../src/GraphRules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import * as Schema from "effect/Schema";
2
+ import type { JsonSchema } from "@llm4ts/core/Models";
3
+ import type { GraphRules } from "./GraphRules.ts";
4
+ import { Fill, GraphEvidence, SurveyEdge, SurveyGraph, type SurveyNode, type Unresolved } from "./Survey.ts";
5
+ /**
6
+ * The bounded LLM pass of the code graph (ADR 0030 decision 4). The scanner's
7
+ * `unresolved` list becomes a worklist; the seat may fill an attr of an
8
+ * existing node or add an edge between two existing nodes, each tied to a
9
+ * source line that is checked here before anything is merged. It may not
10
+ * create nodes.
11
+ */
12
+ export interface WorklistCandidate {
13
+ readonly id: string;
14
+ readonly label: string;
15
+ readonly attrs: Readonly<Record<string, string>>;
16
+ }
17
+ export interface WorklistItem {
18
+ readonly unresolved: Unresolved;
19
+ readonly node: SurveyNode;
20
+ /** Fifteen lines either side of the item's line, numbered. */
21
+ readonly context: string;
22
+ readonly candidates: ReadonlyArray<WorklistCandidate>;
23
+ }
24
+ /** Unresolved items, highest-degree node first (hubs resolve first), capped at `max`. */
25
+ export declare const worklistOf: (graph: SurveyGraph, contents: (path: string) => string | undefined, max: number, rules?: GraphRules) => ReadonlyArray<WorklistItem>;
26
+ export declare const worklistBatches: <A>(items: ReadonlyArray<A>, size: number) => ReadonlyArray<ReadonlyArray<A>>;
27
+ export declare const worklistPrompt: (batch: ReadonlyArray<WorklistItem>, guidance: string | undefined) => string;
28
+ declare const WorklistEdge_base: Schema.Class<WorklistEdge, Schema.Struct<{
29
+ readonly from: Schema.String;
30
+ readonly to: Schema.String;
31
+ readonly kind: Schema.String;
32
+ readonly evidence: typeof GraphEvidence;
33
+ }>, {}>;
34
+ export declare class WorklistEdge extends WorklistEdge_base {
35
+ }
36
+ declare const WorklistAttr_base: Schema.Class<WorklistAttr, Schema.Struct<{
37
+ readonly node: Schema.String;
38
+ readonly key: Schema.String;
39
+ readonly value: Schema.String;
40
+ readonly evidence: typeof GraphEvidence;
41
+ }>, {}>;
42
+ export declare class WorklistAttr extends WorklistAttr_base {
43
+ }
44
+ declare const WorklistAnswer_base: Schema.Class<WorklistAnswer, Schema.Struct<{
45
+ readonly edges: Schema.$Array<typeof WorklistEdge>;
46
+ readonly attrs: Schema.$Array<typeof WorklistAttr>;
47
+ readonly notes: Schema.$Array<Schema.String>;
48
+ }>, {}>;
49
+ export declare class WorklistAnswer extends WorklistAnswer_base {
50
+ }
51
+ export declare const worklistAnswerJsonSchema: JsonSchema;
52
+ export interface VerifiedWorklist {
53
+ readonly edges: ReadonlyArray<SurveyEdge>;
54
+ readonly fills: ReadonlyArray<Fill>;
55
+ readonly dropped: ReadonlyArray<{
56
+ readonly what: string;
57
+ readonly reason: string;
58
+ }>;
59
+ }
60
+ export declare const verifyWorklistAnswer: (answer: WorklistAnswer, graph: SurveyGraph, contents: (path: string) => string | undefined) => VerifiedWorklist;
61
+ export declare const mergeWorklist: (graph: SurveyGraph, verified: VerifiedWorklist, rules: GraphRules) => SurveyGraph;
62
+ export declare const renderWorklistReport: (items: ReadonlyArray<WorklistItem>, verified: VerifiedWorklist, notes: ReadonlyArray<string>) => string;
63
+ export {};
64
+ //# sourceMappingURL=GraphWorklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphWorklist.d.ts","sourceRoot":"","sources":["../src/GraphWorklist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EACL,IAAI,EACJ,aAAa,EACb,UAAU,EACV,WAAW,EAOX,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAEpB;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAA;CACtD;AA8DD,yFAAyF;AACzF,eAAO,MAAM,UAAU,GACrB,OAAO,WAAW,EAClB,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC9C,KAAK,MAAM,EACX,QAAQ,UAAU,KACjB,aAAa,CAAC,YAAY,CAmB5B,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,OAAO,aAAa,CAAC,CAAC,CAAC,EACvB,MAAM,MAAM,KACX,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAOhC,CAAA;AA6BD,eAAO,MAAM,cAAc,GACzB,OAAO,aAAa,CAAC,YAAY,CAAC,EAClC,UAAU,MAAM,GAAG,SAAS,KAC3B,MAmBW,CAAA;;;;;;;AAEd,qBAAa,YAAa,SAAQ,iBAKhC;CAAG;;;;;;;AAEL,qBAAa,YAAa,SAAQ,iBAKhC;CAAG;;;;;;AAEL,qBAAa,cAAe,SAAQ,mBAIlC;CAAG;AAYL,eAAO,MAAM,wBAAwB,EAAE,UAgCtC,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACpF;AAyBD,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,cAAc,EACtB,OAAO,WAAW,EAClB,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,KAC7C,gBAmEF,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,OAAO,WAAW,EAClB,UAAU,gBAAgB,EAC1B,OAAO,UAAU,KAChB,WAUA,CAAA;AAIH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,aAAa,CAAC,YAAY,CAAC,EAClC,UAAU,gBAAgB,EAC1B,OAAO,aAAa,CAAC,MAAM,CAAC,KAC3B,MA2BW,CAAA"}
@@ -0,0 +1,283 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { Fill, GraphEvidence, SurveyEdge, SurveyGraph, applyFillsAndJoins, nodeAttrs, nodeId, nodeKind, nodeLabel, nodeLineStart } from "./Survey.js";
3
+ const contextWindow = 15;
4
+ const candidateLimit = 8;
5
+ const tokens = (text) => [
6
+ ...new Set(text
7
+ .toLowerCase()
8
+ .split(/[^a-z0-9]+/)
9
+ .filter((token) => token.length >= 3))
10
+ ];
11
+ const numbered = (text, line) => text
12
+ .split(/\r?\n/)
13
+ .map((content, index) => ({ number: index + 1, content }))
14
+ .filter(({ number }) => Math.abs(number - line) <= contextWindow)
15
+ .map(({ number, content }) => `${String(number).padStart(4, " ")} ${content}`)
16
+ .join("\n");
17
+ /**
18
+ * Up to eight existing nodes worth naming to the seat: lexical matches on the
19
+ * item's reference, name and attrs, and for a join hole every node of the
20
+ * join's target kind (a dynamic URL matches no token of any mapping).
21
+ */
22
+ const candidatesFor = (graph, item, node, rules) => {
23
+ const needles = tokens(`${item.reference ?? ""} ${node.name} ${Object.values(nodeAttrs(node)).join(" ")}`);
24
+ const targetKinds = new Set(item.reason === "missing-attr" || item.reason === "join-from"
25
+ ? (rules?.joins ?? []).filter((rule) => rule.kind === item.rule).map((rule) => rule.toKind)
26
+ : []);
27
+ return graph.nodes
28
+ .filter((candidate) => nodeId(candidate) !== nodeId(node))
29
+ .map((candidate) => {
30
+ const hay = `${nodeId(candidate)} ${nodeLabel(candidate)} ${Object.values(nodeAttrs(candidate)).join(" ")}`.toLowerCase();
31
+ const lexical = needles.filter((needle) => hay.includes(needle)).length;
32
+ return { candidate, score: lexical + (targetKinds.has(nodeKind(candidate)) ? 1 : 0) };
33
+ })
34
+ .filter(({ score }) => score > 0)
35
+ .sort((left, right) => right.score - left.score || nodeId(left.candidate).localeCompare(nodeId(right.candidate)))
36
+ .slice(0, candidateLimit)
37
+ .map(({ candidate }) => ({
38
+ id: nodeId(candidate),
39
+ label: nodeLabel(candidate),
40
+ attrs: nodeAttrs(candidate)
41
+ }));
42
+ };
43
+ /** Unresolved items, highest-degree node first (hubs resolve first), capped at `max`. */
44
+ export const worklistOf = (graph, contents, max, rules) => {
45
+ const degree = (id) => graph.incoming(id).length + graph.outgoing(id).length;
46
+ // Rank and cut first; reading context and scoring candidates is paid only
47
+ // for the items actually offered.
48
+ const ranked = graph.unresolved
49
+ .flatMap((item) => {
50
+ const node = graph.node(item.node);
51
+ return node === undefined ? [] : [{ item, node, degree: degree(item.node) }];
52
+ })
53
+ .sort((left, right) => right.degree - left.degree || left.item.node.localeCompare(right.item.node))
54
+ .slice(0, max);
55
+ return ranked.map(({ item, node }) => ({
56
+ unresolved: item,
57
+ node,
58
+ context: numbered(contents(item.file) ?? "", item.line),
59
+ candidates: candidatesFor(graph, item, node, rules)
60
+ }));
61
+ };
62
+ export const worklistBatches = (items, size) => {
63
+ const step = Math.max(1, Math.floor(size));
64
+ const batches = [];
65
+ for (let index = 0; index < items.length; index += step) {
66
+ batches.push(items.slice(index, index + step));
67
+ }
68
+ return batches;
69
+ };
70
+ const describeCandidate = (candidate) => Object.keys(candidate.attrs).length === 0
71
+ ? candidate.id
72
+ : `${candidate.id} ${JSON.stringify(candidate.attrs)}`;
73
+ const describeItem = (item, index) => [
74
+ `### Item ${index + 1}: ${item.unresolved.reason} — rule '${item.unresolved.rule}'`,
75
+ `Node: ${nodeId(item.node)} (line ${nodeLineStart(item.node)} of ${item.node.path})`,
76
+ ...(item.unresolved.reference === undefined
77
+ ? []
78
+ : [`Reference the scanner could not resolve: ${item.unresolved.reference}`]),
79
+ `Candidates (existing nodes with matching tokens): ${item.candidates.length === 0 ? "none" : item.candidates.map(describeCandidate).join("; ")}`,
80
+ "Source context:",
81
+ "```",
82
+ item.context,
83
+ "```"
84
+ ].join("\n");
85
+ const defaultGuidance = [
86
+ "Regexes miss links the source establishes indirectly: a URL assembled from a variable or",
87
+ "configuration entry, a target held in a field, wiring declared in a descriptor, a fragment",
88
+ "pulled in by templating."
89
+ ].join("\n");
90
+ export const worklistPrompt = (batch, guidance) => [
91
+ "You are resolving holes in the dependency graph of a legacy estate. The graph was built",
92
+ "deterministically from pack rules; each item below is something the scanner could not",
93
+ "resolve. You have read-only access to the estate.",
94
+ guidance ?? defaultGuidance,
95
+ "",
96
+ "For each item, either resolve it or leave it. You may:",
97
+ '- fill a missing attribute of an EXISTING node ("attrs": node id, key, value) — e.g. the URL an',
98
+ " ajax call actually hits once its prefix variable is known;",
99
+ '- add an edge between two EXISTING nodes ("edges": from id, to id, a short kebab-case kind).',
100
+ "Every entry carries evidence: the file, the 1-based line, and the exact statement on that line.",
101
+ "No evidence, no entry. Use node ids exactly as given; never invent a node, a file or a line.",
102
+ 'External systems, platform services and third-party libraries are not nodes; put them in "notes".',
103
+ "",
104
+ ...batch.map(describeItem),
105
+ "",
106
+ 'Respond only with JSON: {"edges":[{"from","to","kind","evidence":{"file","line","snippet"}}],',
107
+ '"attrs":[{"node","key","value","evidence":{"file","line","snippet"}}],"notes":[…]}'
108
+ ].join("\n");
109
+ export class WorklistEdge extends Schema.Class("WorklistEdge")({
110
+ from: Schema.String,
111
+ to: Schema.String,
112
+ kind: Schema.String,
113
+ evidence: GraphEvidence
114
+ }) {
115
+ }
116
+ export class WorklistAttr extends Schema.Class("WorklistAttr")({
117
+ node: Schema.String,
118
+ key: Schema.String,
119
+ value: Schema.String,
120
+ evidence: GraphEvidence
121
+ }) {
122
+ }
123
+ export class WorklistAnswer extends Schema.Class("WorklistAnswer")({
124
+ edges: Schema.Array(WorklistEdge),
125
+ attrs: Schema.Array(WorklistAttr),
126
+ notes: Schema.Array(Schema.String)
127
+ }) {
128
+ }
129
+ const evidenceJsonSchema = {
130
+ type: "object",
131
+ properties: {
132
+ file: { type: "string" },
133
+ line: { type: "integer" },
134
+ snippet: { type: "string" }
135
+ },
136
+ required: ["file", "line", "snippet"]
137
+ };
138
+ export const worklistAnswerJsonSchema = {
139
+ type: "object",
140
+ properties: {
141
+ edges: {
142
+ type: "array",
143
+ items: {
144
+ type: "object",
145
+ properties: {
146
+ from: { type: "string" },
147
+ to: { type: "string" },
148
+ kind: { type: "string" },
149
+ evidence: evidenceJsonSchema
150
+ },
151
+ required: ["from", "to", "kind", "evidence"]
152
+ }
153
+ },
154
+ attrs: {
155
+ type: "array",
156
+ items: {
157
+ type: "object",
158
+ properties: {
159
+ node: { type: "string" },
160
+ key: { type: "string" },
161
+ value: { type: "string" },
162
+ evidence: evidenceJsonSchema
163
+ },
164
+ required: ["node", "key", "value", "evidence"]
165
+ }
166
+ },
167
+ notes: { type: "array", items: { type: "string" } }
168
+ },
169
+ required: ["edges", "attrs", "notes"]
170
+ };
171
+ /** The 1-based line within ±2 of `line` whose text contains the trimmed snippet, or undefined. */
172
+ const locateSnippet = (text, line, snippet) => {
173
+ if (text === undefined) {
174
+ return undefined;
175
+ }
176
+ const needle = snippet.trim();
177
+ if (needle.length === 0) {
178
+ return undefined;
179
+ }
180
+ const lines = text.split(/\r?\n/);
181
+ for (const delta of [0, -1, 1, -2, 2]) {
182
+ const candidate = line + delta;
183
+ if (candidate >= 1 && (lines[candidate - 1] ?? "").includes(needle)) {
184
+ return candidate;
185
+ }
186
+ }
187
+ return undefined;
188
+ };
189
+ export const verifyWorklistAnswer = (answer, graph, contents) => {
190
+ const ids = new Set(graph.nodes.map(nodeId));
191
+ const existing = new Set(graph.edges.map((edge) => `${edge.from}\u0000${edge.to}`));
192
+ const edges = [];
193
+ const fills = [];
194
+ const dropped = [];
195
+ const verified = (evidence) => {
196
+ const line = locateSnippet(contents(evidence.file), evidence.line, evidence.snippet);
197
+ return line === undefined
198
+ ? `snippet not found within two lines of line ${evidence.line}`
199
+ : GraphEvidence.make({ file: evidence.file, line, snippet: evidence.snippet.trim() });
200
+ };
201
+ for (const edge of answer.edges) {
202
+ const what = `${edge.from} -> ${edge.to} (${edge.kind})`;
203
+ const unknown = [edge.from, edge.to].find((id) => !ids.has(id));
204
+ if (unknown !== undefined) {
205
+ dropped.push({ what, reason: `unknown endpoint: ${unknown}` });
206
+ continue;
207
+ }
208
+ if (edge.from === edge.to) {
209
+ dropped.push({ what, reason: "self loop" });
210
+ continue;
211
+ }
212
+ if (existing.has(`${edge.from}\u0000${edge.to}`)) {
213
+ dropped.push({ what, reason: "duplicate of an existing edge" });
214
+ continue;
215
+ }
216
+ const evidence = verified(edge.evidence);
217
+ if (typeof evidence === "string") {
218
+ dropped.push({ what, reason: evidence });
219
+ continue;
220
+ }
221
+ existing.add(`${edge.from}\u0000${edge.to}`);
222
+ edges.push(SurveyEdge.make({
223
+ from: edge.from,
224
+ to: edge.to,
225
+ kind: edge.kind.replace(/^llm-/, ""),
226
+ origin: "llm",
227
+ confidence: "inferred",
228
+ rule: "llm",
229
+ mechanism: "llm",
230
+ evidence
231
+ }));
232
+ }
233
+ const nodesById = new Map(graph.nodes.map((node) => [nodeId(node), node]));
234
+ for (const attr of answer.attrs) {
235
+ const what = `${attr.node}.${attr.key} = ${attr.value}`;
236
+ const node = nodesById.get(attr.node);
237
+ if (node === undefined) {
238
+ dropped.push({ what, reason: `unknown node: ${attr.node}` });
239
+ continue;
240
+ }
241
+ // The seat fills holes; it never overrides what the scanner read.
242
+ if (nodeAttrs(node)[attr.key] !== undefined) {
243
+ dropped.push({ what, reason: `attr '${attr.key}' already set by the scanner` });
244
+ continue;
245
+ }
246
+ const evidence = verified(attr.evidence);
247
+ if (typeof evidence === "string") {
248
+ dropped.push({ what, reason: evidence });
249
+ continue;
250
+ }
251
+ fills.push(Fill.make({ node: attr.node, key: attr.key, value: attr.value, evidence }));
252
+ }
253
+ return { edges, fills, dropped };
254
+ };
255
+ export const mergeWorklist = (graph, verified, rules) => applyFillsAndJoins(SurveyGraph.make({
256
+ nodes: graph.nodes,
257
+ edges: [...graph.edges, ...verified.edges],
258
+ unresolved: graph.unresolved,
259
+ fills: []
260
+ }), [...graph.fills, ...verified.fills], rules);
261
+ const cell = (text) => text.split(/\r?\n/).join(" ").replaceAll("|", "\\|");
262
+ export const renderWorklistReport = (items, verified, notes) => [
263
+ "# Graph refine (LLM worklist)",
264
+ "",
265
+ `${items.length} unresolved item(s) offered; ${verified.edges.length} edge(s) and ${verified.fills.length} attr fill(s) accepted; ${verified.dropped.length} dropped.`,
266
+ "Accepted entries carry the source line that establishes them and are re-verified on every rebuild.",
267
+ "",
268
+ "## Accepted",
269
+ "",
270
+ "| What | Evidence |",
271
+ "| ---- | -------- |",
272
+ ...verified.edges.map((edge) => `| ${cell(`${edge.from} → ${edge.to} (${edge.kind})`)} | ${cell(`${edge.evidence?.file}:${edge.evidence?.line} ${edge.evidence?.snippet ?? ""}`)} |`),
273
+ ...verified.fills.map((fill) => `| ${cell(`${fill.node}.${fill.key} = ${fill.value}`)} | ${cell(`${fill.evidence.file}:${fill.evidence.line} ${fill.evidence.snippet}`)} |`),
274
+ "",
275
+ "## Dropped",
276
+ "",
277
+ "| What | Reason |",
278
+ "| ---- | ------ |",
279
+ ...verified.dropped.map((drop) => `| ${cell(drop.what)} | ${cell(drop.reason)} |`),
280
+ "",
281
+ ...(notes.length === 0 ? [] : ["## Notes", "", ...notes.map((note) => `- ${cell(note)}`), ""])
282
+ ].join("\n");
283
+ //# sourceMappingURL=GraphWorklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphWorklist.js","sourceRoot":"","sources":["../src/GraphWorklist.ts"],"names":[],"mappings":"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"}