@handong66/evidoc-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ import type { AgentRuntimeContract, AgentRuntimeEvent, AgentRuntimeMode, AgentRuntimeScope, DriftFinding, DriftReport } from "./types.js";
2
+ export interface AgentRuntimeContractOptions {
3
+ event: AgentRuntimeEvent;
4
+ mode: AgentRuntimeMode;
5
+ scope: AgentRuntimeScope;
6
+ baseline?: string;
7
+ baselineCommit?: string;
8
+ changedFiles?: string[];
9
+ changedFileFingerprints?: Record<string, string>;
10
+ affectedDocuments?: string[];
11
+ generatedAt?: string;
12
+ }
13
+ export declare function createAgentRuntimeContract(report: DriftReport, options: AgentRuntimeContractOptions): AgentRuntimeContract;
14
+ export declare function fingerprintDriftFinding(finding: DriftFinding): string;
15
+ export declare function fingerprintFileContent(content: string | Uint8Array): string;
@@ -0,0 +1,149 @@
1
+ import { createHash } from "node:crypto";
2
+ const DRIFT_EVIDENCE_KINDS = new Set([
3
+ "agent_instruction",
4
+ "api",
5
+ "command",
6
+ "config",
7
+ "coverage",
8
+ "frontmatter",
9
+ "path",
10
+ "review_log",
11
+ "symbol"
12
+ ]);
13
+ export function createAgentRuntimeContract(report, options) {
14
+ const findings = report.findings.map((finding) => ({
15
+ fingerprint: fingerprintDriftFinding(finding),
16
+ findingId: finding.id,
17
+ ruleId: finding.ruleId,
18
+ status: finding.status,
19
+ severity: finding.severity,
20
+ location: `${finding.docPath}:${finding.line}`,
21
+ message: finding.message,
22
+ suggestedAction: finding.suggestedAction
23
+ }));
24
+ const status = runtimeStatus(report);
25
+ const changedFiles = normalizeList(options.changedFiles);
26
+ const changedFileFingerprints = normalizeRecord(options.changedFileFingerprints);
27
+ const affectedDocuments = normalizeList(options.affectedDocuments);
28
+ return {
29
+ schemaVersion: "evidoc.agent-runtime.v1",
30
+ source: "evidoc",
31
+ event: options.event,
32
+ mode: options.mode,
33
+ scope: options.scope,
34
+ baseline: options.baseline,
35
+ baselineCommit: options.baselineCommit,
36
+ status,
37
+ fingerprint: aggregateRuntimeFingerprint({
38
+ status,
39
+ findingFingerprints: findings.map((finding) => finding.fingerprint),
40
+ event: options.event,
41
+ mode: options.mode,
42
+ scope: options.scope,
43
+ baseline: options.baseline,
44
+ baselineCommit: options.baselineCommit,
45
+ changedFiles,
46
+ changedFileFingerprints,
47
+ affectedDocuments
48
+ }),
49
+ generatedAt: options.generatedAt ?? new Date().toISOString(),
50
+ scannedAt: report.scannedAt,
51
+ summary: {
52
+ findings: report.summary.findings,
53
+ broken: report.summary.broken,
54
+ reviewNeeded: report.summary.reviewNeeded
55
+ },
56
+ findings,
57
+ dedupe: {
58
+ strategy: "runtime.findings[].fingerprint",
59
+ fingerprintCount: new Set(findings.map((finding) => finding.fingerprint)).size
60
+ },
61
+ changedFiles,
62
+ changedFileFingerprints,
63
+ affectedDocuments
64
+ };
65
+ }
66
+ export function fingerprintDriftFinding(finding) {
67
+ return `dgf_${stableHash({
68
+ ruleId: finding.ruleId,
69
+ status: finding.status,
70
+ severity: finding.severity,
71
+ docPath: finding.docPath,
72
+ line: finding.line,
73
+ evidence: readFindingEvidence(finding)
74
+ .map((item) => ({
75
+ kind: item.kind,
76
+ subject: item.subject,
77
+ expected: item.expected,
78
+ actual: item.actual,
79
+ detail: item.detail
80
+ }))
81
+ .sort((left, right) => stableStringify(left).localeCompare(stableStringify(right)))
82
+ })}`;
83
+ }
84
+ function readFindingEvidence(finding) {
85
+ if (!Array.isArray(finding.evidence))
86
+ return [];
87
+ return finding.evidence.filter(isDriftEvidence);
88
+ }
89
+ function isDriftEvidence(item) {
90
+ if (!item || typeof item !== "object")
91
+ return false;
92
+ const candidate = item;
93
+ return (typeof candidate.kind === "string" &&
94
+ DRIFT_EVIDENCE_KINDS.has(candidate.kind) &&
95
+ typeof candidate.subject === "string" &&
96
+ typeof candidate.detail === "string" &&
97
+ (candidate.expected === undefined || typeof candidate.expected === "string") &&
98
+ (candidate.actual === undefined || typeof candidate.actual === "string"));
99
+ }
100
+ export function fingerprintFileContent(content) {
101
+ return `sha256:${createHash("sha256").update(content).digest("hex")}`;
102
+ }
103
+ function runtimeStatus(report) {
104
+ if (report.summary.broken > 0)
105
+ return "failed";
106
+ if (report.summary.reviewNeeded > 0)
107
+ return "review_needed";
108
+ return "passed";
109
+ }
110
+ function aggregateRuntimeFingerprint(input) {
111
+ return `dgr_${stableHash({
112
+ status: input.status,
113
+ event: input.event,
114
+ mode: input.mode,
115
+ scope: input.scope,
116
+ baseline: input.baseline,
117
+ baselineCommit: input.baselineCommit,
118
+ changedFiles: input.changedFiles,
119
+ changedFileFingerprints: input.changedFileFingerprints,
120
+ affectedDocuments: input.affectedDocuments,
121
+ findings: [...input.findingFingerprints].sort()
122
+ })}`;
123
+ }
124
+ function normalizeList(value) {
125
+ if (!value)
126
+ return undefined;
127
+ return [...new Set(value)].sort();
128
+ }
129
+ function normalizeRecord(value) {
130
+ if (!value)
131
+ return undefined;
132
+ return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)));
133
+ }
134
+ function stableHash(value) {
135
+ return createHash("sha256").update(stableStringify(value)).digest("hex").slice(0, 16);
136
+ }
137
+ function stableStringify(value) {
138
+ return JSON.stringify(canonicalize(value));
139
+ }
140
+ function canonicalize(value) {
141
+ if (Array.isArray(value))
142
+ return value.map(canonicalize);
143
+ if (!value || typeof value !== "object")
144
+ return value;
145
+ return Object.fromEntries(Object.entries(value)
146
+ .sort(([left], [right]) => left.localeCompare(right))
147
+ .map(([key, item]) => [key, canonicalize(item)]));
148
+ }
149
+ //# sourceMappingURL=agent-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../src/agent-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAYzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;IAC3C,mBAAmB;IACnB,KAAK;IACL,SAAS;IACT,QAAQ;IACR,UAAU;IACV,aAAa;IACb,MAAM;IACN,YAAY;IACZ,QAAQ;CACT,CAAC,CAAC;AAcH,MAAM,UAAU,0BAA0B,CACxC,MAAmB,EACnB,OAAoC;IAEpC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjD,WAAW,EAAE,uBAAuB,CAAC,OAAO,CAAC;QAC7C,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;QAC9C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,eAAe;KACzC,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,uBAAuB,GAAG,eAAe,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACjF,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEnE,OAAO;QACL,aAAa,EAAE,yBAAyB;QACxC,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,MAAM;QACN,WAAW,EAAE,2BAA2B,CAAC;YACvC,MAAM;YACN,mBAAmB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YACnE,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,YAAY;YACZ,uBAAuB;YACvB,iBAAiB;SAClB,CAAC;QACF,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5D,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE;YACP,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;YACjC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY;SAC1C;QACD,QAAQ;QACR,MAAM,EAAE;YACN,QAAQ,EAAE,gCAAgC;YAC1C,gBAAgB,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;SAC/E;QACD,YAAY;QACZ,uBAAuB;QACvB,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAqB;IAC3D,OAAO,OAAO,UAAU,CAAC;QACvB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC;aACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;KACtF,CAAC,EAAE,CAAC;AACP,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAqB;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,SAAS,GAAG,IAA8B,CAAC;IACjD,OAAO,CACL,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAClC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;QACxC,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;QACrC,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ;QACpC,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAC5E,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAA4B;IACjE,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,aAAa,CAAC,MAAmB;IACxC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,2BAA2B,CAAC,KAWpC;IACC,OAAO,OAAO,UAAU,CAAC;QACvB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,uBAAuB,EAAE,KAAK,CAAC,uBAAuB;QACtD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE;KAChD,CAAC,EAAE,CAAC;AACP,CAAC;AAED,SAAS,aAAa,CAAC,KAA2B;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,eAAe,CAAC,KAAyC;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;SAC7C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { DriftFinding, RepositorySnapshot } from "./types.js";
2
+ export declare function detectDrift(snapshot: RepositorySnapshot): Promise<DriftFinding[]>;