@dewtech/dare-cli 3.9.0 → 3.11.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.
- package/README.md +5 -0
- package/dist/__tests__/ci-pr-regression.test.d.ts +2 -0
- package/dist/__tests__/ci-pr-regression.test.d.ts.map +1 -0
- package/dist/__tests__/ci-pr-regression.test.js +76 -0
- package/dist/__tests__/ci-pr-regression.test.js.map +1 -0
- package/dist/__tests__/dashboard-front.test.d.ts +2 -0
- package/dist/__tests__/dashboard-front.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-front.test.js +37 -0
- package/dist/__tests__/dashboard-front.test.js.map +1 -0
- package/dist/__tests__/dashboard-regression.test.d.ts +2 -0
- package/dist/__tests__/dashboard-regression.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-regression.test.js +68 -0
- package/dist/__tests__/dashboard-regression.test.js.map +1 -0
- package/dist/__tests__/drift-regression.test.d.ts +2 -0
- package/dist/__tests__/drift-regression.test.d.ts.map +1 -0
- package/dist/__tests__/drift-regression.test.js +118 -0
- package/dist/__tests__/drift-regression.test.js.map +1 -0
- package/dist/__tests__/dynamic-dag-regression.test.d.ts +2 -0
- package/dist/__tests__/dynamic-dag-regression.test.d.ts.map +1 -0
- package/dist/__tests__/dynamic-dag-regression.test.js +464 -0
- package/dist/__tests__/dynamic-dag-regression.test.js.map +1 -0
- package/dist/__tests__/ide-command-parity.test.js +1 -0
- package/dist/__tests__/ide-command-parity.test.js.map +1 -1
- package/dist/__tests__/project-generator.test.js +10 -1
- package/dist/__tests__/project-generator.test.js.map +1 -1
- package/dist/__tests__/semantic-regression.test.d.ts +2 -0
- package/dist/__tests__/semantic-regression.test.d.ts.map +1 -0
- package/dist/__tests__/semantic-regression.test.js +248 -0
- package/dist/__tests__/semantic-regression.test.js.map +1 -0
- package/dist/bin/dare.js +2 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/__tests__/dashboard-command.test.d.ts +2 -0
- package/dist/commands/__tests__/dashboard-command.test.d.ts.map +1 -0
- package/dist/commands/__tests__/dashboard-command.test.js +62 -0
- package/dist/commands/__tests__/dashboard-command.test.js.map +1 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js +3 -0
- package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -1
- package/dist/commands/__tests__/gate-flags.test.d.ts +2 -0
- package/dist/commands/__tests__/gate-flags.test.d.ts.map +1 -0
- package/dist/commands/__tests__/gate-flags.test.js +58 -0
- package/dist/commands/__tests__/gate-flags.test.js.map +1 -0
- package/dist/commands/__tests__/graph-drift.test.d.ts +2 -0
- package/dist/commands/__tests__/graph-drift.test.d.ts.map +1 -0
- package/dist/commands/__tests__/graph-drift.test.js +169 -0
- package/dist/commands/__tests__/graph-drift.test.js.map +1 -0
- package/dist/commands/__tests__/persist-viz.test.d.ts +2 -0
- package/dist/commands/__tests__/persist-viz.test.d.ts.map +1 -0
- package/dist/commands/__tests__/persist-viz.test.js +178 -0
- package/dist/commands/__tests__/persist-viz.test.js.map +1 -0
- package/dist/commands/__tests__/refine-apply.test.d.ts +2 -0
- package/dist/commands/__tests__/refine-apply.test.d.ts.map +1 -0
- package/dist/commands/__tests__/refine-apply.test.js +118 -0
- package/dist/commands/__tests__/refine-apply.test.js.map +1 -0
- package/dist/commands/__tests__/replan-splice.test.d.ts +2 -0
- package/dist/commands/__tests__/replan-splice.test.d.ts.map +1 -0
- package/dist/commands/__tests__/replan-splice.test.js +295 -0
- package/dist/commands/__tests__/replan-splice.test.js.map +1 -0
- package/dist/commands/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +2 -0
- package/dist/commands/dag.js.map +1 -1
- package/dist/commands/dashboard.d.ts +17 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +77 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +117 -2
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +232 -1
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/guard.d.ts.map +1 -1
- package/dist/commands/guard.js +27 -3
- package/dist/commands/guard.js.map +1 -1
- package/dist/commands/refine.d.ts +2 -0
- package/dist/commands/refine.d.ts.map +1 -1
- package/dist/commands/refine.js +71 -20
- package/dist/commands/refine.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +36 -5
- package/dist/commands/review.js.map +1 -1
- package/dist/dag-runner/__tests__/maxdepth-config.test.d.ts +2 -0
- package/dist/dag-runner/__tests__/maxdepth-config.test.d.ts.map +1 -0
- package/dist/dag-runner/__tests__/maxdepth-config.test.js +28 -0
- package/dist/dag-runner/__tests__/maxdepth-config.test.js.map +1 -0
- package/dist/dag-runner/__tests__/sub-dag.test.d.ts +2 -0
- package/dist/dag-runner/__tests__/sub-dag.test.d.ts.map +1 -0
- package/dist/dag-runner/__tests__/sub-dag.test.js +127 -0
- package/dist/dag-runner/__tests__/sub-dag.test.js.map +1 -0
- package/dist/dag-runner/graph-ingest.d.ts.map +1 -1
- package/dist/dag-runner/graph-ingest.js +13 -7
- package/dist/dag-runner/graph-ingest.js.map +1 -1
- package/dist/dag-runner/run_dag.d.ts +2 -0
- package/dist/dag-runner/run_dag.d.ts.map +1 -1
- package/dist/dag-runner/run_dag.js.map +1 -1
- package/dist/dag-runner/state-store.d.ts +2 -0
- package/dist/dag-runner/state-store.d.ts.map +1 -1
- package/dist/dag-runner/state-store.js +44 -8
- package/dist/dag-runner/state-store.js.map +1 -1
- package/dist/dag-runner/sub-dag.d.ts +23 -0
- package/dist/dag-runner/sub-dag.d.ts.map +1 -0
- package/dist/dag-runner/sub-dag.js +117 -0
- package/dist/dag-runner/sub-dag.js.map +1 -0
- package/dist/dashboard/__tests__/dashboard-routes.test.d.ts +2 -0
- package/dist/dashboard/__tests__/dashboard-routes.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/dashboard-routes.test.js +102 -0
- package/dist/dashboard/__tests__/dashboard-routes.test.js.map +1 -0
- package/dist/dashboard/routes.d.ts +8 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +70 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/graphrag/__tests__/drift-config.test.d.ts +2 -0
- package/dist/graphrag/__tests__/drift-config.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/drift-config.test.js +33 -0
- package/dist/graphrag/__tests__/drift-config.test.js.map +1 -0
- package/dist/graphrag/__tests__/drift.test.d.ts +2 -0
- package/dist/graphrag/__tests__/drift.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/drift.test.js +152 -0
- package/dist/graphrag/__tests__/drift.test.js.map +1 -0
- package/dist/graphrag/__tests__/hybrid-integration.test.d.ts +2 -0
- package/dist/graphrag/__tests__/hybrid-integration.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/hybrid-integration.test.js +158 -0
- package/dist/graphrag/__tests__/hybrid-integration.test.js.map +1 -0
- package/dist/graphrag/__tests__/hybrid.test.d.ts +2 -0
- package/dist/graphrag/__tests__/hybrid.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/hybrid.test.js +71 -0
- package/dist/graphrag/__tests__/hybrid.test.js.map +1 -0
- package/dist/graphrag/__tests__/incremental-index.test.d.ts +2 -0
- package/dist/graphrag/__tests__/incremental-index.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/incremental-index.test.js +135 -0
- package/dist/graphrag/__tests__/incremental-index.test.js.map +1 -0
- package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.d.ts +2 -0
- package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.js +48 -0
- package/dist/graphrag/__tests__/no-heavy-dep-in-core.test.js.map +1 -0
- package/dist/graphrag/__tests__/requirement-hash.test.d.ts +2 -0
- package/dist/graphrag/__tests__/requirement-hash.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/requirement-hash.test.js +74 -0
- package/dist/graphrag/__tests__/requirement-hash.test.js.map +1 -0
- package/dist/graphrag/__tests__/semantic-config.test.d.ts +2 -0
- package/dist/graphrag/__tests__/semantic-config.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/semantic-config.test.js +39 -0
- package/dist/graphrag/__tests__/semantic-config.test.js.map +1 -0
- package/dist/graphrag/__tests__/vector-persistence.test.d.ts +2 -0
- package/dist/graphrag/__tests__/vector-persistence.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/vector-persistence.test.js +112 -0
- package/dist/graphrag/__tests__/vector-persistence.test.js.map +1 -0
- package/dist/graphrag/__tests__/vector-search.test.d.ts +2 -0
- package/dist/graphrag/__tests__/vector-search.test.d.ts.map +1 -0
- package/dist/graphrag/__tests__/vector-search.test.js +36 -0
- package/dist/graphrag/__tests__/vector-search.test.js.map +1 -0
- package/dist/graphrag/drift.d.ts +22 -0
- package/dist/graphrag/drift.d.ts.map +1 -0
- package/dist/graphrag/drift.js +204 -0
- package/dist/graphrag/drift.js.map +1 -0
- package/dist/graphrag/embeddings.d.ts +15 -0
- package/dist/graphrag/embeddings.d.ts.map +1 -0
- package/dist/graphrag/embeddings.js +107 -0
- package/dist/graphrag/embeddings.js.map +1 -0
- package/dist/graphrag/graph-rag.d.ts +17 -1
- package/dist/graphrag/graph-rag.d.ts.map +1 -1
- package/dist/graphrag/graph-rag.js +170 -2
- package/dist/graphrag/graph-rag.js.map +1 -1
- package/dist/graphrag/hybrid.d.ts +8 -0
- package/dist/graphrag/hybrid.d.ts.map +1 -0
- package/dist/graphrag/hybrid.js +203 -0
- package/dist/graphrag/hybrid.js.map +1 -0
- package/dist/graphrag/incremental-index.d.ts +18 -0
- package/dist/graphrag/incremental-index.d.ts.map +1 -0
- package/dist/graphrag/incremental-index.js +159 -0
- package/dist/graphrag/incremental-index.js.map +1 -0
- package/dist/graphrag/index.d.ts +1 -1
- package/dist/graphrag/index.d.ts.map +1 -1
- package/dist/graphrag/json-graph.d.ts +2 -1
- package/dist/graphrag/json-graph.d.ts.map +1 -1
- package/dist/graphrag/json-graph.js +14 -0
- package/dist/graphrag/json-graph.js.map +1 -1
- package/dist/graphrag/knowledge-graph.d.ts +5 -0
- package/dist/graphrag/knowledge-graph.d.ts.map +1 -1
- package/dist/graphrag/neo4j-graph.d.ts +2 -1
- package/dist/graphrag/neo4j-graph.d.ts.map +1 -1
- package/dist/graphrag/neo4j-graph.js +40 -5
- package/dist/graphrag/neo4j-graph.js.map +1 -1
- package/dist/graphrag/requirement-ingest.d.ts +4 -1
- package/dist/graphrag/requirement-ingest.d.ts.map +1 -1
- package/dist/graphrag/requirement-ingest.js +18 -8
- package/dist/graphrag/requirement-ingest.js.map +1 -1
- package/dist/graphrag/types.d.ts +1 -0
- package/dist/graphrag/types.d.ts.map +1 -1
- package/dist/graphrag/vector-search.d.ts +10 -0
- package/dist/graphrag/vector-search.d.ts.map +1 -0
- package/dist/graphrag/vector-search.js +38 -0
- package/dist/graphrag/vector-search.js.map +1 -0
- package/dist/http/__tests__/shared-app.test.d.ts +2 -0
- package/dist/http/__tests__/shared-app.test.d.ts.map +1 -0
- package/dist/http/__tests__/shared-app.test.js +57 -0
- package/dist/http/__tests__/shared-app.test.js.map +1 -0
- package/dist/http/app.d.ts +15 -0
- package/dist/http/app.d.ts.map +1 -0
- package/dist/http/app.js +32 -0
- package/dist/http/app.js.map +1 -0
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +13 -16
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/reporters/__tests__/github-reporter.test.d.ts +2 -0
- package/dist/reporters/__tests__/github-reporter.test.d.ts.map +1 -0
- package/dist/reporters/__tests__/github-reporter.test.js +93 -0
- package/dist/reporters/__tests__/github-reporter.test.js.map +1 -0
- package/dist/reporters/ci-gate.d.ts +27 -0
- package/dist/reporters/ci-gate.d.ts.map +1 -0
- package/dist/reporters/ci-gate.js +100 -0
- package/dist/reporters/ci-gate.js.map +1 -0
- package/dist/reporters/github.d.ts +36 -0
- package/dist/reporters/github.d.ts.map +1 -0
- package/dist/reporters/github.js +142 -0
- package/dist/reporters/github.js.map +1 -0
- package/dist/telemetry/__tests__/aggregator.test.d.ts +2 -0
- package/dist/telemetry/__tests__/aggregator.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/aggregator.test.js +164 -0
- package/dist/telemetry/__tests__/aggregator.test.js.map +1 -0
- package/dist/telemetry/aggregator.d.ts +43 -0
- package/dist/telemetry/aggregator.d.ts.map +1 -0
- package/dist/telemetry/aggregator.js +282 -0
- package/dist/telemetry/aggregator.js.map +1 -0
- package/dist/utils/UpdateApplier.d.ts.map +1 -1
- package/dist/utils/UpdateApplier.js +3 -1
- package/dist/utils/UpdateApplier.js.map +1 -1
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
- package/dist/utils/excalidraw-renderer.js +1 -0
- package/dist/utils/excalidraw-renderer.js.map +1 -1
- package/dist/utils/graph-renderer.d.ts +2 -0
- package/dist/utils/graph-renderer.d.ts.map +1 -1
- package/dist/utils/graph-renderer.js +188 -14
- package/dist/utils/graph-renderer.js.map +1 -1
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +34 -5
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/verification/__tests__/decay-policy.test.js +1 -0
- package/dist/verification/__tests__/decay-policy.test.js.map +1 -1
- package/dist/verification/__tests__/telemetry.test.js +3 -0
- package/dist/verification/__tests__/telemetry.test.js.map +1 -1
- package/dist/verification/config.d.ts +82 -0
- package/dist/verification/config.d.ts.map +1 -1
- package/dist/verification/config.js +148 -0
- package/dist/verification/config.js.map +1 -1
- package/dist/verification/types.d.ts +2 -0
- package/dist/verification/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/templates/.github/workflows/dare-pr.yml +26 -0
- package/templates/dashboard/app.js +184 -0
- package/templates/dashboard/index.html +63 -0
- package/templates/dashboard/style.css +134 -0
- package/templates/ide/antigravity/.agents/skills/dare-dashboard/SKILL.md +18 -0
- package/templates/ide/claude/.claude/commands/dare-dashboard.md +18 -0
- package/templates/ide/cursor/.cursor/commands/dare-dashboard.md +18 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
6
|
+
import { JsonGraph } from '../json-graph.js';
|
|
7
|
+
import { ingestRequirements } from '../requirement-ingest.js';
|
|
8
|
+
const cleanupRoots = [];
|
|
9
|
+
async function ingestAndGetRequirement(content, ingestedAt) {
|
|
10
|
+
const projectRoot = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'req-hash-'));
|
|
11
|
+
cleanupRoots.push(projectRoot);
|
|
12
|
+
await fs.promises.mkdir(path.join(projectRoot, 'DARE'));
|
|
13
|
+
await fs.promises.writeFile(path.join(projectRoot, 'DARE', 'BLUEPRINT-sample.md'), content, 'utf8');
|
|
14
|
+
const graph = new JsonGraph(path.join(projectRoot, '.dare', 'graph.json'));
|
|
15
|
+
await graph.init();
|
|
16
|
+
ingestRequirements(graph, projectRoot, { ingestedAt });
|
|
17
|
+
const node = graph.getNode('requirement:RF-01');
|
|
18
|
+
graph.close();
|
|
19
|
+
return node;
|
|
20
|
+
}
|
|
21
|
+
describe('requirement-hash', () => {
|
|
22
|
+
afterEach(async () => {
|
|
23
|
+
for (const root of cleanupRoots.splice(0, cleanupRoots.length)) {
|
|
24
|
+
await fs.promises.rm(root, { recursive: true, force: true });
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it('writes_contentHash_on_requirement', async () => {
|
|
28
|
+
const fixedIngestedAt = '2026-01-01T00:00:00.000Z';
|
|
29
|
+
const content = `
|
|
30
|
+
| ID | Requirement |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| RF-01 | Auth MUST |
|
|
33
|
+
`;
|
|
34
|
+
const node = await ingestAndGetRequirement(content, fixedIngestedAt);
|
|
35
|
+
const metadata = node?.metadata;
|
|
36
|
+
const expectedHash = createHash('sha256').update('Auth MUST').digest('hex');
|
|
37
|
+
expect(metadata?.contentHash).toBe(expectedHash);
|
|
38
|
+
expect(metadata?.ingestedAt).toBe(fixedIngestedAt);
|
|
39
|
+
});
|
|
40
|
+
it('hash_is_stable', async () => {
|
|
41
|
+
const content = `
|
|
42
|
+
| ID | Requirement |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| RF-01 | Deterministic text |
|
|
45
|
+
`;
|
|
46
|
+
const firstNode = await ingestAndGetRequirement(content, '2026-01-01T00:00:00.000Z');
|
|
47
|
+
const secondNode = await ingestAndGetRequirement(content, '2026-01-02T00:00:00.000Z');
|
|
48
|
+
const firstHash = firstNode?.metadata?.contentHash;
|
|
49
|
+
const secondHash = secondNode?.metadata?.contentHash;
|
|
50
|
+
expect(firstHash).toBeTruthy();
|
|
51
|
+
expect(secondHash).toBeTruthy();
|
|
52
|
+
expect(firstHash).toBe(secondHash);
|
|
53
|
+
});
|
|
54
|
+
it('hash_changes_with_text', async () => {
|
|
55
|
+
const firstContent = `
|
|
56
|
+
| ID | Requirement |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| RF-01 | Requirement text A |
|
|
59
|
+
`;
|
|
60
|
+
const secondContent = `
|
|
61
|
+
| ID | Requirement |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| RF-01 | Requirement text B |
|
|
64
|
+
`;
|
|
65
|
+
const firstNode = await ingestAndGetRequirement(firstContent);
|
|
66
|
+
const secondNode = await ingestAndGetRequirement(secondContent);
|
|
67
|
+
const firstHash = firstNode?.metadata?.contentHash;
|
|
68
|
+
const secondHash = secondNode?.metadata?.contentHash;
|
|
69
|
+
expect(firstHash).toBeTruthy();
|
|
70
|
+
expect(secondHash).toBeTruthy();
|
|
71
|
+
expect(firstHash).not.toBe(secondHash);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=requirement-hash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement-hash.test.js","sourceRoot":"","sources":["../../../src/graphrag/__tests__/requirement-hash.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-config.test.d.ts","sourceRoot":"","sources":["../../../src/graphrag/__tests__/semantic-config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { defaultSemanticConfigForProject, parseSemanticConfig, SemanticConfigError, } from '../../verification/config.js';
|
|
3
|
+
describe('parseSemanticConfig', () => {
|
|
4
|
+
it('defaults_when_absent', () => {
|
|
5
|
+
expect(parseSemanticConfig({})).toEqual(defaultSemanticConfigForProject());
|
|
6
|
+
expect(parseSemanticConfig(undefined).enabled).toBe(false);
|
|
7
|
+
expect(parseSemanticConfig(undefined).rrfK).toBe(60);
|
|
8
|
+
});
|
|
9
|
+
it('parses_full_block', () => {
|
|
10
|
+
const cfg = parseSemanticConfig({
|
|
11
|
+
graphrag: {
|
|
12
|
+
backend: 'sqlite',
|
|
13
|
+
semantic: {
|
|
14
|
+
enabled: true,
|
|
15
|
+
model: 'all-MiniLM-L12-v2',
|
|
16
|
+
modelHash: 'sha256:abc123',
|
|
17
|
+
rrfK: 75,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
expect(cfg.enabled).toBe(true);
|
|
22
|
+
expect(cfg.model).toBe('all-MiniLM-L12-v2');
|
|
23
|
+
expect(cfg.modelHash).toBe('sha256:abc123');
|
|
24
|
+
expect(cfg.rrfK).toBe(75);
|
|
25
|
+
});
|
|
26
|
+
it('rejects_non_positive_rrfK', () => {
|
|
27
|
+
expect(() => parseSemanticConfig({
|
|
28
|
+
graphrag: {
|
|
29
|
+
semantic: { rrfK: 0 },
|
|
30
|
+
},
|
|
31
|
+
})).toThrow(SemanticConfigError);
|
|
32
|
+
expect(() => parseSemanticConfig({
|
|
33
|
+
graphrag: {
|
|
34
|
+
semantic: { rrfK: -1 },
|
|
35
|
+
},
|
|
36
|
+
})).toThrow(SemanticConfigError);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=semantic-config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-config.test.js","sourceRoot":"","sources":["../../../src/graphrag/__tests__/semantic-config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,+BAA+B,EAC/B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,QAAQ,EAAE;gBACR,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE;oBACR,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE,mBAAmB;oBAC1B,SAAS,EAAE,eAAe;oBAC1B,IAAI,EAAE,EAAE;iBACT;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,GAAG,EAAE,CACV,mBAAmB,CAAC;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;aACtB;SACF,CAAC,CACH,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAE/B,MAAM,CAAC,GAAG,EAAE,CACV,mBAAmB,CAAC;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACvB;SACF,CAAC,CACH,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-persistence.test.d.ts","sourceRoot":"","sources":["../../../src/graphrag/__tests__/vector-persistence.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { GraphRAG } from '../graph-rag.js';
|
|
6
|
+
import { JsonGraph } from '../json-graph.js';
|
|
7
|
+
const BACKENDS = [
|
|
8
|
+
{ name: 'sqlite', extension: 'db', create: (filePath) => new GraphRAG(filePath) },
|
|
9
|
+
{ name: 'json', extension: 'json', create: (filePath) => new JsonGraph(filePath) },
|
|
10
|
+
];
|
|
11
|
+
function tempPath(prefix, extension) {
|
|
12
|
+
const suffix = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
13
|
+
return path.join(os.tmpdir(), `${prefix}-${suffix}.${extension}`);
|
|
14
|
+
}
|
|
15
|
+
function expectVectorClose(actual, expected) {
|
|
16
|
+
expect(actual.length).toBe(expected.length);
|
|
17
|
+
for (let index = 0; index < expected.length; index++) {
|
|
18
|
+
expect(actual[index]).toBeCloseTo(expected[index] ?? 0, 5);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
describe('vector-persistence', () => {
|
|
22
|
+
it('roundtrip_float32', async () => {
|
|
23
|
+
const expected = [0.125, -2.5, Math.PI, 42.25];
|
|
24
|
+
for (const backend of BACKENDS) {
|
|
25
|
+
const filePath = tempPath(`vector-roundtrip-${backend.name}`, backend.extension);
|
|
26
|
+
const graph = backend.create(filePath);
|
|
27
|
+
try {
|
|
28
|
+
await graph.init();
|
|
29
|
+
graph.addNode({
|
|
30
|
+
id: `concept:${backend.name}-vector`,
|
|
31
|
+
type: 'concept',
|
|
32
|
+
label: `vector-${backend.name}`,
|
|
33
|
+
vector: expected,
|
|
34
|
+
});
|
|
35
|
+
await Promise.resolve(graph.close());
|
|
36
|
+
const reopened = backend.create(filePath);
|
|
37
|
+
try {
|
|
38
|
+
await reopened.init();
|
|
39
|
+
const vectors = reopened.loadVectors();
|
|
40
|
+
expect(vectors).toHaveLength(1);
|
|
41
|
+
expect(vectors[0]?.id).toBe(`concept:${backend.name}-vector`);
|
|
42
|
+
expectVectorClose(vectors[0].v, expected);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await Promise.resolve(reopened.close());
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await fs.remove(filePath).catch(() => undefined);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it('node_without_vector_is_valid', async () => {
|
|
54
|
+
for (const backend of BACKENDS) {
|
|
55
|
+
const filePath = tempPath(`vector-compat-${backend.name}`, backend.extension);
|
|
56
|
+
const graph = backend.create(filePath);
|
|
57
|
+
try {
|
|
58
|
+
await graph.init();
|
|
59
|
+
graph.addNode({
|
|
60
|
+
id: `task:${backend.name}-legacy`,
|
|
61
|
+
type: 'task',
|
|
62
|
+
label: 'legacy-node',
|
|
63
|
+
});
|
|
64
|
+
expect(graph.getNode(`task:${backend.name}-legacy`)).not.toBeNull();
|
|
65
|
+
expect(graph.loadVectors()).toEqual([]);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await Promise.resolve(graph.close());
|
|
69
|
+
await fs.remove(filePath).catch(() => undefined);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
it('export_import_preserves_vector', async () => {
|
|
74
|
+
const sourcePath = tempPath('vector-export-source', 'db');
|
|
75
|
+
const targetPath = tempPath('vector-export-target', 'json');
|
|
76
|
+
const expected = [0.5, 1.5, -3.25];
|
|
77
|
+
const source = new GraphRAG(sourcePath);
|
|
78
|
+
const target = new JsonGraph(targetPath);
|
|
79
|
+
try {
|
|
80
|
+
await source.init();
|
|
81
|
+
source.addNode({
|
|
82
|
+
id: 'concept:portable-vector',
|
|
83
|
+
type: 'concept',
|
|
84
|
+
label: 'portable',
|
|
85
|
+
vector: expected,
|
|
86
|
+
});
|
|
87
|
+
source.addNode({
|
|
88
|
+
id: 'task:without-vector',
|
|
89
|
+
type: 'task',
|
|
90
|
+
label: 'no-vector',
|
|
91
|
+
});
|
|
92
|
+
const exported = source.exportToJson();
|
|
93
|
+
await target.init();
|
|
94
|
+
target.importFromJson(exported);
|
|
95
|
+
const restored = target.getNode('concept:portable-vector');
|
|
96
|
+
expect(restored).not.toBeNull();
|
|
97
|
+
expect(Array.isArray(restored?.vector)).toBe(true);
|
|
98
|
+
expectVectorClose(new Float32Array(restored?.vector ?? []), expected);
|
|
99
|
+
const vectors = target.loadVectors();
|
|
100
|
+
expect(vectors).toHaveLength(1);
|
|
101
|
+
expect(vectors[0]?.id).toBe('concept:portable-vector');
|
|
102
|
+
expectVectorClose(vectors[0].v, expected);
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
await Promise.resolve(source.close());
|
|
106
|
+
await Promise.resolve(target.close());
|
|
107
|
+
await fs.remove(sourcePath).catch(() => undefined);
|
|
108
|
+
await fs.remove(targetPath).catch(() => undefined);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=vector-persistence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-persistence.test.js","sourceRoot":"","sources":["../../../src/graphrag/__tests__/vector-persistence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-search.test.d.ts","sourceRoot":"","sources":["../../../src/graphrag/__tests__/vector-search.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { cosine, cosineTopK } from '../vector-search.js';
|
|
3
|
+
describe('vector-search', () => {
|
|
4
|
+
it('cosine_known_values', () => {
|
|
5
|
+
const orthogonal = cosine(new Float32Array([1, 0]), new Float32Array([0, 1]));
|
|
6
|
+
const identical = cosine(new Float32Array([1, 2, 3]), new Float32Array([1, 2, 3]));
|
|
7
|
+
expect(orthogonal).toBe(0);
|
|
8
|
+
expect(identical).toBeCloseTo(1, 10);
|
|
9
|
+
});
|
|
10
|
+
it('topK_orders_desc', () => {
|
|
11
|
+
const query = new Float32Array([1, 0]);
|
|
12
|
+
const ranked = cosineTopK(query, [
|
|
13
|
+
{ id: 'c', v: new Float32Array([0, 1]) },
|
|
14
|
+
{ id: 'a', v: new Float32Array([1, 0]) },
|
|
15
|
+
{ id: 'b', v: new Float32Array([0.8, 0.2]) },
|
|
16
|
+
{ id: 'd', v: new Float32Array([-1, 0]) },
|
|
17
|
+
], 3);
|
|
18
|
+
expect(ranked.map((item) => item.id)).toEqual(['a', 'b', 'c']);
|
|
19
|
+
expect(ranked[0]?.score).toBeGreaterThanOrEqual(ranked[1]?.score ?? -Infinity);
|
|
20
|
+
expect(ranked[1]?.score).toBeGreaterThanOrEqual(ranked[2]?.score ?? -Infinity);
|
|
21
|
+
});
|
|
22
|
+
it('topK_stable_on_ties', () => {
|
|
23
|
+
const query = new Float32Array([1, 0]);
|
|
24
|
+
const ranked = cosineTopK(query, [
|
|
25
|
+
{ id: 'first', v: new Float32Array([2, 0]) },
|
|
26
|
+
{ id: 'second', v: new Float32Array([3, 0]) },
|
|
27
|
+
{ id: 'third', v: new Float32Array([0, 1]) },
|
|
28
|
+
], 2);
|
|
29
|
+
expect(ranked.map((item) => item.id)).toEqual(['first', 'second']);
|
|
30
|
+
});
|
|
31
|
+
it('mismatched_dim_throws', () => {
|
|
32
|
+
expect(() => cosine(new Float32Array([1, 2]), new Float32Array([1, 2, 3]))).toThrow(/dimensions must match/i);
|
|
33
|
+
expect(() => cosineTopK(new Float32Array([1, 2]), [{ id: 'bad', v: new Float32Array([1, 2, 3]) }], 1)).toThrow(/dimensions must match/i);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=vector-search.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-search.test.js","sourceRoot":"","sources":["../../../src/graphrag/__tests__/vector-search.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { KnowledgeGraph } from './knowledge-graph.js';
|
|
2
|
+
export type DriftKind = 'orphan-requirement' | 'orphan-code' | 'stale';
|
|
3
|
+
export interface DriftFinding {
|
|
4
|
+
readonly kind: DriftKind;
|
|
5
|
+
readonly nodeId: string;
|
|
6
|
+
readonly label: string;
|
|
7
|
+
readonly detail: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DriftReport {
|
|
10
|
+
readonly findings: ReadonlyArray<DriftFinding>;
|
|
11
|
+
readonly counts: Record<DriftKind, number>;
|
|
12
|
+
readonly staleIndeterminate: number;
|
|
13
|
+
}
|
|
14
|
+
export interface DriftConfig {
|
|
15
|
+
readonly enabled: boolean;
|
|
16
|
+
readonly maxOrphanReqs: number;
|
|
17
|
+
readonly maxOrphanCode: number;
|
|
18
|
+
readonly failOnStale: boolean;
|
|
19
|
+
readonly ignore: ReadonlyArray<string>;
|
|
20
|
+
}
|
|
21
|
+
export declare function detectDrift(graph: KnowledgeGraph, cfg: DriftConfig): DriftReport;
|
|
22
|
+
//# sourceMappingURL=drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/graphrag/drift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAEjF,MAAM,MAAM,SAAS,GAAG,oBAAoB,GAAG,aAAa,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACxC;AASD,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,GAAG,WAAW,CA2EhF"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
const QUERY_LIMIT = 1000000;
|
|
2
|
+
export function detectDrift(graph, cfg) {
|
|
3
|
+
if (!cfg.enabled) {
|
|
4
|
+
return {
|
|
5
|
+
findings: [],
|
|
6
|
+
counts: createCounts(),
|
|
7
|
+
staleIndeterminate: 0,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
const findings = [];
|
|
11
|
+
const counts = createCounts();
|
|
12
|
+
let staleIndeterminate = 0;
|
|
13
|
+
const requirements = sortNodes(graph.queryNodes('requirement', QUERY_LIMIT));
|
|
14
|
+
const codeSymbols = sortNodes(graph.queryNodes('code_symbol', QUERY_LIMIT));
|
|
15
|
+
const ignoreGlobs = [...cfg.ignore].sort();
|
|
16
|
+
for (const requirement of requirements) {
|
|
17
|
+
const links = linkedCodeToRequirement(graph, requirement.id);
|
|
18
|
+
if (links.length === 0) {
|
|
19
|
+
pushFinding(findings, counts, {
|
|
20
|
+
kind: 'orphan-requirement',
|
|
21
|
+
nodeId: requirement.id,
|
|
22
|
+
label: requirement.label,
|
|
23
|
+
detail: `requirement ${requirement.id} has no incoming implements/affects edge from code_symbol`,
|
|
24
|
+
});
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const reqHash = readString(requirement.metadata, 'contentHash');
|
|
28
|
+
if (!reqHash) {
|
|
29
|
+
staleIndeterminate += 1;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const reqTimestamp = firstValidTimestamp([
|
|
33
|
+
readString(requirement.metadata, 'ingestedAt'),
|
|
34
|
+
readString(requirement.metadata, 'updatedAt'),
|
|
35
|
+
requirement.updatedAt,
|
|
36
|
+
requirement.createdAt,
|
|
37
|
+
]);
|
|
38
|
+
const staleCause = findStaleCause(reqHash, reqTimestamp, links);
|
|
39
|
+
if (staleCause) {
|
|
40
|
+
pushFinding(findings, counts, {
|
|
41
|
+
kind: 'stale',
|
|
42
|
+
nodeId: requirement.id,
|
|
43
|
+
label: requirement.label,
|
|
44
|
+
detail: staleCause,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
for (const symbol of codeSymbols) {
|
|
49
|
+
if (isIgnored(symbol, ignoreGlobs))
|
|
50
|
+
continue;
|
|
51
|
+
if (hasRequirementImplementsEdge(graph, symbol.id))
|
|
52
|
+
continue;
|
|
53
|
+
pushFinding(findings, counts, {
|
|
54
|
+
kind: 'orphan-code',
|
|
55
|
+
nodeId: symbol.id,
|
|
56
|
+
label: symbol.label,
|
|
57
|
+
detail: `code_symbol ${symbol.id} has no outgoing implements edge to requirement`,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const sortedFindings = [...findings].sort((a, b) => {
|
|
61
|
+
if (a.kind !== b.kind)
|
|
62
|
+
return a.kind.localeCompare(b.kind);
|
|
63
|
+
if (a.nodeId !== b.nodeId)
|
|
64
|
+
return a.nodeId.localeCompare(b.nodeId);
|
|
65
|
+
return a.detail.localeCompare(b.detail);
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
findings: sortedFindings,
|
|
69
|
+
counts,
|
|
70
|
+
staleIndeterminate,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function createCounts() {
|
|
74
|
+
return {
|
|
75
|
+
'orphan-requirement': 0,
|
|
76
|
+
'orphan-code': 0,
|
|
77
|
+
stale: 0,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function pushFinding(findings, counts, finding) {
|
|
81
|
+
findings.push(finding);
|
|
82
|
+
counts[finding.kind] += 1;
|
|
83
|
+
}
|
|
84
|
+
function sortNodes(nodes) {
|
|
85
|
+
return [...nodes].sort((a, b) => {
|
|
86
|
+
if (a.id !== b.id)
|
|
87
|
+
return a.id.localeCompare(b.id);
|
|
88
|
+
return a.label.localeCompare(b.label);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function linkedCodeToRequirement(graph, requirementId) {
|
|
92
|
+
const incoming = graph.getEdges(requirementId, 'in');
|
|
93
|
+
const links = [];
|
|
94
|
+
for (const edge of incoming) {
|
|
95
|
+
if (edge.type !== 'implements' && edge.type !== 'affects')
|
|
96
|
+
continue;
|
|
97
|
+
const source = graph.getNode(edge.sourceId);
|
|
98
|
+
if (!source || source.type !== 'code_symbol')
|
|
99
|
+
continue;
|
|
100
|
+
links.push({ edge, codeNode: source });
|
|
101
|
+
}
|
|
102
|
+
return links.sort((a, b) => {
|
|
103
|
+
if (a.codeNode.id !== b.codeNode.id)
|
|
104
|
+
return a.codeNode.id.localeCompare(b.codeNode.id);
|
|
105
|
+
return a.edge.id.localeCompare(b.edge.id);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function hasRequirementImplementsEdge(graph, codeSymbolId) {
|
|
109
|
+
const outgoing = graph.getEdges(codeSymbolId, 'out');
|
|
110
|
+
for (const edge of outgoing) {
|
|
111
|
+
if (edge.type !== 'implements')
|
|
112
|
+
continue;
|
|
113
|
+
const target = graph.getNode(edge.targetId);
|
|
114
|
+
if (target?.type === 'requirement')
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
function isIgnored(codeNode, globs) {
|
|
120
|
+
if (globs.length === 0)
|
|
121
|
+
return false;
|
|
122
|
+
const candidates = normalizeCandidates([
|
|
123
|
+
codeNode.id,
|
|
124
|
+
codeNode.label,
|
|
125
|
+
readString(codeNode.metadata, 'path'),
|
|
126
|
+
readString(codeNode.metadata, 'qualifiedName'),
|
|
127
|
+
]);
|
|
128
|
+
for (const glob of globs) {
|
|
129
|
+
const regex = globToRegExp(glob);
|
|
130
|
+
if (candidates.some((candidate) => regex.test(candidate)))
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
function normalizeCandidates(candidates) {
|
|
136
|
+
return candidates
|
|
137
|
+
.filter((value) => typeof value === 'string' && value.length > 0)
|
|
138
|
+
.map((value) => value.replace(/\\/g, '/'));
|
|
139
|
+
}
|
|
140
|
+
function globToRegExp(glob) {
|
|
141
|
+
const normalized = glob.replace(/\\/g, '/');
|
|
142
|
+
const escaped = normalized.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
143
|
+
const pattern = escaped
|
|
144
|
+
.replace(/\*\*\/?/g, '§§§')
|
|
145
|
+
.replace(/\*/g, '[^/]*')
|
|
146
|
+
.replace(/§§§/g, '.*');
|
|
147
|
+
return new RegExp(`^${pattern}$`);
|
|
148
|
+
}
|
|
149
|
+
function findStaleCause(requirementHash, requirementTimestamp, links) {
|
|
150
|
+
for (const link of links) {
|
|
151
|
+
const codeSymbol = codeSymbolLabel(link.codeNode);
|
|
152
|
+
const recordedRequirementHash = firstPresentString([
|
|
153
|
+
readString(link.edge.metadata, 'requirementContentHash'),
|
|
154
|
+
readString(link.codeNode.metadata, 'requirementContentHash'),
|
|
155
|
+
readString(link.codeNode.metadata, 'reqContentHash'),
|
|
156
|
+
]);
|
|
157
|
+
if (recordedRequirementHash && recordedRequirementHash !== requirementHash) {
|
|
158
|
+
return `requirement hash differs from code snapshot on ${codeSymbol}`;
|
|
159
|
+
}
|
|
160
|
+
if (requirementTimestamp === undefined)
|
|
161
|
+
continue;
|
|
162
|
+
const codeTimestamp = firstValidTimestamp([
|
|
163
|
+
readString(link.codeNode.metadata, 'ingestedAt'),
|
|
164
|
+
readString(link.codeNode.metadata, 'indexedAt'),
|
|
165
|
+
readString(link.codeNode.metadata, 'updatedAt'),
|
|
166
|
+
readString(link.codeNode.metadata, 'mtime'),
|
|
167
|
+
readString(link.codeNode.metadata, 'modifiedAt'),
|
|
168
|
+
link.codeNode.updatedAt,
|
|
169
|
+
link.codeNode.createdAt,
|
|
170
|
+
]);
|
|
171
|
+
if (codeTimestamp !== undefined && requirementTimestamp > codeTimestamp) {
|
|
172
|
+
return `requirement changed after code snapshot on ${codeSymbol}`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
function codeSymbolLabel(node) {
|
|
178
|
+
return (readString(node.metadata, 'qualifiedName') ??
|
|
179
|
+
readString(node.metadata, 'path') ??
|
|
180
|
+
node.label ??
|
|
181
|
+
node.id);
|
|
182
|
+
}
|
|
183
|
+
function firstPresentString(values) {
|
|
184
|
+
for (const value of values) {
|
|
185
|
+
if (typeof value === 'string' && value.length > 0)
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
function readString(metadata, key) {
|
|
191
|
+
const value = metadata?.[key];
|
|
192
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
193
|
+
}
|
|
194
|
+
function firstValidTimestamp(values) {
|
|
195
|
+
for (const value of values) {
|
|
196
|
+
if (!value)
|
|
197
|
+
continue;
|
|
198
|
+
const parsed = Date.parse(value);
|
|
199
|
+
if (!Number.isNaN(parsed))
|
|
200
|
+
return parsed;
|
|
201
|
+
}
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/graphrag/drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface SemanticConfig {
|
|
2
|
+
readonly model: string;
|
|
3
|
+
readonly modelHash: string;
|
|
4
|
+
readonly runtimePackage?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Embedder {
|
|
7
|
+
readonly dim: number;
|
|
8
|
+
embed(text: string): Promise<Float32Array>;
|
|
9
|
+
}
|
|
10
|
+
export declare class EmbeddingModelMissingError extends Error {
|
|
11
|
+
readonly code: "EMBEDDING_MODEL_MISSING";
|
|
12
|
+
constructor(runtimePackage?: string);
|
|
13
|
+
}
|
|
14
|
+
export declare function loadEmbedder(cfg: SemanticConfig): Promise<Embedder>;
|
|
15
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/graphrag/embeddings.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5C;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,IAAI,EAAG,yBAAyB,CAAU;gBAEvC,cAAc,SAA0B;CAMrD;AA0HD,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAezE"}
|