ai-mind-map 1.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.
- package/LICENSE +21 -0
- package/README.md +554 -0
- package/dist/change-tracker/change-log.d.ts +160 -0
- package/dist/change-tracker/change-log.d.ts.map +1 -0
- package/dist/change-tracker/change-log.js +507 -0
- package/dist/change-tracker/change-log.js.map +1 -0
- package/dist/change-tracker/diff-engine.d.ts +149 -0
- package/dist/change-tracker/diff-engine.d.ts.map +1 -0
- package/dist/change-tracker/diff-engine.js +530 -0
- package/dist/change-tracker/diff-engine.js.map +1 -0
- package/dist/change-tracker/watcher.d.ts +137 -0
- package/dist/change-tracker/watcher.d.ts.map +1 -0
- package/dist/change-tracker/watcher.js +300 -0
- package/dist/change-tracker/watcher.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +937 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +222 -0
- package/dist/config.js.map +1 -0
- package/dist/context/compressor.d.ts +49 -0
- package/dist/context/compressor.d.ts.map +1 -0
- package/dist/context/compressor.js +769 -0
- package/dist/context/compressor.js.map +1 -0
- package/dist/context/progressive-disclosure.d.ts +71 -0
- package/dist/context/progressive-disclosure.d.ts.map +1 -0
- package/dist/context/progressive-disclosure.js +470 -0
- package/dist/context/progressive-disclosure.js.map +1 -0
- package/dist/context/token-budget.d.ts +121 -0
- package/dist/context/token-budget.d.ts.map +1 -0
- package/dist/context/token-budget.js +282 -0
- package/dist/context/token-budget.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +944 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +66 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +946 -0
- package/dist/install.js.map +1 -0
- package/dist/knowledge-graph/architecture.d.ts +213 -0
- package/dist/knowledge-graph/architecture.d.ts.map +1 -0
- package/dist/knowledge-graph/architecture.js +585 -0
- package/dist/knowledge-graph/architecture.js.map +1 -0
- package/dist/knowledge-graph/cypher.d.ts +113 -0
- package/dist/knowledge-graph/cypher.d.ts.map +1 -0
- package/dist/knowledge-graph/cypher.js +1051 -0
- package/dist/knowledge-graph/cypher.js.map +1 -0
- package/dist/knowledge-graph/dead-code.d.ts +121 -0
- package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
- package/dist/knowledge-graph/dead-code.js +331 -0
- package/dist/knowledge-graph/dead-code.js.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.js +739 -0
- package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
- package/dist/knowledge-graph/graph.d.ts +291 -0
- package/dist/knowledge-graph/graph.d.ts.map +1 -0
- package/dist/knowledge-graph/graph.js +978 -0
- package/dist/knowledge-graph/graph.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +17 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +14 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/indexer.d.ts +112 -0
- package/dist/knowledge-graph/indexer.d.ts.map +1 -0
- package/dist/knowledge-graph/indexer.js +506 -0
- package/dist/knowledge-graph/indexer.js.map +1 -0
- package/dist/knowledge-graph/pagerank.d.ts +141 -0
- package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
- package/dist/knowledge-graph/pagerank.js +493 -0
- package/dist/knowledge-graph/pagerank.js.map +1 -0
- package/dist/knowledge-graph/parser.d.ts +55 -0
- package/dist/knowledge-graph/parser.d.ts.map +1 -0
- package/dist/knowledge-graph/parser.js +1090 -0
- package/dist/knowledge-graph/parser.js.map +1 -0
- package/dist/knowledge-graph/snapshot.d.ts +107 -0
- package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
- package/dist/knowledge-graph/snapshot.js +435 -0
- package/dist/knowledge-graph/snapshot.js.map +1 -0
- package/dist/memory/decision-log.d.ts +151 -0
- package/dist/memory/decision-log.d.ts.map +1 -0
- package/dist/memory/decision-log.js +482 -0
- package/dist/memory/decision-log.js.map +1 -0
- package/dist/memory/persistent-memory.d.ts +182 -0
- package/dist/memory/persistent-memory.d.ts.map +1 -0
- package/dist/memory/persistent-memory.js +579 -0
- package/dist/memory/persistent-memory.js.map +1 -0
- package/dist/memory/session-memory.d.ts +165 -0
- package/dist/memory/session-memory.d.ts.map +1 -0
- package/dist/memory/session-memory.js +382 -0
- package/dist/memory/session-memory.js.map +1 -0
- package/dist/stress-test.d.ts +10 -0
- package/dist/stress-test.d.ts.map +1 -0
- package/dist/stress-test.js +258 -0
- package/dist/stress-test.js.map +1 -0
- package/dist/tools/advanced-tools.d.ts +32 -0
- package/dist/tools/advanced-tools.d.ts.map +1 -0
- package/dist/tools/advanced-tools.js +480 -0
- package/dist/tools/advanced-tools.js.map +1 -0
- package/dist/tools/change-tools.d.ts +76 -0
- package/dist/tools/change-tools.d.ts.map +1 -0
- package/dist/tools/change-tools.js +93 -0
- package/dist/tools/change-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +68 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +141 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/debug-tools.d.ts +25 -0
- package/dist/tools/debug-tools.d.ts.map +1 -0
- package/dist/tools/debug-tools.js +286 -0
- package/dist/tools/debug-tools.js.map +1 -0
- package/dist/tools/evolving-tools.d.ts +23 -0
- package/dist/tools/evolving-tools.d.ts.map +1 -0
- package/dist/tools/evolving-tools.js +207 -0
- package/dist/tools/evolving-tools.js.map +1 -0
- package/dist/tools/flow-tools.d.ts +24 -0
- package/dist/tools/flow-tools.d.ts.map +1 -0
- package/dist/tools/flow-tools.js +265 -0
- package/dist/tools/flow-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +71 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +165 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +62 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +195 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/smart-tools.d.ts +23 -0
- package/dist/tools/smart-tools.d.ts.map +1 -0
- package/dist/tools/smart-tools.js +482 -0
- package/dist/tools/smart-tools.js.map +1 -0
- package/dist/tools/snapshot-tools.d.ts +19 -0
- package/dist/tools/snapshot-tools.d.ts.map +1 -0
- package/dist/tools/snapshot-tools.js +149 -0
- package/dist/tools/snapshot-tools.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +142 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/token-counter.d.ts +51 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +181 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/install.ps1 +321 -0
- package/install.sh +345 -0
- package/package.json +94 -0
- package/setup.bat +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/knowledge-graph/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Decision Log
|
|
3
|
+
*
|
|
4
|
+
* Structured decision tracking that prevents agents from re-debating settled
|
|
5
|
+
* decisions. Supports full lifecycle (active → superseded → reversed), FTS5
|
|
6
|
+
* search, conflict detection, context-injection summaries, and markdown export.
|
|
7
|
+
*
|
|
8
|
+
* @module memory/decision-log
|
|
9
|
+
*/
|
|
10
|
+
import Database from 'better-sqlite3';
|
|
11
|
+
import type { Decision, MindMapConfig } from '../types.js';
|
|
12
|
+
/** Parameters for creating a new decision. */
|
|
13
|
+
export interface CreateDecisionInput {
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
rationale: string;
|
|
17
|
+
alternatives?: string[];
|
|
18
|
+
consequences?: string[];
|
|
19
|
+
relatedFiles?: string[];
|
|
20
|
+
tags?: string[];
|
|
21
|
+
decidedBy?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Parameters for querying decisions. */
|
|
24
|
+
export interface DecisionQuery {
|
|
25
|
+
/** Full-text search across title, description, rationale. */
|
|
26
|
+
text?: string;
|
|
27
|
+
/** Filter by status. */
|
|
28
|
+
status?: Decision['status'];
|
|
29
|
+
/** Filter by any matching tag. */
|
|
30
|
+
tags?: string[];
|
|
31
|
+
/** Filter by related file path. */
|
|
32
|
+
relatedFile?: string;
|
|
33
|
+
/** Maximum results. */
|
|
34
|
+
limit?: number;
|
|
35
|
+
}
|
|
36
|
+
/** Conflict detected between a new and existing decision. */
|
|
37
|
+
export interface DecisionConflict {
|
|
38
|
+
existingDecision: Decision;
|
|
39
|
+
similarity: number;
|
|
40
|
+
reason: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Manages a structured log of architectural/technical decisions.
|
|
44
|
+
*
|
|
45
|
+
* Each decision has a title, rationale, alternatives considered,
|
|
46
|
+
* consequences, and a lifecycle status. Settled decisions can be
|
|
47
|
+
* injected into agent context to avoid re-debating them.
|
|
48
|
+
*/
|
|
49
|
+
export declare class DecisionLog {
|
|
50
|
+
private db;
|
|
51
|
+
private maxDecisions;
|
|
52
|
+
private stmtInsert;
|
|
53
|
+
private stmtGetById;
|
|
54
|
+
private stmtUpdateStatus;
|
|
55
|
+
private stmtSupersede;
|
|
56
|
+
private stmtDelete;
|
|
57
|
+
private stmtAll;
|
|
58
|
+
private stmtActive;
|
|
59
|
+
private stmtByStatus;
|
|
60
|
+
private stmtCount;
|
|
61
|
+
private stmtSearchFts;
|
|
62
|
+
constructor(db: Database.Database, config?: Pick<MindMapConfig['memory'], 'maxDecisions'>);
|
|
63
|
+
private ensureSchema;
|
|
64
|
+
private prepareStatements;
|
|
65
|
+
/**
|
|
66
|
+
* Record a new decision.
|
|
67
|
+
*
|
|
68
|
+
* @returns The decision, plus any conflicts detected with existing active decisions.
|
|
69
|
+
*/
|
|
70
|
+
createDecision(input: CreateDecisionInput): {
|
|
71
|
+
decision: Decision;
|
|
72
|
+
conflicts: DecisionConflict[];
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Get a decision by ID.
|
|
76
|
+
*/
|
|
77
|
+
getDecision(id: number): Decision | null;
|
|
78
|
+
/**
|
|
79
|
+
* Delete a decision by ID.
|
|
80
|
+
*
|
|
81
|
+
* @returns `true` if the decision existed.
|
|
82
|
+
*/
|
|
83
|
+
deleteDecision(id: number): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Supersede an existing decision with a new one.
|
|
86
|
+
*
|
|
87
|
+
* The old decision's status becomes 'superseded' and links to the new one.
|
|
88
|
+
*
|
|
89
|
+
* @param oldId - The decision to supersede.
|
|
90
|
+
* @param newInput - The replacement decision.
|
|
91
|
+
* @returns The new decision.
|
|
92
|
+
*/
|
|
93
|
+
supersedeDecision(oldId: number, newInput: CreateDecisionInput): {
|
|
94
|
+
decision: Decision;
|
|
95
|
+
conflicts: DecisionConflict[];
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Reverse a decision (mark it as no longer valid).
|
|
99
|
+
*
|
|
100
|
+
* @returns The updated decision, or `null` if not found.
|
|
101
|
+
*/
|
|
102
|
+
reverseDecision(id: number): Decision | null;
|
|
103
|
+
/**
|
|
104
|
+
* Re-activate a previously superseded or reversed decision.
|
|
105
|
+
*/
|
|
106
|
+
reactivateDecision(id: number): Decision | null;
|
|
107
|
+
/**
|
|
108
|
+
* Query decisions with optional text search and filters.
|
|
109
|
+
*/
|
|
110
|
+
queryDecisions(query: DecisionQuery): Decision[];
|
|
111
|
+
/**
|
|
112
|
+
* Get all active decisions.
|
|
113
|
+
*/
|
|
114
|
+
getActiveDecisions(): Decision[];
|
|
115
|
+
/**
|
|
116
|
+
* Generate a compact summary of active decisions suitable for injecting
|
|
117
|
+
* into an agent's context window.
|
|
118
|
+
*
|
|
119
|
+
* Format:
|
|
120
|
+
* ```
|
|
121
|
+
* Active Decisions (3):
|
|
122
|
+
* 1. [DB] Use PostgreSQL over MongoDB — Need ACID for financial data
|
|
123
|
+
* 2. [Auth] JWT + refresh tokens — Stateless auth for microservices
|
|
124
|
+
* 3. [API] REST over GraphQL — Team expertise, simpler caching
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
generateContextSummary(): string;
|
|
128
|
+
/**
|
|
129
|
+
* Detect potential conflicts between a new decision and existing active ones.
|
|
130
|
+
*
|
|
131
|
+
* Uses tag overlap + title/description text similarity to flag decisions
|
|
132
|
+
* in the same domain that may contradict each other.
|
|
133
|
+
*/
|
|
134
|
+
private detectConflicts;
|
|
135
|
+
/**
|
|
136
|
+
* Export all decisions as a Markdown document.
|
|
137
|
+
*/
|
|
138
|
+
exportAsMarkdown(): string;
|
|
139
|
+
/**
|
|
140
|
+
* Remove oldest superseded/reversed decisions when over capacity.
|
|
141
|
+
*/
|
|
142
|
+
private enforceCapacity;
|
|
143
|
+
private buildFtsQuery;
|
|
144
|
+
private fallbackLikeSearch;
|
|
145
|
+
private tokenize;
|
|
146
|
+
private jaccardSimilarity;
|
|
147
|
+
private normalizePath;
|
|
148
|
+
private truncate;
|
|
149
|
+
private rowToDecision;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=decision-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-log.d.ts","sourceRoot":"","sources":["../../src/memory/decision-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Decision Log
|
|
3
|
+
*
|
|
4
|
+
* Structured decision tracking that prevents agents from re-debating settled
|
|
5
|
+
* decisions. Supports full lifecycle (active → superseded → reversed), FTS5
|
|
6
|
+
* search, conflict detection, context-injection summaries, and markdown export.
|
|
7
|
+
*
|
|
8
|
+
* @module memory/decision-log
|
|
9
|
+
*/
|
|
10
|
+
// ────────────────────────────────────────────────────────────────
|
|
11
|
+
// DecisionLog Class
|
|
12
|
+
// ────────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Manages a structured log of architectural/technical decisions.
|
|
15
|
+
*
|
|
16
|
+
* Each decision has a title, rationale, alternatives considered,
|
|
17
|
+
* consequences, and a lifecycle status. Settled decisions can be
|
|
18
|
+
* injected into agent context to avoid re-debating them.
|
|
19
|
+
*/
|
|
20
|
+
export class DecisionLog {
|
|
21
|
+
db;
|
|
22
|
+
maxDecisions;
|
|
23
|
+
// ── Prepared statements ────────────────────────────────────
|
|
24
|
+
stmtInsert;
|
|
25
|
+
stmtGetById;
|
|
26
|
+
stmtUpdateStatus;
|
|
27
|
+
stmtSupersede;
|
|
28
|
+
stmtDelete;
|
|
29
|
+
stmtAll;
|
|
30
|
+
stmtActive;
|
|
31
|
+
stmtByStatus;
|
|
32
|
+
stmtCount;
|
|
33
|
+
stmtSearchFts;
|
|
34
|
+
constructor(db, config) {
|
|
35
|
+
this.db = db;
|
|
36
|
+
this.maxDecisions = config?.maxDecisions ?? 200;
|
|
37
|
+
this.ensureSchema();
|
|
38
|
+
this.prepareStatements();
|
|
39
|
+
}
|
|
40
|
+
// ────────────────────────────────────────────────────────────
|
|
41
|
+
// Schema
|
|
42
|
+
// ────────────────────────────────────────────────────────────
|
|
43
|
+
ensureSchema() {
|
|
44
|
+
this.db.exec(`
|
|
45
|
+
CREATE TABLE IF NOT EXISTS decisions (
|
|
46
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
+
title TEXT NOT NULL,
|
|
48
|
+
description TEXT NOT NULL,
|
|
49
|
+
rationale TEXT NOT NULL,
|
|
50
|
+
alternatives TEXT NOT NULL DEFAULT '[]',
|
|
51
|
+
consequences TEXT NOT NULL DEFAULT '[]',
|
|
52
|
+
related_files TEXT NOT NULL DEFAULT '[]',
|
|
53
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
54
|
+
decided_at INTEGER NOT NULL,
|
|
55
|
+
decided_by TEXT NOT NULL DEFAULT 'agent',
|
|
56
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
57
|
+
superseded_by INTEGER
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_decisions_status ON decisions(status);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_decisions_decided_at ON decisions(decided_at DESC);
|
|
62
|
+
`);
|
|
63
|
+
// FTS5 for full-text search across title, description, rationale
|
|
64
|
+
try {
|
|
65
|
+
this.db.exec(`
|
|
66
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS decisions_fts USING fts5(
|
|
67
|
+
title,
|
|
68
|
+
description,
|
|
69
|
+
rationale,
|
|
70
|
+
tags,
|
|
71
|
+
content='decisions',
|
|
72
|
+
content_rowid='id',
|
|
73
|
+
tokenize='porter unicode61'
|
|
74
|
+
);
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Already exists; ignore
|
|
79
|
+
}
|
|
80
|
+
// Sync triggers
|
|
81
|
+
this.db.exec(`
|
|
82
|
+
CREATE TRIGGER IF NOT EXISTS decisions_ai AFTER INSERT ON decisions BEGIN
|
|
83
|
+
INSERT INTO decisions_fts(rowid, title, description, rationale, tags)
|
|
84
|
+
VALUES (new.id, new.title, new.description, new.rationale, new.tags);
|
|
85
|
+
END;
|
|
86
|
+
|
|
87
|
+
CREATE TRIGGER IF NOT EXISTS decisions_ad AFTER DELETE ON decisions BEGIN
|
|
88
|
+
INSERT INTO decisions_fts(decisions_fts, rowid, title, description, rationale, tags)
|
|
89
|
+
VALUES ('delete', old.id, old.title, old.description, old.rationale, old.tags);
|
|
90
|
+
END;
|
|
91
|
+
|
|
92
|
+
CREATE TRIGGER IF NOT EXISTS decisions_au
|
|
93
|
+
AFTER UPDATE OF title, description, rationale, tags ON decisions BEGIN
|
|
94
|
+
INSERT INTO decisions_fts(decisions_fts, rowid, title, description, rationale, tags)
|
|
95
|
+
VALUES ('delete', old.id, old.title, old.description, old.rationale, old.tags);
|
|
96
|
+
INSERT INTO decisions_fts(rowid, title, description, rationale, tags)
|
|
97
|
+
VALUES (new.id, new.title, new.description, new.rationale, new.tags);
|
|
98
|
+
END;
|
|
99
|
+
`);
|
|
100
|
+
}
|
|
101
|
+
prepareStatements() {
|
|
102
|
+
this.stmtInsert = this.db.prepare(`
|
|
103
|
+
INSERT INTO decisions (title, description, rationale, alternatives, consequences,
|
|
104
|
+
related_files, tags, decided_at, decided_by, status)
|
|
105
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'active')
|
|
106
|
+
`);
|
|
107
|
+
this.stmtGetById = this.db.prepare(`SELECT * FROM decisions WHERE id = ?`);
|
|
108
|
+
this.stmtUpdateStatus = this.db.prepare(`UPDATE decisions SET status = ? WHERE id = ?`);
|
|
109
|
+
this.stmtSupersede = this.db.prepare(`UPDATE decisions SET status = 'superseded', superseded_by = ? WHERE id = ?`);
|
|
110
|
+
this.stmtDelete = this.db.prepare(`DELETE FROM decisions WHERE id = ?`);
|
|
111
|
+
this.stmtAll = this.db.prepare(`SELECT * FROM decisions ORDER BY decided_at DESC`);
|
|
112
|
+
this.stmtActive = this.db.prepare(`SELECT * FROM decisions WHERE status = 'active' ORDER BY decided_at DESC`);
|
|
113
|
+
this.stmtByStatus = this.db.prepare(`SELECT * FROM decisions WHERE status = ? ORDER BY decided_at DESC`);
|
|
114
|
+
this.stmtCount = this.db.prepare(`SELECT COUNT(*) AS cnt FROM decisions`);
|
|
115
|
+
this.stmtSearchFts = this.db.prepare(`
|
|
116
|
+
SELECT d.*, bm25(decisions_fts, 10.0, 5.0, 5.0, 2.0) AS rank
|
|
117
|
+
FROM decisions_fts f
|
|
118
|
+
JOIN decisions d ON d.id = f.rowid
|
|
119
|
+
WHERE decisions_fts MATCH ?
|
|
120
|
+
ORDER BY rank
|
|
121
|
+
`);
|
|
122
|
+
}
|
|
123
|
+
// ────────────────────────────────────────────────────────────
|
|
124
|
+
// CRUD
|
|
125
|
+
// ────────────────────────────────────────────────────────────
|
|
126
|
+
/**
|
|
127
|
+
* Record a new decision.
|
|
128
|
+
*
|
|
129
|
+
* @returns The decision, plus any conflicts detected with existing active decisions.
|
|
130
|
+
*/
|
|
131
|
+
createDecision(input) {
|
|
132
|
+
const now = Date.now();
|
|
133
|
+
// ── Conflict detection ───────────────────────────────────
|
|
134
|
+
const conflicts = this.detectConflicts(input);
|
|
135
|
+
const info = this.stmtInsert.run(input.title, input.description, input.rationale, JSON.stringify(input.alternatives ?? []), JSON.stringify(input.consequences ?? []), JSON.stringify(input.relatedFiles ?? []), JSON.stringify(input.tags ?? []), now, input.decidedBy ?? 'agent');
|
|
136
|
+
// Enforce capacity
|
|
137
|
+
this.enforceCapacity();
|
|
138
|
+
const row = this.stmtGetById.get(Number(info.lastInsertRowid));
|
|
139
|
+
return { decision: this.rowToDecision(row), conflicts };
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get a decision by ID.
|
|
143
|
+
*/
|
|
144
|
+
getDecision(id) {
|
|
145
|
+
const row = this.stmtGetById.get(id);
|
|
146
|
+
return row ? this.rowToDecision(row) : null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delete a decision by ID.
|
|
150
|
+
*
|
|
151
|
+
* @returns `true` if the decision existed.
|
|
152
|
+
*/
|
|
153
|
+
deleteDecision(id) {
|
|
154
|
+
const info = this.stmtDelete.run(id);
|
|
155
|
+
return info.changes > 0;
|
|
156
|
+
}
|
|
157
|
+
// ────────────────────────────────────────────────────────────
|
|
158
|
+
// Lifecycle
|
|
159
|
+
// ────────────────────────────────────────────────────────────
|
|
160
|
+
/**
|
|
161
|
+
* Supersede an existing decision with a new one.
|
|
162
|
+
*
|
|
163
|
+
* The old decision's status becomes 'superseded' and links to the new one.
|
|
164
|
+
*
|
|
165
|
+
* @param oldId - The decision to supersede.
|
|
166
|
+
* @param newInput - The replacement decision.
|
|
167
|
+
* @returns The new decision.
|
|
168
|
+
*/
|
|
169
|
+
supersedeDecision(oldId, newInput) {
|
|
170
|
+
const old = this.stmtGetById.get(oldId);
|
|
171
|
+
if (!old) {
|
|
172
|
+
throw new Error(`Decision #${oldId} not found.`);
|
|
173
|
+
}
|
|
174
|
+
const { decision: newDec, conflicts } = this.createDecision(newInput);
|
|
175
|
+
// Mark old as superseded
|
|
176
|
+
this.stmtSupersede.run(newDec.id, oldId);
|
|
177
|
+
return { decision: newDec, conflicts };
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Reverse a decision (mark it as no longer valid).
|
|
181
|
+
*
|
|
182
|
+
* @returns The updated decision, or `null` if not found.
|
|
183
|
+
*/
|
|
184
|
+
reverseDecision(id) {
|
|
185
|
+
const row = this.stmtGetById.get(id);
|
|
186
|
+
if (!row)
|
|
187
|
+
return null;
|
|
188
|
+
this.stmtUpdateStatus.run('reversed', id);
|
|
189
|
+
const updated = this.stmtGetById.get(id);
|
|
190
|
+
return this.rowToDecision(updated);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Re-activate a previously superseded or reversed decision.
|
|
194
|
+
*/
|
|
195
|
+
reactivateDecision(id) {
|
|
196
|
+
const row = this.stmtGetById.get(id);
|
|
197
|
+
if (!row)
|
|
198
|
+
return null;
|
|
199
|
+
this.stmtUpdateStatus.run('active', id);
|
|
200
|
+
const updated = this.stmtGetById.get(id);
|
|
201
|
+
return this.rowToDecision(updated);
|
|
202
|
+
}
|
|
203
|
+
// ────────────────────────────────────────────────────────────
|
|
204
|
+
// Querying
|
|
205
|
+
// ────────────────────────────────────────────────────────────
|
|
206
|
+
/**
|
|
207
|
+
* Query decisions with optional text search and filters.
|
|
208
|
+
*/
|
|
209
|
+
queryDecisions(query) {
|
|
210
|
+
const limit = query.limit ?? 50;
|
|
211
|
+
let rows;
|
|
212
|
+
// FTS path
|
|
213
|
+
if (query.text && query.text.trim().length > 0) {
|
|
214
|
+
const ftsQuery = this.buildFtsQuery(query.text);
|
|
215
|
+
try {
|
|
216
|
+
rows = this.stmtSearchFts.all(ftsQuery);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
rows = this.fallbackLikeSearch(query.text);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (query.status) {
|
|
223
|
+
rows = this.stmtByStatus.all(query.status);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
rows = this.stmtAll.all();
|
|
227
|
+
}
|
|
228
|
+
let decisions = rows.map(r => this.rowToDecision(r));
|
|
229
|
+
// Apply status filter (if FTS was used, status wasn't filtered yet)
|
|
230
|
+
if (query.status && query.text) {
|
|
231
|
+
decisions = decisions.filter(d => d.status === query.status);
|
|
232
|
+
}
|
|
233
|
+
// Tag filter
|
|
234
|
+
if (query.tags && query.tags.length > 0) {
|
|
235
|
+
const tagSet = new Set(query.tags.map(t => t.toLowerCase()));
|
|
236
|
+
decisions = decisions.filter(d => d.tags.some(t => tagSet.has(t.toLowerCase())));
|
|
237
|
+
}
|
|
238
|
+
// Related file filter
|
|
239
|
+
if (query.relatedFile) {
|
|
240
|
+
const norm = this.normalizePath(query.relatedFile);
|
|
241
|
+
decisions = decisions.filter(d => d.relatedFiles.some(f => this.normalizePath(f) === norm));
|
|
242
|
+
}
|
|
243
|
+
return decisions.slice(0, limit);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get all active decisions.
|
|
247
|
+
*/
|
|
248
|
+
getActiveDecisions() {
|
|
249
|
+
const rows = this.stmtActive.all();
|
|
250
|
+
return rows.map(r => this.rowToDecision(r));
|
|
251
|
+
}
|
|
252
|
+
// ────────────────────────────────────────────────────────────
|
|
253
|
+
// Context Injection Summary
|
|
254
|
+
// ────────────────────────────────────────────────────────────
|
|
255
|
+
/**
|
|
256
|
+
* Generate a compact summary of active decisions suitable for injecting
|
|
257
|
+
* into an agent's context window.
|
|
258
|
+
*
|
|
259
|
+
* Format:
|
|
260
|
+
* ```
|
|
261
|
+
* Active Decisions (3):
|
|
262
|
+
* 1. [DB] Use PostgreSQL over MongoDB — Need ACID for financial data
|
|
263
|
+
* 2. [Auth] JWT + refresh tokens — Stateless auth for microservices
|
|
264
|
+
* 3. [API] REST over GraphQL — Team expertise, simpler caching
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
generateContextSummary() {
|
|
268
|
+
const active = this.getActiveDecisions();
|
|
269
|
+
if (active.length === 0)
|
|
270
|
+
return 'No active decisions recorded.';
|
|
271
|
+
const lines = [`Active Decisions (${active.length}):`];
|
|
272
|
+
for (let i = 0; i < active.length; i++) {
|
|
273
|
+
const d = active[i];
|
|
274
|
+
const tagStr = d.tags.length > 0 ? `[${d.tags[0]}] ` : '';
|
|
275
|
+
const rationale = this.truncate(d.rationale, 60);
|
|
276
|
+
lines.push(`${i + 1}. ${tagStr}${d.title} — ${rationale}`);
|
|
277
|
+
}
|
|
278
|
+
return lines.join('\n');
|
|
279
|
+
}
|
|
280
|
+
// ────────────────────────────────────────────────────────────
|
|
281
|
+
// Conflict Detection
|
|
282
|
+
// ────────────────────────────────────────────────────────────
|
|
283
|
+
/**
|
|
284
|
+
* Detect potential conflicts between a new decision and existing active ones.
|
|
285
|
+
*
|
|
286
|
+
* Uses tag overlap + title/description text similarity to flag decisions
|
|
287
|
+
* in the same domain that may contradict each other.
|
|
288
|
+
*/
|
|
289
|
+
detectConflicts(input) {
|
|
290
|
+
const active = this.getActiveDecisions();
|
|
291
|
+
const conflicts = [];
|
|
292
|
+
const inputWords = this.tokenize(`${input.title} ${input.description}`);
|
|
293
|
+
const inputTags = new Set((input.tags ?? []).map(t => t.toLowerCase()));
|
|
294
|
+
for (const existing of active) {
|
|
295
|
+
// Tag overlap
|
|
296
|
+
const existingTags = new Set(existing.tags.map(t => t.toLowerCase()));
|
|
297
|
+
let tagOverlap = 0;
|
|
298
|
+
for (const tag of inputTags) {
|
|
299
|
+
if (existingTags.has(tag))
|
|
300
|
+
tagOverlap++;
|
|
301
|
+
}
|
|
302
|
+
// Text similarity
|
|
303
|
+
const existingWords = this.tokenize(`${existing.title} ${existing.description}`);
|
|
304
|
+
const textSim = this.jaccardSimilarity(inputWords, existingWords);
|
|
305
|
+
// Combined similarity: tag overlap is a strong signal
|
|
306
|
+
const tagBonus = inputTags.size > 0
|
|
307
|
+
? (tagOverlap / Math.max(inputTags.size, existingTags.size)) * 0.4
|
|
308
|
+
: 0;
|
|
309
|
+
const similarity = textSim * 0.6 + tagBonus;
|
|
310
|
+
if (similarity >= 0.3) {
|
|
311
|
+
conflicts.push({
|
|
312
|
+
existingDecision: existing,
|
|
313
|
+
similarity,
|
|
314
|
+
reason: tagOverlap > 0
|
|
315
|
+
? `Shares tag(s) and similar topic with decision #${existing.id}: "${existing.title}"`
|
|
316
|
+
: `Similar topic to decision #${existing.id}: "${existing.title}"`,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Sort by highest similarity first
|
|
321
|
+
conflicts.sort((a, b) => b.similarity - a.similarity);
|
|
322
|
+
return conflicts;
|
|
323
|
+
}
|
|
324
|
+
// ────────────────────────────────────────────────────────────
|
|
325
|
+
// Markdown Export
|
|
326
|
+
// ────────────────────────────────────────────────────────────
|
|
327
|
+
/**
|
|
328
|
+
* Export all decisions as a Markdown document.
|
|
329
|
+
*/
|
|
330
|
+
exportAsMarkdown() {
|
|
331
|
+
const all = this.stmtAll.all().map(r => this.rowToDecision(r));
|
|
332
|
+
const active = all.filter(d => d.status === 'active');
|
|
333
|
+
const superseded = all.filter(d => d.status === 'superseded');
|
|
334
|
+
const reversed = all.filter(d => d.status === 'reversed');
|
|
335
|
+
const lines = [
|
|
336
|
+
'# Decision Log',
|
|
337
|
+
'',
|
|
338
|
+
`> Generated ${new Date().toISOString()} — ${all.length} total decisions`,
|
|
339
|
+
'',
|
|
340
|
+
];
|
|
341
|
+
const renderSection = (title, decisions) => {
|
|
342
|
+
if (decisions.length === 0)
|
|
343
|
+
return;
|
|
344
|
+
lines.push(`## ${title} (${decisions.length})`, '');
|
|
345
|
+
for (const d of decisions) {
|
|
346
|
+
lines.push(`### ${d.id}. ${d.title}`, '');
|
|
347
|
+
lines.push(`**Status:** ${d.status}`);
|
|
348
|
+
lines.push(`**Decided:** ${new Date(d.decidedAt).toISOString()} by ${d.decidedBy}`);
|
|
349
|
+
if (d.tags.length > 0) {
|
|
350
|
+
lines.push(`**Tags:** ${d.tags.join(', ')}`);
|
|
351
|
+
}
|
|
352
|
+
lines.push('');
|
|
353
|
+
lines.push(d.description, '');
|
|
354
|
+
lines.push(`**Rationale:** ${d.rationale}`, '');
|
|
355
|
+
if (d.alternatives.length > 0) {
|
|
356
|
+
lines.push('**Alternatives considered:**');
|
|
357
|
+
for (const alt of d.alternatives) {
|
|
358
|
+
lines.push(`- ${alt}`);
|
|
359
|
+
}
|
|
360
|
+
lines.push('');
|
|
361
|
+
}
|
|
362
|
+
if (d.consequences.length > 0) {
|
|
363
|
+
lines.push('**Consequences:**');
|
|
364
|
+
for (const con of d.consequences) {
|
|
365
|
+
lines.push(`- ${con}`);
|
|
366
|
+
}
|
|
367
|
+
lines.push('');
|
|
368
|
+
}
|
|
369
|
+
if (d.relatedFiles.length > 0) {
|
|
370
|
+
lines.push(`**Related files:** ${d.relatedFiles.join(', ')}`);
|
|
371
|
+
lines.push('');
|
|
372
|
+
}
|
|
373
|
+
if (d.supersededBy !== undefined) {
|
|
374
|
+
lines.push(`**Superseded by:** Decision #${d.supersededBy}`);
|
|
375
|
+
lines.push('');
|
|
376
|
+
}
|
|
377
|
+
lines.push('---', '');
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
renderSection('Active Decisions', active);
|
|
381
|
+
renderSection('Superseded Decisions', superseded);
|
|
382
|
+
renderSection('Reversed Decisions', reversed);
|
|
383
|
+
return lines.join('\n');
|
|
384
|
+
}
|
|
385
|
+
// ────────────────────────────────────────────────────────────
|
|
386
|
+
// Capacity Management
|
|
387
|
+
// ────────────────────────────────────────────────────────────
|
|
388
|
+
/**
|
|
389
|
+
* Remove oldest superseded/reversed decisions when over capacity.
|
|
390
|
+
*/
|
|
391
|
+
enforceCapacity() {
|
|
392
|
+
const countRow = this.stmtCount.get();
|
|
393
|
+
const excess = countRow.cnt - this.maxDecisions;
|
|
394
|
+
if (excess <= 0)
|
|
395
|
+
return;
|
|
396
|
+
// Remove oldest non-active decisions first
|
|
397
|
+
const toRemove = this.db
|
|
398
|
+
.prepare(`SELECT id FROM decisions
|
|
399
|
+
WHERE status != 'active'
|
|
400
|
+
ORDER BY decided_at ASC
|
|
401
|
+
LIMIT ?`)
|
|
402
|
+
.all(excess);
|
|
403
|
+
const txn = this.db.transaction(() => {
|
|
404
|
+
for (const { id } of toRemove) {
|
|
405
|
+
this.stmtDelete.run(id);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
txn();
|
|
409
|
+
}
|
|
410
|
+
// ────────────────────────────────────────────────────────────
|
|
411
|
+
// FTS Helpers
|
|
412
|
+
// ────────────────────────────────────────────────────────────
|
|
413
|
+
buildFtsQuery(text) {
|
|
414
|
+
const words = text
|
|
415
|
+
.replace(/[^\w\s]/g, ' ')
|
|
416
|
+
.split(/\s+/)
|
|
417
|
+
.filter(w => w.length > 0);
|
|
418
|
+
if (words.length === 0)
|
|
419
|
+
return '""';
|
|
420
|
+
return words.map(w => `"${w}"`).join(' OR ');
|
|
421
|
+
}
|
|
422
|
+
fallbackLikeSearch(text) {
|
|
423
|
+
const pattern = `%${text}%`;
|
|
424
|
+
return this.db
|
|
425
|
+
.prepare(`SELECT *, 0 AS rank FROM decisions
|
|
426
|
+
WHERE title LIKE ? OR description LIKE ? OR rationale LIKE ?
|
|
427
|
+
ORDER BY decided_at DESC LIMIT 50`)
|
|
428
|
+
.all(pattern, pattern, pattern);
|
|
429
|
+
}
|
|
430
|
+
// ────────────────────────────────────────────────────────────
|
|
431
|
+
// Text Similarity
|
|
432
|
+
// ────────────────────────────────────────────────────────────
|
|
433
|
+
tokenize(text) {
|
|
434
|
+
return new Set(text
|
|
435
|
+
.toLowerCase()
|
|
436
|
+
.replace(/[^\w\s]/g, ' ')
|
|
437
|
+
.split(/\s+/)
|
|
438
|
+
.filter(w => w.length > 1));
|
|
439
|
+
}
|
|
440
|
+
jaccardSimilarity(a, b) {
|
|
441
|
+
if (a.size === 0 && b.size === 0)
|
|
442
|
+
return 1;
|
|
443
|
+
let intersection = 0;
|
|
444
|
+
for (const word of a) {
|
|
445
|
+
if (b.has(word))
|
|
446
|
+
intersection++;
|
|
447
|
+
}
|
|
448
|
+
const union = a.size + b.size - intersection;
|
|
449
|
+
return union === 0 ? 0 : intersection / union;
|
|
450
|
+
}
|
|
451
|
+
normalizePath(p) {
|
|
452
|
+
return p.replace(/\\/g, '/').toLowerCase();
|
|
453
|
+
}
|
|
454
|
+
truncate(text, maxLen) {
|
|
455
|
+
if (text.length <= maxLen)
|
|
456
|
+
return text;
|
|
457
|
+
return text.slice(0, maxLen - 3) + '...';
|
|
458
|
+
}
|
|
459
|
+
// ────────────────────────────────────────────────────────────
|
|
460
|
+
// Row → Domain Object
|
|
461
|
+
// ────────────────────────────────────────────────────────────
|
|
462
|
+
rowToDecision(row) {
|
|
463
|
+
const dec = {
|
|
464
|
+
id: row.id,
|
|
465
|
+
title: row.title,
|
|
466
|
+
description: row.description,
|
|
467
|
+
rationale: row.rationale,
|
|
468
|
+
alternatives: JSON.parse(row.alternatives || '[]'),
|
|
469
|
+
consequences: JSON.parse(row.consequences || '[]'),
|
|
470
|
+
relatedFiles: JSON.parse(row.related_files || '[]'),
|
|
471
|
+
tags: JSON.parse(row.tags || '[]'),
|
|
472
|
+
decidedAt: row.decided_at,
|
|
473
|
+
decidedBy: row.decided_by,
|
|
474
|
+
status: row.status,
|
|
475
|
+
};
|
|
476
|
+
if (row.superseded_by != null) {
|
|
477
|
+
dec.supersededBy = row.superseded_by;
|
|
478
|
+
}
|
|
479
|
+
return dec;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
//# sourceMappingURL=decision-log.js.map
|