@ansvar/us-regulations-mcp 1.0.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 +190 -0
- package/README.md +275 -0
- package/data/.gitkeep +0 -0
- package/data/regulations.db +0 -0
- package/data/seed/applicability/rules.json +74 -0
- package/data/seed/mappings/ccpa-nist-csf.json +144 -0
- package/data/seed/mappings/hipaa-nist-800-53.json +377 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/adapters/california-leginfo.d.ts +72 -0
- package/dist/ingest/adapters/california-leginfo.d.ts.map +1 -0
- package/dist/ingest/adapters/california-leginfo.js +270 -0
- package/dist/ingest/adapters/california-leginfo.js.map +1 -0
- package/dist/ingest/adapters/ecfr.d.ts +76 -0
- package/dist/ingest/adapters/ecfr.d.ts.map +1 -0
- package/dist/ingest/adapters/ecfr.js +355 -0
- package/dist/ingest/adapters/ecfr.js.map +1 -0
- package/dist/ingest/adapters/regulations-gov.d.ts +47 -0
- package/dist/ingest/adapters/regulations-gov.d.ts.map +1 -0
- package/dist/ingest/adapters/regulations-gov.js +91 -0
- package/dist/ingest/adapters/regulations-gov.js.map +1 -0
- package/dist/ingest/framework.d.ts +84 -0
- package/dist/ingest/framework.d.ts.map +1 -0
- package/dist/ingest/framework.js +8 -0
- package/dist/ingest/framework.js.map +1 -0
- package/dist/tools/action-items.d.ts +23 -0
- package/dist/tools/action-items.d.ts.map +1 -0
- package/dist/tools/action-items.js +118 -0
- package/dist/tools/action-items.js.map +1 -0
- package/dist/tools/applicability.d.ts +26 -0
- package/dist/tools/applicability.d.ts.map +1 -0
- package/dist/tools/applicability.js +49 -0
- package/dist/tools/applicability.js.map +1 -0
- package/dist/tools/compare.d.ts +20 -0
- package/dist/tools/compare.d.ts.map +1 -0
- package/dist/tools/compare.js +35 -0
- package/dist/tools/compare.js.map +1 -0
- package/dist/tools/definitions.d.ts +22 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +43 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/evidence.d.ts +23 -0
- package/dist/tools/evidence.d.ts.map +1 -0
- package/dist/tools/evidence.js +27 -0
- package/dist/tools/evidence.js.map +1 -0
- package/dist/tools/list.d.ts +25 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +66 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/map.d.ts +26 -0
- package/dist/tools/map.d.ts.map +1 -0
- package/dist/tools/map.js +58 -0
- package/dist/tools/map.js.map +1 -0
- package/dist/tools/registry.d.ts +19 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +260 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.d.ts +15 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +94 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/section.d.ts +19 -0
- package/dist/tools/section.d.ts.map +1 -0
- package/dist/tools/section.js +50 -0
- package/dist/tools/section.js.map +1 -0
- package/package.json +76 -0
- package/scripts/build-db.ts +268 -0
- package/scripts/ingest.ts +214 -0
- package/scripts/load-seed-data.ts +133 -0
- package/scripts/quality-test.ts +346 -0
- package/scripts/test-mcp-tools.ts +187 -0
- package/scripts/test-remaining-tools.ts +107 -0
- package/src/index.ts +55 -0
- package/src/ingest/adapters/california-leginfo.ts +322 -0
- package/src/ingest/adapters/ecfr.ts +403 -0
- package/src/ingest/adapters/regulations-gov.ts +112 -0
- package/src/ingest/framework.ts +92 -0
- package/src/tools/action-items.ts +164 -0
- package/src/tools/applicability.ts +91 -0
- package/src/tools/compare.ts +61 -0
- package/src/tools/definitions.ts +79 -0
- package/src/tools/evidence.ts +53 -0
- package/src/tools/list.ts +120 -0
- package/src/tools/map.ts +100 -0
- package/src/tools/registry.ts +275 -0
- package/src/tools/search.ts +132 -0
- package/src/tools/section.ts +85 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* eCFR Adapter (Electronic Code of Federal Regulations)
|
|
3
|
+
*
|
|
4
|
+
* Fetches HIPAA regulations from ecfr.gov API.
|
|
5
|
+
* Source: 45 CFR Parts 160, 162, 164 (Privacy Rule, Security Rule, Breach Notification)
|
|
6
|
+
*
|
|
7
|
+
* PRODUCTION IMPLEMENTATION
|
|
8
|
+
* Uses the eCFR API: https://www.ecfr.gov/developers/documentation/api/v1
|
|
9
|
+
*/
|
|
10
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
11
|
+
/**
|
|
12
|
+
* Adapter for fetching HIPAA from eCFR API
|
|
13
|
+
*/
|
|
14
|
+
export class EcfrAdapter {
|
|
15
|
+
regulationId;
|
|
16
|
+
cfr_title;
|
|
17
|
+
cfr_parts;
|
|
18
|
+
constructor(regulationId, cfr_title, cfr_parts) {
|
|
19
|
+
this.regulationId = regulationId;
|
|
20
|
+
this.cfr_title = cfr_title;
|
|
21
|
+
this.cfr_parts = cfr_parts;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Fetch HIPAA metadata
|
|
25
|
+
*
|
|
26
|
+
* PLACEHOLDER: Returns hardcoded HIPAA metadata
|
|
27
|
+
* TODO: Integrate with eCFR API to fetch live metadata
|
|
28
|
+
*/
|
|
29
|
+
async fetchMetadata() {
|
|
30
|
+
// Placeholder metadata for HIPAA
|
|
31
|
+
return {
|
|
32
|
+
id: this.regulationId,
|
|
33
|
+
full_name: 'Health Insurance Portability and Accountability Act',
|
|
34
|
+
citation: '45 CFR Parts 160, 162, 164',
|
|
35
|
+
effective_date: '2003-04-14',
|
|
36
|
+
last_amended: '2013-01-25',
|
|
37
|
+
source_url: 'https://www.ecfr.gov/current/title-45',
|
|
38
|
+
jurisdiction: 'federal',
|
|
39
|
+
regulation_type: 'rule',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Fetch all HIPAA sections
|
|
44
|
+
*
|
|
45
|
+
* Fetches XML from eCFR API and parses sections with hierarchical structure
|
|
46
|
+
* API endpoint: https://www.ecfr.gov/api/versioner/v1/full/{date}/title-{title}.xml
|
|
47
|
+
*/
|
|
48
|
+
async *fetchSections() {
|
|
49
|
+
// Get the latest available date for this title
|
|
50
|
+
const date = await this.getLatestDate();
|
|
51
|
+
const url = `https://www.ecfr.gov/api/versioner/v1/full/${date}/title-${this.cfr_title}.xml`;
|
|
52
|
+
console.log(`Fetching eCFR Title ${this.cfr_title} from ${url}...`);
|
|
53
|
+
// Fetch XML with retry logic
|
|
54
|
+
const response = await this.fetchWithRetry(url);
|
|
55
|
+
const xmlText = await response.text();
|
|
56
|
+
// Parse XML
|
|
57
|
+
const parser = new XMLParser({
|
|
58
|
+
ignoreAttributes: false,
|
|
59
|
+
attributeNamePrefix: '@_',
|
|
60
|
+
textNodeName: '#text',
|
|
61
|
+
preserveOrder: false,
|
|
62
|
+
});
|
|
63
|
+
const xmlDoc = parser.parse(xmlText);
|
|
64
|
+
// Extract sections from relevant parts
|
|
65
|
+
const sections = [];
|
|
66
|
+
// Navigate XML structure: ECFR → DIV1 (Title) → DIV5 (Part) → DIV8 (Section)
|
|
67
|
+
// The structure is: DIV1 (title) → DIV2 (subtitle) → DIV4 (subchapter) → DIV5 (part) → DIV8 (section)
|
|
68
|
+
const title = xmlDoc.ECFR?.DIV1;
|
|
69
|
+
if (!title) {
|
|
70
|
+
console.warn(`No title found in eCFR XML for Title ${this.cfr_title}`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Find all DIV5 (parts) recursively
|
|
74
|
+
const findParts = (node) => {
|
|
75
|
+
if (!node || typeof node !== 'object')
|
|
76
|
+
return [];
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (node.DIV5) {
|
|
79
|
+
const div5s = Array.isArray(node.DIV5) ? node.DIV5 : [node.DIV5];
|
|
80
|
+
parts.push(...div5s.filter(Boolean));
|
|
81
|
+
}
|
|
82
|
+
// Recurse into child DIVs
|
|
83
|
+
for (const key of Object.keys(node)) {
|
|
84
|
+
if (key.startsWith('DIV') && key !== 'DIV5' && typeof node[key] === 'object') {
|
|
85
|
+
const childNodes = Array.isArray(node[key]) ? node[key] : [node[key]];
|
|
86
|
+
for (const child of childNodes) {
|
|
87
|
+
parts.push(...findParts(child));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return parts;
|
|
92
|
+
};
|
|
93
|
+
const parts = findParts(title);
|
|
94
|
+
console.log(` Found ${parts.length} parts in Title ${this.cfr_title}`);
|
|
95
|
+
for (const part of parts) {
|
|
96
|
+
const partNum = this.extractNumber(part['@_N']);
|
|
97
|
+
// Only process our target parts
|
|
98
|
+
if (!this.cfr_parts.includes(partNum)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
console.log(` Processing Part ${partNum}...`);
|
|
102
|
+
// Sections are in DIV6 (subparts) → DIV8 (sections)
|
|
103
|
+
const findSections = (node) => {
|
|
104
|
+
if (!node || typeof node !== 'object')
|
|
105
|
+
return [];
|
|
106
|
+
const secs = [];
|
|
107
|
+
// If this node has DIV8, collect them
|
|
108
|
+
if (node.DIV8) {
|
|
109
|
+
const div8s = Array.isArray(node.DIV8) ? node.DIV8 : [node.DIV8];
|
|
110
|
+
secs.push(...div8s.filter(Boolean));
|
|
111
|
+
}
|
|
112
|
+
// Recurse into DIV6 (subparts) and other child DIVs
|
|
113
|
+
for (const key of Object.keys(node)) {
|
|
114
|
+
if (key.startsWith('DIV') && key !== 'DIV8' && typeof node[key] === 'object') {
|
|
115
|
+
const childNodes = Array.isArray(node[key]) ? node[key] : [node[key]];
|
|
116
|
+
for (const child of childNodes) {
|
|
117
|
+
secs.push(...findSections(child));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return secs;
|
|
122
|
+
};
|
|
123
|
+
const sectionDivs = findSections(part);
|
|
124
|
+
console.log(` Found ${sectionDivs.length} sections in Part ${partNum}`);
|
|
125
|
+
for (const sectionDiv of sectionDivs) {
|
|
126
|
+
const section = this.parseSection(sectionDiv, partNum, '');
|
|
127
|
+
if (section) {
|
|
128
|
+
sections.push(section);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Yield in batches of 50
|
|
132
|
+
if (sections.length >= 50) {
|
|
133
|
+
yield sections.splice(0, 50);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Yield remaining sections
|
|
137
|
+
if (sections.length > 0) {
|
|
138
|
+
yield sections;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Parse a section from XML DIV8 element
|
|
143
|
+
*/
|
|
144
|
+
parseSection(div, partNum, subpartId) {
|
|
145
|
+
const sectionNum = div['@_N'];
|
|
146
|
+
if (!sectionNum)
|
|
147
|
+
return null;
|
|
148
|
+
// Extract section text
|
|
149
|
+
const text = this.extractText(div);
|
|
150
|
+
if (!text || text.length < 10)
|
|
151
|
+
return null;
|
|
152
|
+
// Extract title (HEAD)
|
|
153
|
+
const title = div.HEAD ? this.extractText(div.HEAD) : undefined;
|
|
154
|
+
// Build section number - eCFR @_N already includes part number (e.g., "164.308")
|
|
155
|
+
// Don't prepend if section already starts with part number
|
|
156
|
+
const fullSectionNum = sectionNum.startsWith(`${partNum}.`)
|
|
157
|
+
? sectionNum
|
|
158
|
+
: `${partNum}.${sectionNum}`;
|
|
159
|
+
// Extract cross-references (CITA tags)
|
|
160
|
+
const crossReferences = this.extractCrossReferences(div);
|
|
161
|
+
return {
|
|
162
|
+
sectionNumber: fullSectionNum,
|
|
163
|
+
title,
|
|
164
|
+
text,
|
|
165
|
+
chapter: `Part ${partNum}, Subpart ${subpartId}`,
|
|
166
|
+
parentSection: undefined, // TODO: implement parent detection for nested sections
|
|
167
|
+
crossReferences: crossReferences.length > 0 ? crossReferences : undefined,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extract text content from XML element recursively
|
|
172
|
+
*/
|
|
173
|
+
extractText(element) {
|
|
174
|
+
if (typeof element === 'string') {
|
|
175
|
+
return element.trim();
|
|
176
|
+
}
|
|
177
|
+
if (typeof element === 'object') {
|
|
178
|
+
if (element['#text']) {
|
|
179
|
+
const text = element['#text'];
|
|
180
|
+
return typeof text === 'string' ? text.trim() : String(text).trim();
|
|
181
|
+
}
|
|
182
|
+
// Recursively extract from child elements
|
|
183
|
+
const texts = [];
|
|
184
|
+
for (const key of Object.keys(element)) {
|
|
185
|
+
if (key.startsWith('@_'))
|
|
186
|
+
continue; // Skip attributes
|
|
187
|
+
if (key === 'HEAD')
|
|
188
|
+
continue; // Skip title
|
|
189
|
+
const child = element[key];
|
|
190
|
+
if (Array.isArray(child)) {
|
|
191
|
+
for (const item of child) {
|
|
192
|
+
const text = this.extractText(item);
|
|
193
|
+
if (text)
|
|
194
|
+
texts.push(text);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const text = this.extractText(child);
|
|
199
|
+
if (text)
|
|
200
|
+
texts.push(text);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return texts.join(' ').trim();
|
|
204
|
+
}
|
|
205
|
+
return '';
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Extract cross-references from CITA tags
|
|
209
|
+
*/
|
|
210
|
+
extractCrossReferences(element) {
|
|
211
|
+
const refs = [];
|
|
212
|
+
const findCITA = (obj) => {
|
|
213
|
+
if (typeof obj !== 'object')
|
|
214
|
+
return;
|
|
215
|
+
for (const key of Object.keys(obj)) {
|
|
216
|
+
if (key === 'CITA') {
|
|
217
|
+
const cita = obj[key];
|
|
218
|
+
if (Array.isArray(cita)) {
|
|
219
|
+
refs.push(...cita.map(c => this.extractText(c)).filter(Boolean));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const ref = this.extractText(cita);
|
|
223
|
+
if (ref)
|
|
224
|
+
refs.push(ref);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else if (typeof obj[key] === 'object') {
|
|
228
|
+
findCITA(obj[key]);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
findCITA(element);
|
|
233
|
+
return refs;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Extract numeric part from section number
|
|
237
|
+
*/
|
|
238
|
+
extractNumber(str) {
|
|
239
|
+
if (!str)
|
|
240
|
+
return 0;
|
|
241
|
+
const match = str.match(/\d+/);
|
|
242
|
+
return match ? parseInt(match[0]) : 0;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get the latest available date for this title from eCFR titles API
|
|
246
|
+
*/
|
|
247
|
+
async getLatestDate() {
|
|
248
|
+
try {
|
|
249
|
+
const response = await fetch('https://www.ecfr.gov/api/versioner/v1/titles');
|
|
250
|
+
const data = await response.json();
|
|
251
|
+
const titleInfo = data.titles.find((t) => t.number === this.cfr_title);
|
|
252
|
+
if (titleInfo && titleInfo.latest_issue_date) {
|
|
253
|
+
return titleInfo.latest_issue_date;
|
|
254
|
+
}
|
|
255
|
+
// Fallback to current date
|
|
256
|
+
return new Date().toISOString().split('T')[0];
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
console.warn('Failed to fetch latest date, using current date:', error);
|
|
260
|
+
return new Date().toISOString().split('T')[0];
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Fetch with retry logic and exponential backoff
|
|
265
|
+
*/
|
|
266
|
+
async fetchWithRetry(url, maxRetries = 3) {
|
|
267
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
268
|
+
try {
|
|
269
|
+
const response = await fetch(url);
|
|
270
|
+
if (response.status === 429) {
|
|
271
|
+
// Rate limited - backoff
|
|
272
|
+
const delay = Math.min(1000 * 2 ** attempt + Math.random() * 1000, 30000);
|
|
273
|
+
console.warn(`Rate limited, retrying in ${delay}ms...`);
|
|
274
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (!response.ok) {
|
|
278
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
279
|
+
}
|
|
280
|
+
return response;
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
if (attempt === maxRetries - 1)
|
|
284
|
+
throw error;
|
|
285
|
+
const delay = 1000 * 2 ** attempt;
|
|
286
|
+
console.warn(`Fetch failed, retrying in ${delay}ms...`, error);
|
|
287
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
throw new Error('Max retries exceeded');
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Check for updates since last fetch
|
|
294
|
+
*
|
|
295
|
+
* Queries eCFR API for revision dates and compares with lastFetched
|
|
296
|
+
* eCFR updates daily from Federal Register
|
|
297
|
+
*/
|
|
298
|
+
async checkForUpdates(lastFetched) {
|
|
299
|
+
try {
|
|
300
|
+
// eCFR provides last-modified in HTTP headers
|
|
301
|
+
const date = new Date().toISOString().split('T')[0];
|
|
302
|
+
const url = `https://www.ecfr.gov/api/versioner/v1/full/${date}/title-${this.cfr_title}.xml`;
|
|
303
|
+
const response = await fetch(url, { method: 'HEAD' });
|
|
304
|
+
const lastModifiedHeader = response.headers.get('last-modified');
|
|
305
|
+
if (!lastModifiedHeader) {
|
|
306
|
+
console.warn('No last-modified header from eCFR');
|
|
307
|
+
return {
|
|
308
|
+
hasChanges: false,
|
|
309
|
+
lastModified: new Date(),
|
|
310
|
+
changes: [],
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
const lastModified = new Date(lastModifiedHeader);
|
|
314
|
+
return {
|
|
315
|
+
hasChanges: lastModified > lastFetched,
|
|
316
|
+
lastModified,
|
|
317
|
+
changes: lastModified > lastFetched
|
|
318
|
+
? [`Title ${this.cfr_title} updated on ${lastModified.toISOString()}`]
|
|
319
|
+
: [],
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
console.error('Error checking for updates:', error);
|
|
324
|
+
return {
|
|
325
|
+
hasChanges: false,
|
|
326
|
+
lastModified: new Date(),
|
|
327
|
+
changes: [],
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Extract definitions from HIPAA sections
|
|
333
|
+
*
|
|
334
|
+
* Future enhancement: Parse definition sections (e.g., 45 CFR 160.103, 164.103)
|
|
335
|
+
* For now, returns empty array - definitions can be added manually if needed
|
|
336
|
+
*/
|
|
337
|
+
async extractDefinitions() {
|
|
338
|
+
// TODO: Implement definition extraction
|
|
339
|
+
// HIPAA definitions are in:
|
|
340
|
+
// - 45 CFR 160.103 (General definitions)
|
|
341
|
+
// - 45 CFR 164.103 (Security Rule definitions)
|
|
342
|
+
// - 45 CFR 164.501 (Privacy Rule definitions)
|
|
343
|
+
//
|
|
344
|
+
// These sections have structured format: "Term means definition."
|
|
345
|
+
// Would need regex parsing or NLP to extract accurately
|
|
346
|
+
return [];
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Factory function to create HIPAA adapter
|
|
351
|
+
*/
|
|
352
|
+
export function createHipaaAdapter() {
|
|
353
|
+
return new EcfrAdapter('HIPAA', 45, [160, 162, 164]);
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=ecfr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecfr.js","sourceRoot":"","sources":["../../../src/ingest/adapters/ecfr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOX Adapter
|
|
3
|
+
*
|
|
4
|
+
* Fetches SOX regulations from eCFR (for SEC implementing rules).
|
|
5
|
+
* Source: 17 CFR Part 229 (Regulation S-K, Item 308) and Part 240 (Exchange Act Rules)
|
|
6
|
+
*
|
|
7
|
+
* PRODUCTION IMPLEMENTATION
|
|
8
|
+
* Uses eCFR API for SEC regulations implementing Sarbanes-Oxley Section 404
|
|
9
|
+
*/
|
|
10
|
+
import { SourceAdapter, RegulationMetadata, Section, Definition, UpdateStatus } from '../framework.js';
|
|
11
|
+
/**
|
|
12
|
+
* Adapter for fetching SOX regulations from eCFR
|
|
13
|
+
*
|
|
14
|
+
* Uses eCFR API for SEC regulations implementing Sarbanes-Oxley
|
|
15
|
+
*/
|
|
16
|
+
export declare class SoxAdapter implements SourceAdapter {
|
|
17
|
+
private readonly regulationId;
|
|
18
|
+
private readonly ecfrAdapter;
|
|
19
|
+
constructor(regulationId: string);
|
|
20
|
+
/**
|
|
21
|
+
* Fetch SOX metadata
|
|
22
|
+
*/
|
|
23
|
+
fetchMetadata(): Promise<RegulationMetadata>;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch all SOX-related sections from eCFR
|
|
26
|
+
*
|
|
27
|
+
* Fetches 17 CFR Parts 229 and 240, filtering to SOX-relevant sections
|
|
28
|
+
*/
|
|
29
|
+
fetchSections(): AsyncGenerator<Section[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Check for updates since last fetch
|
|
32
|
+
*
|
|
33
|
+
* Delegates to eCFR adapter for update checking
|
|
34
|
+
*/
|
|
35
|
+
checkForUpdates(lastFetched: Date): Promise<UpdateStatus>;
|
|
36
|
+
/**
|
|
37
|
+
* Extract definitions from SOX sections
|
|
38
|
+
*
|
|
39
|
+
* Future enhancement: Parse definitions from SEC regulations
|
|
40
|
+
*/
|
|
41
|
+
extractDefinitions(): Promise<Definition[]>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Factory function to create SOX adapter
|
|
45
|
+
*/
|
|
46
|
+
export declare function createSoxAdapter(): SoxAdapter;
|
|
47
|
+
//# sourceMappingURL=regulations-gov.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regulations-gov.d.ts","sourceRoot":"","sources":["../../../src/ingest/adapters/regulations-gov.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,OAAO,EACP,UAAU,EACV,YAAY,EACb,MAAM,iBAAiB,CAAC;AAIzB;;;;GAIG;AACH,qBAAa,UAAW,YAAW,aAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,YAAY,EAAE,MAAM;IAMhC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAalD;;;;OAIG;IACI,aAAa,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;IA+BjD;;;;OAIG;IACG,eAAe,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAI/D;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAGlD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOX Adapter
|
|
3
|
+
*
|
|
4
|
+
* Fetches SOX regulations from eCFR (for SEC implementing rules).
|
|
5
|
+
* Source: 17 CFR Part 229 (Regulation S-K, Item 308) and Part 240 (Exchange Act Rules)
|
|
6
|
+
*
|
|
7
|
+
* PRODUCTION IMPLEMENTATION
|
|
8
|
+
* Uses eCFR API for SEC regulations implementing Sarbanes-Oxley Section 404
|
|
9
|
+
*/
|
|
10
|
+
import { EcfrAdapter } from './ecfr.js';
|
|
11
|
+
/**
|
|
12
|
+
* Adapter for fetching SOX regulations from eCFR
|
|
13
|
+
*
|
|
14
|
+
* Uses eCFR API for SEC regulations implementing Sarbanes-Oxley
|
|
15
|
+
*/
|
|
16
|
+
export class SoxAdapter {
|
|
17
|
+
regulationId;
|
|
18
|
+
ecfrAdapter;
|
|
19
|
+
constructor(regulationId) {
|
|
20
|
+
this.regulationId = regulationId;
|
|
21
|
+
// Use eCFR adapter for Title 17 (SEC regulations)
|
|
22
|
+
this.ecfrAdapter = new EcfrAdapter('SOX-SEC', 17, [229, 240]);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetch SOX metadata
|
|
26
|
+
*/
|
|
27
|
+
async fetchMetadata() {
|
|
28
|
+
return {
|
|
29
|
+
id: this.regulationId,
|
|
30
|
+
full_name: 'Sarbanes-Oxley Act - SEC Implementing Regulations',
|
|
31
|
+
citation: '17 CFR Parts 229, 240 (Regulation S-K Item 308, Exchange Act Rules)',
|
|
32
|
+
effective_date: '2003-06-05',
|
|
33
|
+
last_amended: new Date().toISOString().split('T')[0],
|
|
34
|
+
source_url: 'https://www.ecfr.gov/current/title-17',
|
|
35
|
+
jurisdiction: 'federal',
|
|
36
|
+
regulation_type: 'rule',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Fetch all SOX-related sections from eCFR
|
|
41
|
+
*
|
|
42
|
+
* Fetches 17 CFR Parts 229 and 240, filtering to SOX-relevant sections
|
|
43
|
+
*/
|
|
44
|
+
async *fetchSections() {
|
|
45
|
+
console.log('Fetching SOX sections from eCFR (Title 17)...');
|
|
46
|
+
// Key SOX-related sections:
|
|
47
|
+
// - 17 CFR 229.308 (Item 308: Internal control over financial reporting)
|
|
48
|
+
// - 17 CFR 240.13a-15 (Controls and procedures)
|
|
49
|
+
// - 17 CFR 240.15d-15 (Controls and procedures)
|
|
50
|
+
// - 17 CFR 240.13a-14 (Certifications)
|
|
51
|
+
// - 17 CFR 240.15d-14 (Certifications)
|
|
52
|
+
const relevantSections = [
|
|
53
|
+
'229.308',
|
|
54
|
+
'240.13a-15',
|
|
55
|
+
'240.15d-15',
|
|
56
|
+
'240.13a-14',
|
|
57
|
+
'240.15d-14',
|
|
58
|
+
];
|
|
59
|
+
// Fetch from eCFR adapter
|
|
60
|
+
for await (const sectionBatch of this.ecfrAdapter.fetchSections()) {
|
|
61
|
+
// Filter to SOX-relevant sections
|
|
62
|
+
const filtered = sectionBatch.filter(section => relevantSections.some(relevant => section.sectionNumber.includes(relevant)));
|
|
63
|
+
if (filtered.length > 0) {
|
|
64
|
+
yield filtered;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check for updates since last fetch
|
|
70
|
+
*
|
|
71
|
+
* Delegates to eCFR adapter for update checking
|
|
72
|
+
*/
|
|
73
|
+
async checkForUpdates(lastFetched) {
|
|
74
|
+
return this.ecfrAdapter.checkForUpdates(lastFetched);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Extract definitions from SOX sections
|
|
78
|
+
*
|
|
79
|
+
* Future enhancement: Parse definitions from SEC regulations
|
|
80
|
+
*/
|
|
81
|
+
async extractDefinitions() {
|
|
82
|
+
return this.ecfrAdapter.extractDefinitions();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Factory function to create SOX adapter
|
|
87
|
+
*/
|
|
88
|
+
export function createSoxAdapter() {
|
|
89
|
+
return new SoxAdapter('SOX');
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=regulations-gov.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regulations-gov.js","sourceRoot":"","sources":["../../../src/ingest/adapters/regulations-gov.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACJ,YAAY,CAAS;IACrB,WAAW,CAAc;IAE1C,YAAY,YAAoB;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,kDAAkD;QAClD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,YAAY;YACrB,SAAS,EAAE,mDAAmD;YAC9D,QAAQ,EAAE,qEAAqE;YAC/E,cAAc,EAAE,YAAY;YAC5B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACpD,UAAU,EAAE,uCAAuC;YACnD,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,MAAM;SACxB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,aAAa;QAClB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAE7D,4BAA4B;QAC5B,yEAAyE;QACzE,gDAAgD;QAChD,gDAAgD;QAChD,uCAAuC;QACvC,uCAAuC;QAEvC,MAAM,gBAAgB,GAAG;YACvB,SAAS;YACT,YAAY;YACZ,YAAY;YACZ,YAAY;YACZ,YAAY;SACb,CAAC;QAEF,0BAA0B;QAC1B,IAAI,KAAK,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC;YAClE,kCAAkC;YAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAC7C,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC5E,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,WAAiB;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC;IAC/C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ingestion Framework
|
|
3
|
+
*
|
|
4
|
+
* Defines interfaces for regulation data ingestion from multiple sources.
|
|
5
|
+
* Supports automated fetching from APIs (regulations.gov, ecfr.gov, California LegInfo).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Metadata about a regulation
|
|
9
|
+
*/
|
|
10
|
+
export interface RegulationMetadata {
|
|
11
|
+
id: string;
|
|
12
|
+
full_name: string;
|
|
13
|
+
citation: string;
|
|
14
|
+
effective_date?: string;
|
|
15
|
+
last_amended?: string;
|
|
16
|
+
source_url: string;
|
|
17
|
+
jurisdiction: string;
|
|
18
|
+
regulation_type: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A single section within a regulation
|
|
22
|
+
*/
|
|
23
|
+
export interface Section {
|
|
24
|
+
sectionNumber: string;
|
|
25
|
+
title?: string;
|
|
26
|
+
text: string;
|
|
27
|
+
chapter?: string;
|
|
28
|
+
parentSection?: string;
|
|
29
|
+
crossReferences?: string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A term definition from a regulation
|
|
33
|
+
*/
|
|
34
|
+
export interface Definition {
|
|
35
|
+
regulation: string;
|
|
36
|
+
term: string;
|
|
37
|
+
definition: string;
|
|
38
|
+
section: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Status of potential updates from source
|
|
42
|
+
*/
|
|
43
|
+
export interface UpdateStatus {
|
|
44
|
+
hasChanges: boolean;
|
|
45
|
+
lastModified?: Date;
|
|
46
|
+
changes?: string[];
|
|
47
|
+
sectionsAdded?: number;
|
|
48
|
+
sectionsModified?: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Source adapter interface
|
|
52
|
+
*
|
|
53
|
+
* Each regulation source (regulations.gov, ecfr.gov, etc.) implements this interface
|
|
54
|
+
* to provide normalized access to regulation data.
|
|
55
|
+
*/
|
|
56
|
+
export interface SourceAdapter {
|
|
57
|
+
/**
|
|
58
|
+
* Fetch regulation metadata
|
|
59
|
+
*/
|
|
60
|
+
fetchMetadata(): Promise<RegulationMetadata>;
|
|
61
|
+
/**
|
|
62
|
+
* Fetch all sections with pagination support
|
|
63
|
+
* Returns an async generator for memory-efficient streaming
|
|
64
|
+
*/
|
|
65
|
+
fetchSections(): AsyncGenerator<Section[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Check if source has updates since last fetch
|
|
68
|
+
*/
|
|
69
|
+
checkForUpdates(lastFetched: Date): Promise<UpdateStatus>;
|
|
70
|
+
/**
|
|
71
|
+
* Extract definitions from regulation text
|
|
72
|
+
*/
|
|
73
|
+
extractDefinitions(): Promise<Definition[]>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Regulation source configuration
|
|
77
|
+
*/
|
|
78
|
+
export interface RegulationSource {
|
|
79
|
+
id: string;
|
|
80
|
+
name: string;
|
|
81
|
+
sourceType: 'api' | 'html' | 'pdf';
|
|
82
|
+
adapter: SourceAdapter;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=framework.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/ingest/framework.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE7C;;;OAGG;IACH,aAAa,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;IAE3C;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1D;;OAEG;IACH,kBAAkB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACnC,OAAO,EAAE,aAAa,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/ingest/framework.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
export interface ActionItemsInput {
|
|
3
|
+
regulation: string;
|
|
4
|
+
sections: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ActionItem {
|
|
7
|
+
section: string;
|
|
8
|
+
title: string;
|
|
9
|
+
required_state: string;
|
|
10
|
+
priority: 'high' | 'medium' | 'low';
|
|
11
|
+
evidence_needed: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface ActionItemsResult {
|
|
14
|
+
regulation: string;
|
|
15
|
+
action_items: ActionItem[];
|
|
16
|
+
total_items: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate compliance action items from regulation sections.
|
|
20
|
+
* Extracts priority and evidence requirements from section text.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getComplianceActionItems(db: Database, input: ActionItemsInput): Promise<ActionItemsResult>;
|
|
23
|
+
//# sourceMappingURL=action-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-items.d.ts","sourceRoot":"","sources":["../../src/tools/action-items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAgED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAkD5B"}
|