adce-storage 0.0.0-stage → 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,25 @@
1
+ import type { ConfidenceLevel, RelationshipRecord, RelationshipType, VerificationState } from "adce-shared";
2
+ import type { AdceDb } from "./database.js";
3
+ export interface InsertManualRelationshipInput {
4
+ sourceArtifactId: string;
5
+ targetArtifactId: string;
6
+ type: RelationshipType;
7
+ }
8
+ export interface UpsertDetectedRelationshipInput {
9
+ sourceArtifactId: string;
10
+ targetArtifactId: string;
11
+ type: RelationshipType;
12
+ confidence: ConfidenceLevel;
13
+ evidence: string | null;
14
+ }
15
+ export declare const listRelationships: (db: AdceDb) => RelationshipRecord[];
16
+ export declare const findRelationshipById: (db: AdceDb, id: string) => RelationshipRecord | null;
17
+ export declare const findRelationshipsByIdPrefix: (db: AdceDb, prefix: string) => RelationshipRecord[];
18
+ export declare const findRelationshipByEdge: (db: AdceDb, sourceArtifactId: string, targetArtifactId: string, type: RelationshipType) => RelationshipRecord | null;
19
+ export declare const insertManualRelationship: (db: AdceDb, input: InsertManualRelationshipInput) => RelationshipRecord;
20
+ export declare const deleteRelationshipById: (db: AdceDb, id: string) => boolean;
21
+ /** Hard-delete every relationship row. Returns count removed. */
22
+ export declare const deleteAllRelationships: (db: AdceDb) => number;
23
+ export declare const countRelationships: (db: AdceDb) => number;
24
+ export declare const upsertDetectedRelationship: (db: AdceDb, input: UpsertDetectedRelationshipInput) => RelationshipRecord;
25
+ export declare const setRelationshipVerification: (db: AdceDb, id: string, verification: VerificationState) => RelationshipRecord | null;
@@ -0,0 +1,151 @@
1
+ import { and, eq, like } from "drizzle-orm";
2
+ import { relationships } from "./schema.js";
3
+ const toRecord = (row) => {
4
+ return {
5
+ id: row.id,
6
+ sourceArtifactId: row.sourceArtifactId,
7
+ targetArtifactId: row.targetArtifactId,
8
+ type: row.type,
9
+ origin: row.origin,
10
+ confidence: row.confidence,
11
+ verification: row.verification,
12
+ evidence: row.evidence,
13
+ createdAt: row.createdAt,
14
+ updatedAt: row.updatedAt,
15
+ };
16
+ };
17
+ export const listRelationships = (db) => db.select().from(relationships).all().map(toRecord);
18
+ export const findRelationshipById = (db, id) => {
19
+ const row = db
20
+ .select()
21
+ .from(relationships)
22
+ .where(eq(relationships.id, id))
23
+ .get();
24
+ return row ? toRecord(row) : null;
25
+ };
26
+ export const findRelationshipsByIdPrefix = (db, prefix) => {
27
+ if (!prefix)
28
+ return [];
29
+ return db
30
+ .select()
31
+ .from(relationships)
32
+ .where(like(relationships.id, `${prefix}%`))
33
+ .all()
34
+ .map(toRecord);
35
+ };
36
+ export const findRelationshipByEdge = (db, sourceArtifactId, targetArtifactId, type) => {
37
+ const row = db
38
+ .select()
39
+ .from(relationships)
40
+ .where(and(eq(relationships.sourceArtifactId, sourceArtifactId), eq(relationships.targetArtifactId, targetArtifactId), eq(relationships.type, type)))
41
+ .get();
42
+ return row ? toRecord(row) : null;
43
+ };
44
+ export const insertManualRelationship = (db, input) => {
45
+ const now = new Date().toISOString();
46
+ const created = {
47
+ id: crypto.randomUUID(),
48
+ sourceArtifactId: input.sourceArtifactId,
49
+ targetArtifactId: input.targetArtifactId,
50
+ type: input.type,
51
+ origin: "MANUAL",
52
+ confidence: "CONFIRMED",
53
+ verification: "VERIFIED",
54
+ evidence: null,
55
+ createdAt: now,
56
+ updatedAt: now,
57
+ };
58
+ db.insert(relationships)
59
+ .values({
60
+ id: created.id,
61
+ sourceArtifactId: created.sourceArtifactId,
62
+ targetArtifactId: created.targetArtifactId,
63
+ type: created.type,
64
+ origin: created.origin,
65
+ confidence: created.confidence,
66
+ verification: created.verification,
67
+ evidence: created.evidence,
68
+ createdAt: created.createdAt,
69
+ updatedAt: created.updatedAt,
70
+ })
71
+ .run();
72
+ return created;
73
+ };
74
+ export const deleteRelationshipById = (db, id) => {
75
+ const result = db.delete(relationships).where(eq(relationships.id, id)).run();
76
+ return result.changes > 0;
77
+ };
78
+ /** Hard-delete every relationship row. Returns count removed. */
79
+ export const deleteAllRelationships = (db) => {
80
+ const before = countRelationships(db);
81
+ if (before === 0)
82
+ return 0;
83
+ db.delete(relationships).run();
84
+ return before;
85
+ };
86
+ export const countRelationships = (db) => db.select().from(relationships).all().length;
87
+ export const upsertDetectedRelationship = (db, input) => {
88
+ const existing = findRelationshipByEdge(db, input.sourceArtifactId, input.targetArtifactId, input.type);
89
+ // Human / rejection win — inference must not touch these
90
+ if (existing?.origin === "MANUAL")
91
+ return existing;
92
+ if (existing?.verification === "REJECTED")
93
+ return existing;
94
+ const now = new Date().toISOString();
95
+ if (existing) {
96
+ // Refresh evidence/confidence only; keep verification/origin/id
97
+ db.update(relationships)
98
+ .set({
99
+ confidence: input.confidence,
100
+ evidence: input.evidence,
101
+ updatedAt: now,
102
+ })
103
+ .where(eq(relationships.id, existing.id))
104
+ .run();
105
+ return {
106
+ ...existing,
107
+ confidence: input.confidence,
108
+ evidence: input.evidence,
109
+ updatedAt: now,
110
+ };
111
+ }
112
+ const created = {
113
+ id: crypto.randomUUID(),
114
+ sourceArtifactId: input.sourceArtifactId,
115
+ targetArtifactId: input.targetArtifactId,
116
+ type: input.type,
117
+ origin: "DETECTED",
118
+ confidence: input.confidence,
119
+ verification: "UNREVIEWED",
120
+ evidence: input.evidence,
121
+ createdAt: now,
122
+ updatedAt: now,
123
+ };
124
+ db.insert(relationships)
125
+ .values({
126
+ id: created.id,
127
+ sourceArtifactId: created.sourceArtifactId,
128
+ targetArtifactId: created.targetArtifactId,
129
+ type: created.type,
130
+ origin: created.origin,
131
+ confidence: created.confidence,
132
+ verification: created.verification,
133
+ evidence: created.evidence,
134
+ createdAt: created.createdAt,
135
+ updatedAt: created.updatedAt,
136
+ })
137
+ .run();
138
+ return created;
139
+ };
140
+ export const setRelationshipVerification = (db, id, verification) => {
141
+ const existing = findRelationshipById(db, id);
142
+ if (!existing)
143
+ return null;
144
+ const updatedAt = new Date().toISOString();
145
+ db.update(relationships)
146
+ .set({ verification, updatedAt })
147
+ .where(eq(relationships.id, id))
148
+ .run();
149
+ return { ...existing, verification, updatedAt };
150
+ };
151
+ //# sourceMappingURL=relationship-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-repository.js","sourceRoot":"","sources":["../src/relationship-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ScanSummary } from "adce-shared";
2
+ import type { AdceDb } from "./database.js";
3
+ export declare const insertScan: (db: AdceDb, summary: ScanSummary & {
4
+ id: string;
5
+ }) => void;
6
+ export declare const getLatestScan: (db: AdceDb) => (ScanSummary & {
7
+ id: string;
8
+ }) | null;
9
+ export declare const listScans: (db: AdceDb, limit?: number) => (ScanSummary & {
10
+ id: string;
11
+ })[];
@@ -0,0 +1,59 @@
1
+ import { desc } from "drizzle-orm";
2
+ import { scans } from "./schema.js";
3
+ export const insertScan = (db, summary) => {
4
+ db.insert(scans)
5
+ .values({
6
+ id: summary.id,
7
+ mode: summary.mode,
8
+ startedAt: summary.startedAt,
9
+ finishedAt: summary.finishedAt,
10
+ filesSeen: summary.filesSeen,
11
+ artifactsUpserted: summary.artifactsUpserted,
12
+ unchanged: summary.unchanged,
13
+ changed: summary.changed,
14
+ added: summary.added,
15
+ removed: summary.removed,
16
+ gitDetected: summary.gitDetected,
17
+ })
18
+ .run();
19
+ };
20
+ export const getLatestScan = (db) => {
21
+ const row = db.select().from(scans).orderBy(desc(scans.finishedAt)).get();
22
+ if (!row)
23
+ return null;
24
+ return {
25
+ id: row.id,
26
+ mode: row.mode,
27
+ startedAt: row.startedAt,
28
+ finishedAt: row.finishedAt,
29
+ filesSeen: row.filesSeen,
30
+ artifactsUpserted: row.artifactsUpserted,
31
+ unchanged: row.unchanged,
32
+ changed: row.changed,
33
+ added: row.added,
34
+ removed: row.removed,
35
+ gitDetected: row.gitDetected,
36
+ };
37
+ };
38
+ export const listScans = (db, limit = 10) => {
39
+ const rows = db
40
+ .select()
41
+ .from(scans)
42
+ .orderBy(desc(scans.finishedAt))
43
+ .limit(limit)
44
+ .all();
45
+ return rows.map((row) => ({
46
+ id: row.id,
47
+ mode: row.mode,
48
+ startedAt: row.startedAt,
49
+ finishedAt: row.finishedAt,
50
+ filesSeen: row.filesSeen,
51
+ artifactsUpserted: row.artifactsUpserted,
52
+ unchanged: row.unchanged,
53
+ changed: row.changed,
54
+ added: row.added,
55
+ removed: row.removed,
56
+ gitDetected: row.gitDetected,
57
+ }));
58
+ };
59
+ //# sourceMappingURL=scan-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-repository.js","sourceRoot":"","sources":["../src/scan-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,EAAU,EACV,OAAqC,EAC/B,EAAE;IACR,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;SACb,MAAM,CAAC;QACN,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC;SACD,GAAG,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,EAAU,EAC6B,EAAE;IACzC,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1E,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAA2B;QACrC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,EAAU,EACV,KAAK,GAAG,EAAE,EACwB,EAAE;IACpC,MAAM,IAAI,GAAG,EAAE;SACZ,MAAM,EAAE;SACR,IAAI,CAAC,KAAK,CAAC;SACX,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;SAC/B,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,EAAE,CAAC;IAET,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAA2B;QACrC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC,CAAC"}