@aroman22/codegraph-vba-darwin-arm64 1.16.0 → 1.17.1

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.
@@ -0,0 +1,589 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BEHAVIOR_EVIDENCE_NOTES = exports.BEHAVIOR_EFFECT_VOCABULARY = void 0;
37
+ exports.buildBehaviorEvidence = buildBehaviorEvidence;
38
+ /**
39
+ * Behavior evidence — the bounded, typed answer to "what does this Access
40
+ * control actually do?", assembled from facts that are already indexed.
41
+ *
42
+ * Issue #299. Every other consumer surface returns prose keyed on a fuzzy
43
+ * symbol name; a machine consumer (Dysflow's behavior map) needs a typed
44
+ * array with deterministic call paths and an explicit account of what could
45
+ * NOT be answered. That is why this is its own operation rather than another
46
+ * mode of `codegraph_node` / `codegraph_impact`: those return agent-facing
47
+ * text and would have to grow a second, contradictory output shape.
48
+ *
49
+ * It is READ-ONLY. Nothing here parses source, opens Access, writes to the
50
+ * index or triggers a re-index.
51
+ *
52
+ * ## The graph contract it reads
53
+ *
54
+ * - An `event-handler` edge is stored HANDLER -> control/layout, for the
55
+ * `<Control>_<Event>` code-behind convention AND for `=Expression()`
56
+ * wiring. Reaching a handler from its control means following it backwards.
57
+ * - A call is a `calls` edge, or a `references` edge landing on a procedure:
58
+ * VBA's statement-form Sub call (`SaveRecord` on a line of its own) is
59
+ * ambiguous at parse time, so it stays `unqualified-ident` (#265) and
60
+ * resolves to `references`, not `calls`.
61
+ * - Data access is a `references` edge onto a table/query node, carrying
62
+ * `metadata.access` ('read' | 'write') when the extractor could tell. Those
63
+ * edges are sourced from the MODULE node by design (see
64
+ * `VbaExtractionContext.emitReference`), so they are attributed to a
65
+ * procedure by the edge's LINE falling inside that procedure's range — a
66
+ * fact the index already stores, not a name guess.
67
+ *
68
+ * ## What it deliberately does not do
69
+ *
70
+ * No effect is inferred. An empty `effects` or `tables` list means the index
71
+ * holds no such fact for that path — never that the code has no runtime
72
+ * effect. Dynamic dispatch, late binding and anything the extractor declined
73
+ * are reported in `context.unresolved` instead of being silently dropped.
74
+ */
75
+ const path = __importStar(require("path"));
76
+ /**
77
+ * The closed vocabulary of `effects` strings. Anything outside this list is a
78
+ * bug, not a new fact.
79
+ *
80
+ * - `read:<name>` / `write:<name>` — a data reference the extractor typed.
81
+ * - `data-access:<name>` — a data reference whose direction is unknown.
82
+ * NOT a read and NOT a write; it means the index cannot say.
83
+ * - `opens-form:<Name>` / `opens-report:<Name>` — an Access object opened.
84
+ * - `raises-event:<Name>` — an event raised from the path.
85
+ */
86
+ exports.BEHAVIOR_EFFECT_VOCABULARY = [
87
+ 'read:<name>',
88
+ 'write:<name>',
89
+ 'data-access:<name>',
90
+ 'opens-form:<Name>',
91
+ 'opens-report:<Name>',
92
+ 'raises-event:<Name>',
93
+ ];
94
+ /**
95
+ * The closed vocabulary of `context.notes`.
96
+ *
97
+ * - `MISSING_TARGET_SELECTOR` — neither `nodeId` nor `name` was given.
98
+ * - `TARGET_NOT_FOUND` — nothing in the index matches. A lookup miss, not
99
+ * proof the control has no behavior.
100
+ * - `AMBIGUOUS_TARGET` — the name matches several nodes; see
101
+ * `context.ambiguous`. No evidence is returned, and nothing is guessed.
102
+ * - `NO_HANDLER_BOUND` — the target exists but no handler is wired to it in
103
+ * the index. Access macros and `[Event Procedure]` entries with no
104
+ * code-behind land here.
105
+ * - `STATIC_SOURCE_EVIDENCE` — always present. The answer comes from indexed
106
+ * exported source: it does not prove the code ran, and it says nothing
107
+ * about whether the `.accdb` binary matches the export.
108
+ */
109
+ exports.BEHAVIOR_EVIDENCE_NOTES = [
110
+ 'MISSING_TARGET_SELECTOR',
111
+ 'TARGET_NOT_FOUND',
112
+ 'AMBIGUOUS_TARGET',
113
+ 'NO_HANDLER_BOUND',
114
+ 'STATIC_SOURCE_EVIDENCE',
115
+ ];
116
+ const UI_NODE_KINDS = new Set([
117
+ 'form-instance-control',
118
+ 'form-layout',
119
+ 'report-layout',
120
+ ]);
121
+ const LAYOUT_NODE_KINDS = new Set(['form-layout', 'report-layout']);
122
+ const PROCEDURE_KINDS = new Set(['function', 'method']);
123
+ /**
124
+ * Node kinds a data reference can land on. An Access table has no kind of its
125
+ * own — it is a placeholder `class` node, the same shape a VBA type gets —
126
+ * which is why {@link isDataReference} exists.
127
+ */
128
+ const DATA_TARGET_KINDS = new Set(['class', 'query']);
129
+ /**
130
+ * The `metadata.synthesizedBy` channels that mean "this names a table or a
131
+ * saved query".
132
+ *
133
+ * An Access table is modelled as a placeholder `class` node, so the target's
134
+ * kind alone cannot tell a table apart from an ordinary type. Without this
135
+ * allowlist a `Dim rs As DAO.Recordset` — a TYPE reference emitted by
136
+ * `vba-name-resolution` — would be reported as a table the handler touches,
137
+ * which is exactly the kind of guessed evidence this contract forbids.
138
+ */
139
+ const DATA_REFERENCE_CHANNELS = new Set([
140
+ 'vba-sql-table',
141
+ 'vba-record-source',
142
+ 'vba-row-source',
143
+ 'vba-row-source-dynamic',
144
+ 'vba-control-source',
145
+ 'vba-source-object',
146
+ 'vba-query-name',
147
+ 'vba-opens-query',
148
+ 'vba-opens-table',
149
+ 'sql-query-table',
150
+ ]);
151
+ /**
152
+ * Is this `references` edge a data access, as opposed to a type, name or
153
+ * binding reference that happens to land on the same node shape?
154
+ */
155
+ function isDataReference(edge, target) {
156
+ if (target.kind === 'query')
157
+ return true;
158
+ const access = edge.metadata?.access;
159
+ if (access === 'read' || access === 'write')
160
+ return true;
161
+ const via = metadataString(edge, 'synthesizedBy');
162
+ return via !== null && DATA_REFERENCE_CHANNELS.has(via);
163
+ }
164
+ const DEFAULT_MAX_CALL_DEPTH = 5;
165
+ const DEFAULT_MAX_RESULTS = 50;
166
+ function clamp(value, min, max) {
167
+ return Math.min(max, Math.max(min, value));
168
+ }
169
+ function locationOf(filePath, line) {
170
+ if (!filePath)
171
+ return 'unknown';
172
+ return line ? `${filePath}:${line}` : filePath;
173
+ }
174
+ function metadataString(edge, key) {
175
+ const value = edge.metadata?.[key];
176
+ return typeof value === 'string' ? value : null;
177
+ }
178
+ /**
179
+ * Assembles behavior evidence for one control, layout or handler.
180
+ *
181
+ * Pure read path over {@link QueryBuilder}: no new SQL, no second traversal
182
+ * implementation, no writes.
183
+ */
184
+ function buildBehaviorEvidence(queries, request) {
185
+ const maxCallDepth = clamp(Math.trunc(request.maxCallDepth ?? DEFAULT_MAX_CALL_DEPTH), 1, 20);
186
+ const maxResults = clamp(Math.trunc(request.maxResults ?? DEFAULT_MAX_RESULTS), 1, 500);
187
+ const result = {
188
+ target: null,
189
+ evidence: [],
190
+ context: {
191
+ handlers: [],
192
+ data: [],
193
+ unresolved: [],
194
+ ambiguous: [],
195
+ truncated: { callDepth: false, results: false, cycle: false },
196
+ notes: ['STATIC_SOURCE_EVIDENCE'],
197
+ },
198
+ };
199
+ const indexedLayouts = (node) => {
200
+ const layouts = new Map();
201
+ const collect = (bound) => {
202
+ if (LAYOUT_NODE_KINDS.has(bound.kind))
203
+ layouts.set(bound.id, bound);
204
+ // Synthesized report section controls can lack a contains edge. Their
205
+ // indexed layout file still identifies the owner without guessing from .cls.
206
+ if (bound.kind === 'form-instance-control') {
207
+ for (const owner of queries.getNodesByFile(bound.filePath)) {
208
+ if (LAYOUT_NODE_KINDS.has(owner.kind))
209
+ layouts.set(owner.id, owner);
210
+ }
211
+ }
212
+ for (const edge of queries.getIncomingEdges(bound.id, ['contains'])) {
213
+ const owner = queries.getNodeById(edge.source);
214
+ if (owner && LAYOUT_NODE_KINDS.has(owner.kind))
215
+ layouts.set(owner.id, owner);
216
+ }
217
+ };
218
+ collect(node);
219
+ if (PROCEDURE_KINDS.has(node.kind)) {
220
+ for (const edge of queries.getOutgoingEdges(node.id, ['event-handler'])) {
221
+ const bound = queries.getNodeById(edge.target);
222
+ if (bound)
223
+ collect(bound);
224
+ }
225
+ }
226
+ return [...layouts.values()];
227
+ };
228
+ const matchesLayout = (node, wanted) => node.name.toLowerCase() === wanted ||
229
+ path.basename(node.filePath ?? '').toLowerCase() === wanted;
230
+ const owningLayout = (node) => {
231
+ const layouts = indexedLayouts(node);
232
+ const scoped = request.layout
233
+ ? layouts.filter(layout => matchesLayout(layout, request.layout.toLowerCase()))
234
+ : layouts;
235
+ if (scoped.length === 1)
236
+ return scoped[0].name;
237
+ if (layouts.length > 0)
238
+ return null; // Never invent one owner for shared expressions.
239
+ const base = path.basename(node.filePath ?? '');
240
+ const stripped = base.replace(/\.(form|report)\.txt$/i, '');
241
+ return stripped === base ? null : stripped;
242
+ };
243
+ // ---- 1. Resolve the target ------------------------------------------
244
+ let target = null;
245
+ if (request.nodeId) {
246
+ target = queries.getNodeById(request.nodeId);
247
+ if (!target)
248
+ result.context.notes.push('TARGET_NOT_FOUND');
249
+ }
250
+ else if (request.name) {
251
+ const wanted = request.name.toLowerCase();
252
+ const candidates = queries
253
+ .getNodesByLowerName(wanted)
254
+ .filter((node) => UI_NODE_KINDS.has(node.kind) || PROCEDURE_KINDS.has(node.kind));
255
+ const scoped = request.layout
256
+ ? candidates.filter((node) => {
257
+ const wantedLayout = request.layout.toLowerCase();
258
+ const layouts = indexedLayouts(node);
259
+ if (layouts.length > 0)
260
+ return layouts.some(layout => matchesLayout(layout, wantedLayout));
261
+ const layoutName = owningLayout(node);
262
+ const base = path.basename(node.filePath ?? '');
263
+ return (layoutName?.toLowerCase() === wantedLayout ||
264
+ base.toLowerCase() === wantedLayout ||
265
+ base.toLowerCase().startsWith(`${wantedLayout}.`));
266
+ })
267
+ : candidates;
268
+ if (scoped.length === 0) {
269
+ result.context.notes.push('TARGET_NOT_FOUND');
270
+ }
271
+ else if (scoped.length > 1) {
272
+ result.context.notes.push('AMBIGUOUS_TARGET');
273
+ result.context.ambiguous.push({
274
+ name: request.name,
275
+ matches: scoped
276
+ .map((node) => ({
277
+ id: node.id,
278
+ kind: node.kind,
279
+ filePath: node.filePath,
280
+ layout: owningLayout(node),
281
+ }))
282
+ .sort((a, b) => a.id.localeCompare(b.id)),
283
+ });
284
+ return result;
285
+ }
286
+ else {
287
+ target = scoped[0];
288
+ }
289
+ }
290
+ else {
291
+ result.context.notes.push('MISSING_TARGET_SELECTOR');
292
+ }
293
+ if (!target)
294
+ return result;
295
+ result.target = {
296
+ id: target.id,
297
+ name: target.name,
298
+ kind: target.kind,
299
+ filePath: target.filePath,
300
+ layout: owningLayout(target),
301
+ };
302
+ const handlers = [];
303
+ if (UI_NODE_KINDS.has(target.kind)) {
304
+ const bindings = queries
305
+ .getIncomingEdges(target.id, ['event-handler'])
306
+ .sort((a, b) => a.source.localeCompare(b.source));
307
+ for (const edge of bindings) {
308
+ const handlerNode = queries.getNodeById(edge.source);
309
+ if (!handlerNode)
310
+ continue;
311
+ const wiredBy = metadataString(edge, 'synthesizedBy');
312
+ const scope = metadataString(edge, 'scope') === 'form'
313
+ ? 'form'
314
+ : wiredBy === 'vba-expression-handler'
315
+ ? 'expression'
316
+ : 'control';
317
+ handlers.push({
318
+ node: handlerNode,
319
+ context: {
320
+ handler: handlerNode.name,
321
+ handlerId: handlerNode.id,
322
+ event: metadataString(edge, 'eventName'),
323
+ scope,
324
+ provenance: edge.provenance ?? 'unknown',
325
+ location: locationOf(handlerNode.filePath, handlerNode.startLine),
326
+ wiredBy,
327
+ },
328
+ });
329
+ }
330
+ }
331
+ else if (PROCEDURE_KINDS.has(target.kind)) {
332
+ // The request named the procedure itself. Report the binding it carries,
333
+ // if any, instead of pretending it was reached through a control.
334
+ const binding = queries
335
+ .getOutgoingEdges(target.id, ['event-handler'])
336
+ .filter(edge => {
337
+ if (!request.layout)
338
+ return true;
339
+ const bound = queries.getNodeById(edge.target);
340
+ return bound !== null && bound !== undefined && indexedLayouts(bound)
341
+ .some(layout => matchesLayout(layout, request.layout.toLowerCase()));
342
+ })
343
+ .sort((a, b) => a.target.localeCompare(b.target))[0];
344
+ const wiredBy = binding ? metadataString(binding, 'synthesizedBy') : null;
345
+ handlers.push({
346
+ node: target,
347
+ context: {
348
+ handler: target.name,
349
+ handlerId: target.id,
350
+ event: binding ? metadataString(binding, 'eventName') : null,
351
+ scope: binding
352
+ ? metadataString(binding, 'scope') === 'form'
353
+ ? 'form'
354
+ : wiredBy === 'vba-expression-handler'
355
+ ? 'expression'
356
+ : 'control'
357
+ : 'direct',
358
+ provenance: binding?.provenance ?? 'unknown',
359
+ location: locationOf(target.filePath, target.startLine),
360
+ wiredBy,
361
+ },
362
+ });
363
+ }
364
+ if (handlers.length === 0) {
365
+ result.context.notes.push('NO_HANDLER_BOUND');
366
+ return result;
367
+ }
368
+ result.context.handlers = handlers.map((h) => h.context);
369
+ // ---- 3. Walk each handler's call paths ------------------------------
370
+ const calleesOf = (nodeId) => {
371
+ const out = [];
372
+ const seen = new Set();
373
+ const edges = queries
374
+ .getOutgoingEdges(nodeId, ['calls', 'references'])
375
+ .sort((a, b) => a.target.localeCompare(b.target));
376
+ for (const edge of edges) {
377
+ if (seen.has(edge.target))
378
+ continue;
379
+ const node = queries.getNodeById(edge.target);
380
+ if (!node || !PROCEDURE_KINDS.has(node.kind))
381
+ continue;
382
+ seen.add(edge.target);
383
+ out.push(node);
384
+ }
385
+ return out;
386
+ };
387
+ // Stream paths: output deduplication must never permit exponential work.
388
+ // One extra result's depth allows exact-fit requests to finish honestly.
389
+ let remainingSteps = (maxResults + 1) * maxCallDepth;
390
+ function* walk(chain) {
391
+ if (remainingSteps === 0) {
392
+ result.context.truncated.results = true;
393
+ return;
394
+ }
395
+ remainingSteps--;
396
+ const head = chain[chain.length - 1];
397
+ if (chain.length >= maxCallDepth) {
398
+ if (calleesOf(head.id).length > 0)
399
+ result.context.truncated.callDepth = true;
400
+ yield chain;
401
+ return;
402
+ }
403
+ const callees = calleesOf(head.id).filter((node) => {
404
+ if (chain.some((step) => step.id === node.id)) {
405
+ result.context.truncated.cycle = true;
406
+ return false;
407
+ }
408
+ return true;
409
+ });
410
+ if (callees.length === 0) {
411
+ yield chain;
412
+ return;
413
+ }
414
+ for (const callee of callees) {
415
+ yield* walk([...chain, callee]);
416
+ if (result.context.truncated.results)
417
+ return;
418
+ }
419
+ }
420
+ function* paths() {
421
+ for (const handler of handlers) {
422
+ yield* walk([handler.node]);
423
+ if (result.context.truncated.results)
424
+ return;
425
+ }
426
+ }
427
+ // ---- 4. Attribute data references and effects to each procedure -----
428
+ const dataCache = new Map();
429
+ const dataFor = (procedure) => {
430
+ const cached = dataCache.get(procedure.id);
431
+ if (cached)
432
+ return cached;
433
+ const collected = [];
434
+ const record = (edge, node, attributedBy) => {
435
+ const access = edge.metadata?.access;
436
+ const direction = access === 'read' || access === 'write' ? access : 'unknown';
437
+ collected.push({
438
+ procedure: procedure.name,
439
+ name: node.name,
440
+ targetKind: node.kind,
441
+ access: direction,
442
+ via: metadataString(edge, 'synthesizedBy'),
443
+ attributedBy,
444
+ location: locationOf(procedure.filePath, edge.line),
445
+ });
446
+ // A saved query is a stored fact about the tables it reads; follow it
447
+ // one hop so a procedure that only names the query still reports them.
448
+ if (node.kind === 'query') {
449
+ for (const tableEdge of queries
450
+ .getOutgoingEdges(node.id, ['references'])
451
+ .sort((a, b) => a.target.localeCompare(b.target))) {
452
+ const table = queries.getNodeById(tableEdge.target);
453
+ if (!table || !DATA_TARGET_KINDS.has(table.kind) || table.kind === 'query')
454
+ continue;
455
+ collected.push({
456
+ procedure: procedure.name,
457
+ name: table.name,
458
+ targetKind: table.kind,
459
+ access: direction,
460
+ via: metadataString(tableEdge, 'synthesizedBy'),
461
+ throughQuery: node.name,
462
+ attributedBy,
463
+ location: locationOf(node.filePath, tableEdge.line),
464
+ });
465
+ }
466
+ }
467
+ };
468
+ for (const edge of queries
469
+ .getOutgoingEdges(procedure.id, ['references'])
470
+ .sort((a, b) => a.target.localeCompare(b.target))) {
471
+ const node = queries.getNodeById(edge.target);
472
+ if (!node || !DATA_TARGET_KINDS.has(node.kind))
473
+ continue;
474
+ if (!isDataReference(edge, node))
475
+ continue;
476
+ record(edge, node, 'edge-source');
477
+ }
478
+ // Module-scoped data references, attributed by source line. See the file
479
+ // header: `emitReference` always sources these from the module node.
480
+ for (const container of queries.getIncomingEdges(procedure.id, ['contains'])) {
481
+ const owner = queries.getNodeById(container.source);
482
+ if (!owner || (owner.kind !== 'module' && owner.kind !== 'class'))
483
+ continue;
484
+ for (const edge of queries
485
+ .getOutgoingEdges(owner.id, ['references'])
486
+ .sort((a, b) => a.target.localeCompare(b.target))) {
487
+ if (edge.line === undefined ||
488
+ edge.line < procedure.startLine ||
489
+ edge.line > procedure.endLine) {
490
+ continue;
491
+ }
492
+ const node = queries.getNodeById(edge.target);
493
+ if (!node || !DATA_TARGET_KINDS.has(node.kind))
494
+ continue;
495
+ if (!isDataReference(edge, node))
496
+ continue;
497
+ record(edge, node, 'source-line');
498
+ }
499
+ }
500
+ dataCache.set(procedure.id, collected);
501
+ return collected;
502
+ };
503
+ const effectCache = new Map();
504
+ const objectEffectsFor = (procedure) => {
505
+ const cached = effectCache.get(procedure.id);
506
+ if (cached)
507
+ return cached;
508
+ const effects = [];
509
+ for (const edge of queries
510
+ .getOutgoingEdges(procedure.id, ['opens-form', 'opens-report', 'raises-event'])
511
+ .sort((a, b) => a.target.localeCompare(b.target))) {
512
+ const node = queries.getNodeById(edge.target);
513
+ if (!node)
514
+ continue;
515
+ effects.push(`${edge.kind}:${node.name}`);
516
+ }
517
+ effectCache.set(procedure.id, effects);
518
+ return effects;
519
+ };
520
+ // ---- 5. Build the compatibility payload -----------------------------
521
+ const seenEntries = new Set();
522
+ const seenData = new Set();
523
+ const reported = new Map();
524
+ for (const chain of paths()) {
525
+ const chainData = [];
526
+ const tables = new Set();
527
+ const effects = new Set();
528
+ for (const step of chain) {
529
+ for (const item of dataFor(step)) {
530
+ chainData.push(item);
531
+ if (item.targetKind !== 'query')
532
+ tables.add(item.name);
533
+ effects.add(item.access === 'unknown'
534
+ ? `data-access:${item.name}`
535
+ : `${item.access}:${item.name}`);
536
+ }
537
+ for (const effect of objectEffectsFor(step))
538
+ effects.add(effect);
539
+ }
540
+ const entry = {
541
+ handler: chain[0].name,
542
+ callPath: chain.map((step) => step.name),
543
+ tables: [...tables].sort(),
544
+ effects: [...effects].sort(),
545
+ };
546
+ const key = JSON.stringify(entry);
547
+ if (seenEntries.has(key))
548
+ continue;
549
+ seenEntries.add(key);
550
+ if (result.evidence.length >= maxResults) {
551
+ result.context.truncated.results = true;
552
+ break;
553
+ }
554
+ result.evidence.push(entry);
555
+ for (const step of chain)
556
+ reported.set(step.id, step);
557
+ for (const item of chainData) {
558
+ const dataKey = `${item.procedure}|${item.name}|${item.access}|${item.attributedBy}|${item.location}`;
559
+ if (!seenData.has(dataKey)) {
560
+ seenData.add(dataKey);
561
+ result.context.data.push(item);
562
+ }
563
+ }
564
+ }
565
+ // ---- 6. Unresolved references inside the reported procedures --------
566
+ const byFile = new Map();
567
+ for (const node of reported.values()) {
568
+ if (!node.filePath)
569
+ continue;
570
+ const list = byFile.get(node.filePath) ?? [];
571
+ list.push(node);
572
+ byFile.set(node.filePath, list);
573
+ }
574
+ for (const [filePath, procedures] of [...byFile.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {
575
+ for (const ref of queries.getUnresolvedReferencesForFile(filePath)) {
576
+ const owner = procedures.find((proc) => ref.line >= proc.startLine && ref.line <= proc.endLine);
577
+ if (!owner)
578
+ continue;
579
+ result.context.unresolved.push({
580
+ procedure: owner.name,
581
+ referenceName: ref.referenceName,
582
+ referenceKind: ref.referenceKind,
583
+ location: locationOf(filePath, ref.line),
584
+ });
585
+ }
586
+ }
587
+ return result;
588
+ }
589
+ //# sourceMappingURL=behavior-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior-evidence.js","sourceRoot":"","sources":["../../src/graph/behavior-evidence.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  * knowledge graph from any codebase.
6
6
  */
7
7
  import { Node, Edge, FileRecord, ExtractionResult, Subgraph, TraversalOptions, SearchOptions, SearchResult, SegmentMatch, Context, GraphStats, TaskInput, TaskContext, BuildContextOptions, FindRelevantContextOptions } from './types';
8
+ import { BehaviorEvidenceRequest, BehaviorEvidenceResult } from './graph/behavior-evidence';
8
9
  import { IndexProgress, IndexResult, SyncResult } from './extraction';
9
10
  import { ResolutionResult } from './resolution';
10
11
  import { WatchOptions, PendingFile } from './sync';
@@ -16,6 +17,7 @@ export { IndexProgress, IndexResult, SyncResult } from './extraction';
16
17
  export { detectLanguage, isLanguageSupported, isGrammarLoaded, getSupportedLanguages, initGrammars, loadGrammarsForLanguages, loadAllGrammars } from './extraction';
17
18
  export { ResolutionResult } from './resolution';
18
19
  export { CodeGraphError, FileError, ParseError, DatabaseError, SearchError, VectorError, ConfigError, Logger, setLogger, getLogger, silentLogger, defaultLogger, } from './errors';
20
+ export { buildBehaviorEvidence, BEHAVIOR_EFFECT_VOCABULARY, BEHAVIOR_EVIDENCE_NOTES, CodeGraphBehaviorEvidence, BehaviorEvidenceRequest, BehaviorEvidenceResult, BehaviorEvidenceTarget, BehaviorHandlerContext, BehaviorDataEvidence, BehaviorAmbiguity, BehaviorUnresolvedReference, BehaviorBindingScope, } from './graph/behavior-evidence';
19
21
  export { Mutex, FileLock, processInBatches, debounce, throttle, MemoryMonitor } from './utils';
20
22
  export { FileWatcher, WatchOptions, PendingFile, LockUnavailableError } from './sync';
21
23
  export { MCPServer } from './mcp';
@@ -527,6 +529,26 @@ export declare class CodeGraph {
527
529
  * @returns Subgraph containing potentially impacted nodes
528
530
  */
529
531
  getImpactRadius(nodeId: string, maxDepth?: number): Subgraph;
532
+ /**
533
+ * Assemble bounded behavior evidence for an Access control, layout or
534
+ * handler (issue #299).
535
+ *
536
+ * Read-only: it joins facts that are already indexed — the event binding,
537
+ * the call paths under it, and the tables/effects those procedures reach —
538
+ * into one typed payload, so a consumer does not re-implement the graph
539
+ * semantics for itself. It never parses source, opens Access, or writes to
540
+ * the index.
541
+ *
542
+ * Identify the target by `nodeId` whenever you have one. A `name` needs a
543
+ * `layout` as soon as it is not unique: an ambiguous name is REFUSED with
544
+ * the candidates listed, never narrowed to an arbitrary first match.
545
+ *
546
+ * The answer is static evidence from exported source. An empty `tables` or
547
+ * `effects` list means the index holds no such fact — not that the code has
548
+ * no runtime effect. See {@link BehaviorEvidenceResult.context} for what
549
+ * could not be answered.
550
+ */
551
+ getBehaviorEvidence(request: BehaviorEvidenceRequest): BehaviorEvidenceResult;
530
552
  /**
531
553
  * Find the shortest path between two nodes
532
554
  *