@contorium/mcp 0.8.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.
- package/README.md +97 -0
- package/bin/contorium-mcp.js +34 -0
- package/dist/autoContext.d.ts +2 -0
- package/dist/autoContext.js +2 -0
- package/dist/bootstrapCli.d.ts +2 -0
- package/dist/bootstrapCli.js +21 -0
- package/dist/conflicts.d.ts +19 -0
- package/dist/conflicts.js +49 -0
- package/dist/dashboardEnsure.d.ts +10 -0
- package/dist/dashboardEnsure.js +41 -0
- package/dist/intelligence.d.ts +16 -0
- package/dist/intelligence.js +38 -0
- package/dist/intentGraph.d.ts +20 -0
- package/dist/intentGraph.js +51 -0
- package/dist/mcpBootstrap.d.ts +8 -0
- package/dist/mcpBootstrap.js +81 -0
- package/dist/memoryStore.d.ts +18 -0
- package/dist/memoryStore.js +57 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +66 -0
- package/dist/runtimeState.d.ts +14 -0
- package/dist/runtimeState.js +36 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +567 -0
- package/dist/stateBuilder.d.ts +16 -0
- package/dist/stateBuilder.js +40 -0
- package/dist/understanding.d.ts +1 -0
- package/dist/understanding.js +1 -0
- package/dist/workspace.d.ts +12 -0
- package/dist/workspace.js +40 -0
- package/dist/workspaceConfig.d.ts +14 -0
- package/dist/workspaceConfig.js +80 -0
- package/node_modules/@contora/state-core/dist/adapterSync.d.ts +29 -0
- package/node_modules/@contora/state-core/dist/adapterSync.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/adapterSync.js +142 -0
- package/node_modules/@contora/state-core/dist/adapters.d.ts +20 -0
- package/node_modules/@contora/state-core/dist/adapters.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/adapters.js +24 -0
- package/node_modules/@contora/state-core/dist/bootstrap/bootstrapState.d.ts +6 -0
- package/node_modules/@contora/state-core/dist/bootstrap/bootstrapState.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/bootstrap/bootstrapState.js +116 -0
- package/node_modules/@contora/state-core/dist/bootstrapArtifacts.d.ts +18 -0
- package/node_modules/@contora/state-core/dist/bootstrapArtifacts.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/bootstrapArtifacts.js +43 -0
- package/node_modules/@contora/state-core/dist/bootstrapState.d.ts +6 -0
- package/node_modules/@contora/state-core/dist/bootstrapState.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/bootstrapState.js +60 -0
- package/node_modules/@contora/state-core/dist/dashboardActivity.d.ts +12 -0
- package/node_modules/@contora/state-core/dist/dashboardActivity.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/dashboardActivity.js +58 -0
- package/node_modules/@contora/state-core/dist/dualMode.d.ts +11 -0
- package/node_modules/@contora/state-core/dist/dualMode.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/dualMode.js +38 -0
- package/node_modules/@contora/state-core/dist/gitScan.d.ts +7 -0
- package/node_modules/@contora/state-core/dist/gitScan.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/gitScan.js +39 -0
- package/node_modules/@contora/state-core/dist/index.d.ts +44 -0
- package/node_modules/@contora/state-core/dist/index.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/index.js +141 -0
- package/node_modules/@contora/state-core/dist/minimalSnapshot.d.ts +4 -0
- package/node_modules/@contora/state-core/dist/minimalSnapshot.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/minimalSnapshot.js +60 -0
- package/node_modules/@contora/state-core/dist/scanner/gitScan.d.ts +7 -0
- package/node_modules/@contora/state-core/dist/scanner/gitScan.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/scanner/gitScan.js +42 -0
- package/node_modules/@contora/state-core/dist/scanner/workspaceScanner.d.ts +4 -0
- package/node_modules/@contora/state-core/dist/scanner/workspaceScanner.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/scanner/workspaceScanner.js +148 -0
- package/node_modules/@contora/state-core/dist/semiAutoHandoff.d.ts +46 -0
- package/node_modules/@contora/state-core/dist/semiAutoHandoff.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/semiAutoHandoff.js +227 -0
- package/node_modules/@contora/state-core/dist/sourceMetadata.d.ts +4 -0
- package/node_modules/@contora/state-core/dist/sourceMetadata.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/sourceMetadata.js +27 -0
- package/node_modules/@contora/state-core/dist/state-builder/buildFromScan.d.ts +5 -0
- package/node_modules/@contora/state-core/dist/state-builder/buildFromScan.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/state-builder/buildFromScan.js +33 -0
- package/node_modules/@contora/state-core/dist/state-builder/normalization.d.ts +5 -0
- package/node_modules/@contora/state-core/dist/state-builder/normalization.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/state-builder/normalization.js +107 -0
- package/node_modules/@contora/state-core/dist/state-builder/rebuildFromScan.d.ts +4 -0
- package/node_modules/@contora/state-core/dist/state-builder/rebuildFromScan.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/state-builder/rebuildFromScan.js +22 -0
- package/node_modules/@contora/state-core/dist/state-builder/snapshot.d.ts +5 -0
- package/node_modules/@contora/state-core/dist/state-builder/snapshot.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/state-builder/snapshot.js +53 -0
- package/node_modules/@contora/state-core/dist/state-builder/store.d.ts +7 -0
- package/node_modules/@contora/state-core/dist/state-builder/store.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/state-builder/store.js +99 -0
- package/node_modules/@contora/state-core/dist/state-builder/types.d.ts +18 -0
- package/node_modules/@contora/state-core/dist/state-builder/types.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/state-builder/types.js +20 -0
- package/node_modules/@contora/state-core/dist/types.d.ts +42 -0
- package/node_modules/@contora/state-core/dist/types.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/types.js +3 -0
- package/node_modules/@contora/state-core/dist/understanding/buildUnderstanding.d.ts +22 -0
- package/node_modules/@contora/state-core/dist/understanding/buildUnderstanding.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/buildUnderstanding.js +87 -0
- package/node_modules/@contora/state-core/dist/understanding/changeDetector.d.ts +7 -0
- package/node_modules/@contora/state-core/dist/understanding/changeDetector.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/changeDetector.js +68 -0
- package/node_modules/@contora/state-core/dist/understanding/chpHandoff.d.ts +49 -0
- package/node_modules/@contora/state-core/dist/understanding/chpHandoff.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/chpHandoff.js +214 -0
- package/node_modules/@contora/state-core/dist/understanding/extractor.d.ts +21 -0
- package/node_modules/@contora/state-core/dist/understanding/extractor.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/extractor.js +173 -0
- package/node_modules/@contora/state-core/dist/understanding/formatCanonicalExport.d.ts +30 -0
- package/node_modules/@contora/state-core/dist/understanding/formatCanonicalExport.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/formatCanonicalExport.js +363 -0
- package/node_modules/@contora/state-core/dist/understanding/formatHandoff.d.ts +20 -0
- package/node_modules/@contora/state-core/dist/understanding/formatHandoff.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/formatHandoff.js +57 -0
- package/node_modules/@contora/state-core/dist/understanding/graphBuilder.d.ts +9 -0
- package/node_modules/@contora/state-core/dist/understanding/graphBuilder.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/graphBuilder.js +107 -0
- package/node_modules/@contora/state-core/dist/understanding/handoffBuilder.d.ts +12 -0
- package/node_modules/@contora/state-core/dist/understanding/handoffBuilder.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/handoffBuilder.js +101 -0
- package/node_modules/@contora/state-core/dist/understanding/impactAnalyzer.d.ts +5 -0
- package/node_modules/@contora/state-core/dist/understanding/impactAnalyzer.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/impactAnalyzer.js +58 -0
- package/node_modules/@contora/state-core/dist/understanding/intentFusion.d.ts +9 -0
- package/node_modules/@contora/state-core/dist/understanding/intentFusion.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/intentFusion.js +54 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.d.ts +24 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.js +33 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/confidence.d.ts +20 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/confidence.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/confidence.js +53 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/gitFrequency.d.ts +5 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/gitFrequency.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/gitFrequency.js +19 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.d.ts +13 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.js +101 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.d.ts +22 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.js +106 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/knowledgeGraphBuilder.d.ts +23 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/knowledgeGraphBuilder.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/knowledgeGraphBuilder.js +415 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/normalize.d.ts +11 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/normalize.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/normalize.js +136 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/rebuildTrigger.d.ts +13 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/rebuildTrigger.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/rebuildTrigger.js +34 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/snapshotBuilder.d.ts +17 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/snapshotBuilder.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/snapshotBuilder.js +73 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/store.d.ts +7 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/store.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/store.js +127 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/types.d.ts +116 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/types.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/types.js +6 -0
- package/node_modules/@contora/state-core/dist/understanding/miniGraph.d.ts +4 -0
- package/node_modules/@contora/state-core/dist/understanding/miniGraph.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/miniGraph.js +18 -0
- package/node_modules/@contora/state-core/dist/understanding/store.d.ts +24 -0
- package/node_modules/@contora/state-core/dist/understanding/store.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/store.js +243 -0
- package/node_modules/@contora/state-core/dist/understanding/symbolValidator.d.ts +9 -0
- package/node_modules/@contora/state-core/dist/understanding/symbolValidator.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/symbolValidator.js +51 -0
- package/node_modules/@contora/state-core/dist/understanding/timelineTracker.d.ts +3 -0
- package/node_modules/@contora/state-core/dist/understanding/timelineTracker.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/timelineTracker.js +129 -0
- package/node_modules/@contora/state-core/dist/understanding/treeSitterParser.d.ts +24 -0
- package/node_modules/@contora/state-core/dist/understanding/treeSitterParser.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/treeSitterParser.js +56 -0
- package/node_modules/@contora/state-core/dist/understanding/types.d.ts +136 -0
- package/node_modules/@contora/state-core/dist/understanding/types.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/types.js +5 -0
- package/node_modules/@contora/state-core/dist/understanding/understandingGraphBuilder.d.ts +23 -0
- package/node_modules/@contora/state-core/dist/understanding/understandingGraphBuilder.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/understanding/understandingGraphBuilder.js +67 -0
- package/node_modules/@contora/state-core/dist/version.d.ts +3 -0
- package/node_modules/@contora/state-core/dist/version.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/version.js +21 -0
- package/node_modules/@contora/state-core/dist/workspaceScanner.d.ts +4 -0
- package/node_modules/@contora/state-core/dist/workspaceScanner.d.ts.map +1 -0
- package/node_modules/@contora/state-core/dist/workspaceScanner.js +112 -0
- package/node_modules/@contora/state-core/package.json +49 -0
- package/package.json +61 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProjectGraph } from './types.js';
|
|
2
|
+
import type { ChangeArtifact } from './types.js';
|
|
3
|
+
import type { ImpactAnalysis } from './types.js';
|
|
4
|
+
export declare function analyzeImpact(graph: ProjectGraph, change: ChangeArtifact): ImpactAnalysis;
|
|
5
|
+
//# sourceMappingURL=impactAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impactAnalyzer.d.ts","sourceRoot":"","sources":["../../src/understanding/impactAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyBjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,cAAc,CA2CzF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeImpact = analyzeImpact;
|
|
4
|
+
const SENSITIVE_HINTS = /auth|password|token|secret|payment|security|credential|login|session/i;
|
|
5
|
+
function moduleOfSymbol(ref) {
|
|
6
|
+
const idx = ref.indexOf('::');
|
|
7
|
+
return idx >= 0 ? ref.slice(0, idx) : ref;
|
|
8
|
+
}
|
|
9
|
+
function fnNameOfSymbol(ref) {
|
|
10
|
+
const parts = ref.split('::');
|
|
11
|
+
return parts.length >= 2 ? parts[parts.length - 1] : ref;
|
|
12
|
+
}
|
|
13
|
+
function inferRisk(affectedCount, names) {
|
|
14
|
+
const sensitive = names.some((n) => SENSITIVE_HINTS.test(n));
|
|
15
|
+
if (sensitive || affectedCount >= 4) {
|
|
16
|
+
return 'high';
|
|
17
|
+
}
|
|
18
|
+
if (affectedCount >= 2) {
|
|
19
|
+
return 'medium';
|
|
20
|
+
}
|
|
21
|
+
return 'low';
|
|
22
|
+
}
|
|
23
|
+
function analyzeImpact(graph, change) {
|
|
24
|
+
const changedFnNames = new Set(change.key_changes.filter((k) => k.kind === 'function').map((k) => fnNameOfSymbol(k.symbol)));
|
|
25
|
+
const changedFnIds = new Set(graph.nodes
|
|
26
|
+
.filter((n) => n.kind === 'function' && changedFnNames.has(n.name))
|
|
27
|
+
.map((n) => n.id));
|
|
28
|
+
const callers = new Set();
|
|
29
|
+
for (const edge of graph.edges) {
|
|
30
|
+
if (edge.kind !== 'calls' || !changedFnIds.has(edge.to)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const node = graph.nodes.find((n) => n.id === edge.from);
|
|
34
|
+
if (node?.kind === 'function') {
|
|
35
|
+
callers.add(`${node.file}::${node.name}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const fnChanges = change.key_changes.filter((k) => k.kind === 'function').map((k) => k.symbol);
|
|
39
|
+
const affected_modules = [
|
|
40
|
+
...new Set([
|
|
41
|
+
...change.changed_files.map((f) => f.replace(/\\/g, '/')),
|
|
42
|
+
...[...callers].map(moduleOfSymbol),
|
|
43
|
+
]),
|
|
44
|
+
];
|
|
45
|
+
const affected_functions = [...callers];
|
|
46
|
+
const risk = inferRisk(affected_functions.length, [...fnChanges, ...affected_functions]);
|
|
47
|
+
const details = [];
|
|
48
|
+
if (fnChanges.length) {
|
|
49
|
+
details.push(`Changed functions: ${fnChanges.slice(0, 8).join(', ')}`);
|
|
50
|
+
}
|
|
51
|
+
if (affected_functions.length) {
|
|
52
|
+
details.push(`Direct callers: ${affected_functions.slice(0, 8).join(', ')}`);
|
|
53
|
+
}
|
|
54
|
+
else if (fnChanges.length) {
|
|
55
|
+
details.push('No direct callers detected in change neighborhood (MVP static scan).');
|
|
56
|
+
}
|
|
57
|
+
return { affected_functions, affected_modules, risk, details };
|
|
58
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BootstrapStateJson } from '../types.js';
|
|
2
|
+
import type { ChangeArtifact, IntentFusion } from './types.js';
|
|
3
|
+
import type { ProjectBuiltState } from '../state-builder/types.js';
|
|
4
|
+
export declare function fuseIntent(args: {
|
|
5
|
+
state: BootstrapStateJson;
|
|
6
|
+
change: ChangeArtifact;
|
|
7
|
+
built?: ProjectBuiltState | null;
|
|
8
|
+
}): IntentFusion;
|
|
9
|
+
//# sourceMappingURL=intentFusion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intentFusion.d.ts","sourceRoot":"","sources":["../../src/understanding/intentFusion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAuBnE,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC,GAAG,YAAY,CAiCf"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fuseIntent = fuseIntent;
|
|
4
|
+
const DOMAIN_HINTS = [
|
|
5
|
+
{ re: /packages\/mcp|\/mcp\//i, label: 'MCP server integration' },
|
|
6
|
+
{ re: /packages\/cli|\/cli\//i, label: 'CLI tooling' },
|
|
7
|
+
{ re: /packages\/state-core|state-builder|state-core/i, label: 'shared state engine' },
|
|
8
|
+
{ re: /extension|sidebar|vscode/i, label: 'IDE extension UI' },
|
|
9
|
+
{ re: /test|spec/i, label: 'testing' },
|
|
10
|
+
{ re: /docs?\//i, label: 'documentation' },
|
|
11
|
+
];
|
|
12
|
+
function inferDomainSignals(changedFiles) {
|
|
13
|
+
const signals = [];
|
|
14
|
+
for (const file of changedFiles) {
|
|
15
|
+
for (const hint of DOMAIN_HINTS) {
|
|
16
|
+
if (hint.re.test(file) && !signals.includes(hint.label)) {
|
|
17
|
+
signals.push(hint.label);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return signals;
|
|
22
|
+
}
|
|
23
|
+
function fuseIntent(args) {
|
|
24
|
+
const signals = inferDomainSignals(args.change.changed_files);
|
|
25
|
+
const goal = args.built?.project_goal?.trim() || args.state.currentTask.trim();
|
|
26
|
+
const stage = args.built?.current_stage?.trim();
|
|
27
|
+
let focus = goal || 'Continue current workspace task';
|
|
28
|
+
if (signals.length) {
|
|
29
|
+
focus = `${focus} — focus: ${signals.slice(0, 3).join(', ')}`;
|
|
30
|
+
}
|
|
31
|
+
else if (args.change.changed_files.length) {
|
|
32
|
+
const top = args.change.changed_files[0].split('/').pop() ?? args.change.changed_files[0];
|
|
33
|
+
focus = `${focus} — editing ${top}`;
|
|
34
|
+
}
|
|
35
|
+
if (stage) {
|
|
36
|
+
signals.push(`stage: ${stage}`);
|
|
37
|
+
}
|
|
38
|
+
let confidence = 0.45;
|
|
39
|
+
if (goal) {
|
|
40
|
+
confidence += 0.2;
|
|
41
|
+
}
|
|
42
|
+
if (signals.length) {
|
|
43
|
+
confidence += Math.min(0.25, signals.length * 0.08);
|
|
44
|
+
}
|
|
45
|
+
if (args.change.key_changes.length) {
|
|
46
|
+
confidence += 0.1;
|
|
47
|
+
}
|
|
48
|
+
confidence = Math.min(0.92, confidence);
|
|
49
|
+
return {
|
|
50
|
+
focus,
|
|
51
|
+
confidence: Math.round(confidence * 100) / 100,
|
|
52
|
+
signals,
|
|
53
|
+
};
|
|
54
|
+
}
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** V3.1 Final Engineering Closure — frozen thresholds (do not drift). */
|
|
2
|
+
export declare const CLOSURE_VERSION = "1";
|
|
3
|
+
/** Canonical graph: mappings/edges below this stay in inferenceMappings only. */
|
|
4
|
+
export declare const GRAPH_CANONICAL_MIN_CONFIDENCE = 0.7;
|
|
5
|
+
/** Unified confidence formula weights (semantic + temporal + git). */
|
|
6
|
+
export declare const CONFIDENCE_WEIGHT_SEMANTIC = 0.5;
|
|
7
|
+
export declare const CONFIDENCE_WEIGHT_TEMPORAL = 0.3;
|
|
8
|
+
export declare const CONFIDENCE_WEIGHT_GIT = 0.2;
|
|
9
|
+
/** Snapshot Top-N (compression projection from knowledge.json). */
|
|
10
|
+
export declare const SNAPSHOT_TOP_INTENTS = 5;
|
|
11
|
+
export declare const SNAPSHOT_TOP_HOTSPOTS = 10;
|
|
12
|
+
export declare const SNAPSHOT_TOP_FUNCTIONS = 10;
|
|
13
|
+
export declare const SNAPSHOT_TOP_NEXT_ACTIONS = 6;
|
|
14
|
+
/** Hotspot lifecycle score bands. */
|
|
15
|
+
export declare const HOTSPOT_SCORE_ACTIVE = 0.5;
|
|
16
|
+
export declare const HOTSPOT_SCORE_COOLING = 0.3;
|
|
17
|
+
/** Knowledge graph rebuild triggers. */
|
|
18
|
+
export declare const REBUILD_IDLE_MS = 60000;
|
|
19
|
+
export declare const REBUILD_FILE_THRESHOLD = 5;
|
|
20
|
+
/** Minimum raw mapping score before inference consideration. */
|
|
21
|
+
export declare const MAPPING_DISCOVERY_MIN_SCORE = 0.12;
|
|
22
|
+
/** Allowed L1/L2 sources for graph intents — L3 paths must never feed the builder. */
|
|
23
|
+
export declare const GRAPH_INTENT_SOURCE_ALLOWLIST: readonly ["state.currentTask", "built.project_goal", "built.active_modules", "built.next_actions", "change.changed_files", "intentFusion.focus"];
|
|
24
|
+
//# sourceMappingURL=closureConstants.d.ts.map
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closureConstants.d.ts","sourceRoot":"","sources":["../../../src/understanding/knowledgeGraph/closureConstants.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,iFAAiF;AACjF,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,wCAAwC;AACxC,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,gEAAgE;AAChE,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,sFAAsF;AACtF,eAAO,MAAM,6BAA6B,kJAOhC,CAAC"}
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** V3.1 Final Engineering Closure — frozen thresholds (do not drift). */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.GRAPH_INTENT_SOURCE_ALLOWLIST = exports.MAPPING_DISCOVERY_MIN_SCORE = exports.REBUILD_FILE_THRESHOLD = exports.REBUILD_IDLE_MS = exports.HOTSPOT_SCORE_COOLING = exports.HOTSPOT_SCORE_ACTIVE = exports.SNAPSHOT_TOP_NEXT_ACTIONS = exports.SNAPSHOT_TOP_FUNCTIONS = exports.SNAPSHOT_TOP_HOTSPOTS = exports.SNAPSHOT_TOP_INTENTS = exports.CONFIDENCE_WEIGHT_GIT = exports.CONFIDENCE_WEIGHT_TEMPORAL = exports.CONFIDENCE_WEIGHT_SEMANTIC = exports.GRAPH_CANONICAL_MIN_CONFIDENCE = exports.CLOSURE_VERSION = void 0;
|
|
5
|
+
exports.CLOSURE_VERSION = '1';
|
|
6
|
+
/** Canonical graph: mappings/edges below this stay in inferenceMappings only. */
|
|
7
|
+
exports.GRAPH_CANONICAL_MIN_CONFIDENCE = 0.7;
|
|
8
|
+
/** Unified confidence formula weights (semantic + temporal + git). */
|
|
9
|
+
exports.CONFIDENCE_WEIGHT_SEMANTIC = 0.5;
|
|
10
|
+
exports.CONFIDENCE_WEIGHT_TEMPORAL = 0.3;
|
|
11
|
+
exports.CONFIDENCE_WEIGHT_GIT = 0.2;
|
|
12
|
+
/** Snapshot Top-N (compression projection from knowledge.json). */
|
|
13
|
+
exports.SNAPSHOT_TOP_INTENTS = 5;
|
|
14
|
+
exports.SNAPSHOT_TOP_HOTSPOTS = 10;
|
|
15
|
+
exports.SNAPSHOT_TOP_FUNCTIONS = 10;
|
|
16
|
+
exports.SNAPSHOT_TOP_NEXT_ACTIONS = 6;
|
|
17
|
+
/** Hotspot lifecycle score bands. */
|
|
18
|
+
exports.HOTSPOT_SCORE_ACTIVE = 0.5;
|
|
19
|
+
exports.HOTSPOT_SCORE_COOLING = 0.3;
|
|
20
|
+
/** Knowledge graph rebuild triggers. */
|
|
21
|
+
exports.REBUILD_IDLE_MS = 60_000;
|
|
22
|
+
exports.REBUILD_FILE_THRESHOLD = 5;
|
|
23
|
+
/** Minimum raw mapping score before inference consideration. */
|
|
24
|
+
exports.MAPPING_DISCOVERY_MIN_SCORE = 0.12;
|
|
25
|
+
/** Allowed L1/L2 sources for graph intents — L3 paths must never feed the builder. */
|
|
26
|
+
exports.GRAPH_INTENT_SOURCE_ALLOWLIST = [
|
|
27
|
+
'state.currentTask',
|
|
28
|
+
'built.project_goal',
|
|
29
|
+
'built.active_modules',
|
|
30
|
+
'built.next_actions',
|
|
31
|
+
'change.changed_files',
|
|
32
|
+
'intentFusion.focus',
|
|
33
|
+
];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { IntentFunctionMapping, KnowledgeEdge } from './types.js';
|
|
2
|
+
export declare function clampConfidence(value: number): number;
|
|
3
|
+
/**
|
|
4
|
+
* Unified confidence (V3.1 Closure):
|
|
5
|
+
* clamp(0.5 * semantic + 0.3 * temporal + 0.2 * git, 0, 1)
|
|
6
|
+
*/
|
|
7
|
+
export declare function computeUnifiedConfidence(args: {
|
|
8
|
+
semanticSimilarity: number;
|
|
9
|
+
temporalRecency: number;
|
|
10
|
+
gitActivity: number;
|
|
11
|
+
}): number;
|
|
12
|
+
export declare function isCanonicalConfidence(confidence: number): boolean;
|
|
13
|
+
export declare function splitMappingsByCanonicalThreshold(mappings: IntentFunctionMapping[]): {
|
|
14
|
+
canonical: IntentFunctionMapping[];
|
|
15
|
+
inference: IntentFunctionMapping[];
|
|
16
|
+
};
|
|
17
|
+
/** Drop supports_intent edges whose confidence is below canonical threshold. */
|
|
18
|
+
export declare function filterCanonicalEdges(edges: KnowledgeEdge[]): KnowledgeEdge[];
|
|
19
|
+
export declare function confidenceBandLabel(confidence: number): string;
|
|
20
|
+
//# sourceMappingURL=confidence.d.ts.map
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/confidence.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.d.ts","sourceRoot":"","sources":["../../../src/understanding/knowledgeGraph/confidence.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAMT;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,qBAAqB,EAAE,GAChC;IAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC;IAAC,SAAS,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAW5E;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAI5E;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW9D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clampConfidence = clampConfidence;
|
|
4
|
+
exports.computeUnifiedConfidence = computeUnifiedConfidence;
|
|
5
|
+
exports.isCanonicalConfidence = isCanonicalConfidence;
|
|
6
|
+
exports.splitMappingsByCanonicalThreshold = splitMappingsByCanonicalThreshold;
|
|
7
|
+
exports.filterCanonicalEdges = filterCanonicalEdges;
|
|
8
|
+
exports.confidenceBandLabel = confidenceBandLabel;
|
|
9
|
+
const closureConstants_js_1 = require("./closureConstants.js");
|
|
10
|
+
function clampConfidence(value) {
|
|
11
|
+
return Math.round(Math.max(0, Math.min(1, value)) * 1000) / 1000;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Unified confidence (V3.1 Closure):
|
|
15
|
+
* clamp(0.5 * semantic + 0.3 * temporal + 0.2 * git, 0, 1)
|
|
16
|
+
*/
|
|
17
|
+
function computeUnifiedConfidence(args) {
|
|
18
|
+
return clampConfidence(closureConstants_js_1.CONFIDENCE_WEIGHT_SEMANTIC * args.semanticSimilarity +
|
|
19
|
+
closureConstants_js_1.CONFIDENCE_WEIGHT_TEMPORAL * args.temporalRecency +
|
|
20
|
+
closureConstants_js_1.CONFIDENCE_WEIGHT_GIT * args.gitActivity);
|
|
21
|
+
}
|
|
22
|
+
function isCanonicalConfidence(confidence) {
|
|
23
|
+
return confidence >= closureConstants_js_1.GRAPH_CANONICAL_MIN_CONFIDENCE;
|
|
24
|
+
}
|
|
25
|
+
function splitMappingsByCanonicalThreshold(mappings) {
|
|
26
|
+
const canonical = [];
|
|
27
|
+
const inference = [];
|
|
28
|
+
for (const m of mappings) {
|
|
29
|
+
if (isCanonicalConfidence(m.confidence)) {
|
|
30
|
+
canonical.push(m);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
inference.push(m);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { canonical, inference };
|
|
37
|
+
}
|
|
38
|
+
/** Drop supports_intent edges whose confidence is below canonical threshold. */
|
|
39
|
+
function filterCanonicalEdges(edges) {
|
|
40
|
+
return edges.filter((e) => e.type !== 'supports_intent' || isCanonicalConfidence(e.confidence));
|
|
41
|
+
}
|
|
42
|
+
function confidenceBandLabel(confidence) {
|
|
43
|
+
if (confidence >= 0.9) {
|
|
44
|
+
return 'strong';
|
|
45
|
+
}
|
|
46
|
+
if (confidence >= 0.7) {
|
|
47
|
+
return 'high';
|
|
48
|
+
}
|
|
49
|
+
if (confidence >= 0.5) {
|
|
50
|
+
return 'weak';
|
|
51
|
+
}
|
|
52
|
+
return 'excluded';
|
|
53
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BootstrapStateJson } from '../../types.js';
|
|
2
|
+
import type { ProjectTimeline } from '../types.js';
|
|
3
|
+
/** Git activity weights for Hotspot Layer — from timeline + state.json git paths. */
|
|
4
|
+
export declare function buildGitFrequency(timeline: ProjectTimeline | undefined, state: BootstrapStateJson): Map<string, number>;
|
|
5
|
+
//# sourceMappingURL=gitFrequency.d.ts.map
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/gitFrequency.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitFrequency.d.ts","sourceRoot":"","sources":["../../../src/understanding/knowledgeGraph/gitFrequency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,qFAAqF;AACrF,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,KAAK,EAAE,kBAAkB,GACxB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWrB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildGitFrequency = buildGitFrequency;
|
|
4
|
+
function norm(p) {
|
|
5
|
+
return p.replace(/\\/g, '/');
|
|
6
|
+
}
|
|
7
|
+
/** Git activity weights for Hotspot Layer — from timeline + state.json git paths. */
|
|
8
|
+
function buildGitFrequency(timeline, state) {
|
|
9
|
+
const freq = new Map();
|
|
10
|
+
for (const e of timeline?.recent ?? []) {
|
|
11
|
+
const f = norm(e.file);
|
|
12
|
+
freq.set(f, (freq.get(f) ?? 0) + 1);
|
|
13
|
+
}
|
|
14
|
+
for (const p of [...state.gitStaged, ...state.gitWorking]) {
|
|
15
|
+
const f = norm(p);
|
|
16
|
+
freq.set(f, (freq.get(f) ?? 0) + 2);
|
|
17
|
+
}
|
|
18
|
+
return freq;
|
|
19
|
+
}
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HotspotNode, IntentFunctionMapping, KnowledgeEdge, KnowledgeNode } from './types.js';
|
|
2
|
+
export interface HotspotBuildInput {
|
|
3
|
+
nodes: KnowledgeNode[];
|
|
4
|
+
edges: KnowledgeEdge[];
|
|
5
|
+
intentMappings: IntentFunctionMapping[];
|
|
6
|
+
editCounts: Map<string, number>;
|
|
7
|
+
gitFrequency: Map<string, number>;
|
|
8
|
+
now: number;
|
|
9
|
+
max?: number;
|
|
10
|
+
}
|
|
11
|
+
/** Hotspot Layer — activity scoring; AND gate + lifecycle (Closure §8). */
|
|
12
|
+
export declare function buildHotspots(input: HotspotBuildInput): HotspotNode[];
|
|
13
|
+
//# sourceMappingURL=hotspotBuilder.d.ts.map
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotspotBuilder.d.ts","sourceRoot":"","sources":["../../../src/understanding/knowledgeGraph/hotspotBuilder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AA6BpB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,cAAc,EAAE,qBAAqB,EAAE,CAAC;IACxC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,WAAW,EAAE,CAqGrE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildHotspots = buildHotspots;
|
|
4
|
+
const closureConstants_js_1 = require("./closureConstants.js");
|
|
5
|
+
function basename(p) {
|
|
6
|
+
return p.replace(/\\/g, '/').split('/').filter(Boolean).pop() ?? p;
|
|
7
|
+
}
|
|
8
|
+
function hotspotLifecycle(score) {
|
|
9
|
+
if (score >= closureConstants_js_1.HOTSPOT_SCORE_ACTIVE) {
|
|
10
|
+
return 'active';
|
|
11
|
+
}
|
|
12
|
+
if (score >= closureConstants_js_1.HOTSPOT_SCORE_COOLING) {
|
|
13
|
+
return 'cooling';
|
|
14
|
+
}
|
|
15
|
+
return 'stale';
|
|
16
|
+
}
|
|
17
|
+
/** Closure §8.2 — edit AND git AND intent (git waived when no git data). */
|
|
18
|
+
function hotspotQualifies(args) {
|
|
19
|
+
const hasEdit = args.editCount > 0;
|
|
20
|
+
const hasGit = !args.gitDataAvailable || args.gitCount > 0;
|
|
21
|
+
const hasIntent = args.intentLinks > 0;
|
|
22
|
+
return hasEdit && hasGit && hasIntent;
|
|
23
|
+
}
|
|
24
|
+
/** Hotspot Layer — activity scoring; AND gate + lifecycle (Closure §8). */
|
|
25
|
+
function buildHotspots(input) {
|
|
26
|
+
const gitDataAvailable = input.gitFrequency.size > 0;
|
|
27
|
+
const maxGit = Math.max(1, ...input.gitFrequency.values(), 1);
|
|
28
|
+
const maxEdits = Math.max(1, ...input.editCounts.values(), 1);
|
|
29
|
+
const fnNodes = input.nodes.filter((n) => n.type === 'function');
|
|
30
|
+
const fileNodes = input.nodes.filter((n) => n.type === 'file');
|
|
31
|
+
const intentLinksByFn = new Map();
|
|
32
|
+
for (const m of input.intentMappings) {
|
|
33
|
+
intentLinksByFn.set(m.functionId, (intentLinksByFn.get(m.functionId) ?? 0) + 1);
|
|
34
|
+
}
|
|
35
|
+
const depCount = (id) => input.edges.filter((e) => e.target === id && e.type === 'calls').length +
|
|
36
|
+
input.edges.filter((e) => e.source === id && e.type === 'calls').length;
|
|
37
|
+
const hotspots = [];
|
|
38
|
+
const consider = (args) => {
|
|
39
|
+
const editCount = input.editCounts.get(args.path) ?? 0;
|
|
40
|
+
const gitCount = input.gitFrequency.get(args.path) ?? 0;
|
|
41
|
+
if (!hotspotQualifies({
|
|
42
|
+
editCount,
|
|
43
|
+
gitCount,
|
|
44
|
+
intentLinks: args.intentLinks,
|
|
45
|
+
gitDataAvailable,
|
|
46
|
+
})) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const editFrequency = editCount / maxEdits;
|
|
50
|
+
const gitActivity = gitCount / maxGit;
|
|
51
|
+
const intentWeight = Math.min(1, args.intentLinks / 2);
|
|
52
|
+
const dependencyCount = args.fn ? depCount(args.fn.id) : 0;
|
|
53
|
+
const depNorm = Math.min(1, dependencyCount / 8);
|
|
54
|
+
const score = Math.round((editFrequency * 0.4 + gitActivity * 0.2 + intentWeight * 0.3 + depNorm * 0.1) * 1000) / 1000;
|
|
55
|
+
if (score < closureConstants_js_1.HOTSPOT_SCORE_COOLING) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
hotspots.push({
|
|
59
|
+
id: `hotspot_${args.targetKind}_${args.targetId}`,
|
|
60
|
+
type: 'hotspot',
|
|
61
|
+
targetId: args.targetId,
|
|
62
|
+
targetName: args.targetName,
|
|
63
|
+
targetKind: args.targetKind,
|
|
64
|
+
score,
|
|
65
|
+
lifecycle: hotspotLifecycle(score),
|
|
66
|
+
editFrequency: editCount,
|
|
67
|
+
gitActivity: gitCount,
|
|
68
|
+
intentLinks: args.intentLinks,
|
|
69
|
+
dependencyCount,
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
for (const file of fileNodes) {
|
|
73
|
+
const path = file.path ?? file.name;
|
|
74
|
+
const linkedFns = fnNodes.filter((f) => f.path === path);
|
|
75
|
+
const intentLinks = linkedFns.reduce((n, f) => n + (intentLinksByFn.get(f.id) ?? 0), 0);
|
|
76
|
+
consider({
|
|
77
|
+
file,
|
|
78
|
+
fn: undefined,
|
|
79
|
+
path,
|
|
80
|
+
targetId: file.id,
|
|
81
|
+
targetName: basename(path),
|
|
82
|
+
targetKind: 'file',
|
|
83
|
+
intentLinks,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
for (const fn of fnNodes.slice(0, 60)) {
|
|
87
|
+
const path = fn.path ?? '';
|
|
88
|
+
consider({
|
|
89
|
+
file: undefined,
|
|
90
|
+
fn,
|
|
91
|
+
path,
|
|
92
|
+
targetId: fn.id,
|
|
93
|
+
targetName: fn.name,
|
|
94
|
+
targetKind: 'function',
|
|
95
|
+
intentLinks: intentLinksByFn.get(fn.id) ?? 0,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return hotspots
|
|
99
|
+
.sort((a, b) => b.score - a.score)
|
|
100
|
+
.slice(0, input.max ?? closureConstants_js_1.SNAPSHOT_TOP_HOTSPOTS);
|
|
101
|
+
}
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IntentFunctionMapping } from './types.js';
|
|
2
|
+
declare function tokenize(text: string): string[];
|
|
3
|
+
declare function cosineSimilarity(a: string[], b: string[]): number;
|
|
4
|
+
export interface FunctionDescriptor {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
file: string;
|
|
8
|
+
moduleHint?: string;
|
|
9
|
+
callTargets?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface IntentDescriptor {
|
|
12
|
+
id: string;
|
|
13
|
+
text: string;
|
|
14
|
+
}
|
|
15
|
+
export interface MappingContext {
|
|
16
|
+
recentEditFiles?: Set<string>;
|
|
17
|
+
gitFrequency?: Map<string, number>;
|
|
18
|
+
}
|
|
19
|
+
/** Intent ↔ Function mapping — token similarity + recency + git frequency (V3.1). */
|
|
20
|
+
export declare function mapIntentsToFunctions(intents: IntentDescriptor[], functions: FunctionDescriptor[], ctx?: MappingContext): IntentFunctionMapping[];
|
|
21
|
+
export { tokenize, cosineSimilarity };
|
|
22
|
+
//# sourceMappingURL=intentFunctionMapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intentFunctionMapper.d.ts","sourceRoot":"","sources":["../../../src/understanding/knowledgeGraph/intentFunctionMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AASxD,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMxC;AAED,iBAAS,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CA6B1D;AAWD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,kBAAkB,EAAE,EAC/B,GAAG,GAAE,cAAmB,GACvB,qBAAqB,EAAE,CAmDzB;AAED,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC"}
|
package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapIntentsToFunctions = mapIntentsToFunctions;
|
|
4
|
+
exports.tokenize = tokenize;
|
|
5
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
6
|
+
const closureConstants_js_1 = require("./closureConstants.js");
|
|
7
|
+
const confidence_js_1 = require("./confidence.js");
|
|
8
|
+
const STOP = new Set([
|
|
9
|
+
'a', 'an', 'the', 'and', 'or', 'to', 'in', 'on', 'for', 'of', 'with', 'from',
|
|
10
|
+
'continue', 'current', 'workspace', 'task', 'focus', 'editing', 'stage',
|
|
11
|
+
]);
|
|
12
|
+
function tokenize(text) {
|
|
13
|
+
return text
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/[^a-z0-9_\u4e00-\u9fff]+/gi, ' ')
|
|
16
|
+
.split(/\s+/)
|
|
17
|
+
.filter((t) => t.length > 1 && !STOP.has(t));
|
|
18
|
+
}
|
|
19
|
+
function cosineSimilarity(a, b) {
|
|
20
|
+
if (!a.length || !b.length) {
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
const freqA = new Map();
|
|
24
|
+
const freqB = new Map();
|
|
25
|
+
for (const t of a) {
|
|
26
|
+
freqA.set(t, (freqA.get(t) ?? 0) + 1);
|
|
27
|
+
}
|
|
28
|
+
for (const t of b) {
|
|
29
|
+
freqB.set(t, (freqB.get(t) ?? 0) + 1);
|
|
30
|
+
}
|
|
31
|
+
let dot = 0;
|
|
32
|
+
let normA = 0;
|
|
33
|
+
let normB = 0;
|
|
34
|
+
for (const [, v] of freqA) {
|
|
35
|
+
normA += v * v;
|
|
36
|
+
}
|
|
37
|
+
for (const [, v] of freqB) {
|
|
38
|
+
normB += v * v;
|
|
39
|
+
}
|
|
40
|
+
for (const [k, v] of freqA) {
|
|
41
|
+
const w = freqB.get(k) ?? 0;
|
|
42
|
+
dot += v * w;
|
|
43
|
+
}
|
|
44
|
+
if (!normA || !normB) {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
48
|
+
}
|
|
49
|
+
function camelTokens(name) {
|
|
50
|
+
return name
|
|
51
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
52
|
+
.replace(/_/g, ' ')
|
|
53
|
+
.toLowerCase()
|
|
54
|
+
.split(/\s+/)
|
|
55
|
+
.filter((t) => t.length > 1);
|
|
56
|
+
}
|
|
57
|
+
/** Intent ↔ Function mapping — token similarity + recency + git frequency (V3.1). */
|
|
58
|
+
function mapIntentsToFunctions(intents, functions, ctx = {}) {
|
|
59
|
+
const recent = ctx.recentEditFiles ?? new Set();
|
|
60
|
+
const gitFreq = ctx.gitFrequency ?? new Map();
|
|
61
|
+
const maxGit = Math.max(1, ...gitFreq.values(), 1);
|
|
62
|
+
const out = [];
|
|
63
|
+
for (const intent of intents) {
|
|
64
|
+
const intentTokens = tokenize(intent.text);
|
|
65
|
+
for (const fn of functions) {
|
|
66
|
+
const fnTokens = [
|
|
67
|
+
...tokenize(fn.name),
|
|
68
|
+
...camelTokens(fn.name),
|
|
69
|
+
...tokenize(fn.file.split('/').pop() ?? fn.file),
|
|
70
|
+
...(fn.moduleHint ? tokenize(fn.moduleHint) : []),
|
|
71
|
+
...(fn.callTargets ?? []).flatMap((c) => [...tokenize(c), ...camelTokens(c)]),
|
|
72
|
+
];
|
|
73
|
+
const similarity = cosineSimilarity(intentTokens, fnTokens);
|
|
74
|
+
const fileNorm = fn.file.replace(/\\/g, '/');
|
|
75
|
+
const recentEdit = recent.has(fileNorm) ? 1 : 0;
|
|
76
|
+
const gitScore = (gitFreq.get(fileNorm) ?? 0) / maxGit;
|
|
77
|
+
const confidence = (0, confidence_js_1.computeUnifiedConfidence)({
|
|
78
|
+
semanticSimilarity: similarity,
|
|
79
|
+
temporalRecency: recentEdit,
|
|
80
|
+
gitActivity: gitScore,
|
|
81
|
+
});
|
|
82
|
+
const score = confidence;
|
|
83
|
+
if (score < closureConstants_js_1.MAPPING_DISCOVERY_MIN_SCORE) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const signals = [];
|
|
87
|
+
if (similarity >= 0.2) {
|
|
88
|
+
signals.push(`token match ${Math.round(similarity * 100)}%`);
|
|
89
|
+
}
|
|
90
|
+
if (recentEdit) {
|
|
91
|
+
signals.push('recent edit');
|
|
92
|
+
}
|
|
93
|
+
if (gitScore > 0.1) {
|
|
94
|
+
signals.push('git activity');
|
|
95
|
+
}
|
|
96
|
+
out.push({
|
|
97
|
+
intentId: intent.id,
|
|
98
|
+
functionId: fn.id,
|
|
99
|
+
score,
|
|
100
|
+
confidence,
|
|
101
|
+
signals,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return out.sort((a, b) => b.score - a.score).slice(0, 48);
|
|
106
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ProjectBuiltState } from '../../state-builder/types.js';
|
|
2
|
+
import type { ChangeArtifact, IntentFusion, ProjectGraph } from '../types.js';
|
|
3
|
+
import type { ProjectKnowledgeGraph } from './types.js';
|
|
4
|
+
export interface KnowledgeGraphBuildInput {
|
|
5
|
+
graph: ProjectGraph;
|
|
6
|
+
change: ChangeArtifact;
|
|
7
|
+
intent: IntentFusion;
|
|
8
|
+
built?: ProjectBuiltState | null;
|
|
9
|
+
goal: string;
|
|
10
|
+
workspaceRoot?: string;
|
|
11
|
+
sourceVersion?: string;
|
|
12
|
+
now?: number;
|
|
13
|
+
editCounts?: Map<string, number>;
|
|
14
|
+
gitFrequency?: Map<string, number>;
|
|
15
|
+
rebuildTrigger?: string;
|
|
16
|
+
lastCommitHash?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build Project Knowledge Graph from L1/L2 sources only.
|
|
20
|
+
* L3 (intelligence / intent-graph / AI speculation) must never feed this builder.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildProjectKnowledgeGraph(input: KnowledgeGraphBuildInput): ProjectKnowledgeGraph;
|
|
23
|
+
//# sourceMappingURL=knowledgeGraphBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledgeGraphBuilder.d.ts","sourceRoot":"","sources":["../../../src/understanding/knowledgeGraph/knowledgeGraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW9E,OAAO,KAAK,EAKV,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AAwQpB,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,wBAAwB,GAAG,qBAAqB,CA4MjG"}
|