@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.
Files changed (89) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +275 -0
  3. package/data/.gitkeep +0 -0
  4. package/data/regulations.db +0 -0
  5. package/data/seed/applicability/rules.json +74 -0
  6. package/data/seed/mappings/ccpa-nist-csf.json +144 -0
  7. package/data/seed/mappings/hipaa-nist-800-53.json +377 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +41 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/ingest/adapters/california-leginfo.d.ts +72 -0
  13. package/dist/ingest/adapters/california-leginfo.d.ts.map +1 -0
  14. package/dist/ingest/adapters/california-leginfo.js +270 -0
  15. package/dist/ingest/adapters/california-leginfo.js.map +1 -0
  16. package/dist/ingest/adapters/ecfr.d.ts +76 -0
  17. package/dist/ingest/adapters/ecfr.d.ts.map +1 -0
  18. package/dist/ingest/adapters/ecfr.js +355 -0
  19. package/dist/ingest/adapters/ecfr.js.map +1 -0
  20. package/dist/ingest/adapters/regulations-gov.d.ts +47 -0
  21. package/dist/ingest/adapters/regulations-gov.d.ts.map +1 -0
  22. package/dist/ingest/adapters/regulations-gov.js +91 -0
  23. package/dist/ingest/adapters/regulations-gov.js.map +1 -0
  24. package/dist/ingest/framework.d.ts +84 -0
  25. package/dist/ingest/framework.d.ts.map +1 -0
  26. package/dist/ingest/framework.js +8 -0
  27. package/dist/ingest/framework.js.map +1 -0
  28. package/dist/tools/action-items.d.ts +23 -0
  29. package/dist/tools/action-items.d.ts.map +1 -0
  30. package/dist/tools/action-items.js +118 -0
  31. package/dist/tools/action-items.js.map +1 -0
  32. package/dist/tools/applicability.d.ts +26 -0
  33. package/dist/tools/applicability.d.ts.map +1 -0
  34. package/dist/tools/applicability.js +49 -0
  35. package/dist/tools/applicability.js.map +1 -0
  36. package/dist/tools/compare.d.ts +20 -0
  37. package/dist/tools/compare.d.ts.map +1 -0
  38. package/dist/tools/compare.js +35 -0
  39. package/dist/tools/compare.js.map +1 -0
  40. package/dist/tools/definitions.d.ts +22 -0
  41. package/dist/tools/definitions.d.ts.map +1 -0
  42. package/dist/tools/definitions.js +43 -0
  43. package/dist/tools/definitions.js.map +1 -0
  44. package/dist/tools/evidence.d.ts +23 -0
  45. package/dist/tools/evidence.d.ts.map +1 -0
  46. package/dist/tools/evidence.js +27 -0
  47. package/dist/tools/evidence.js.map +1 -0
  48. package/dist/tools/list.d.ts +25 -0
  49. package/dist/tools/list.d.ts.map +1 -0
  50. package/dist/tools/list.js +66 -0
  51. package/dist/tools/list.js.map +1 -0
  52. package/dist/tools/map.d.ts +26 -0
  53. package/dist/tools/map.d.ts.map +1 -0
  54. package/dist/tools/map.js +58 -0
  55. package/dist/tools/map.js.map +1 -0
  56. package/dist/tools/registry.d.ts +19 -0
  57. package/dist/tools/registry.d.ts.map +1 -0
  58. package/dist/tools/registry.js +260 -0
  59. package/dist/tools/registry.js.map +1 -0
  60. package/dist/tools/search.d.ts +15 -0
  61. package/dist/tools/search.d.ts.map +1 -0
  62. package/dist/tools/search.js +94 -0
  63. package/dist/tools/search.js.map +1 -0
  64. package/dist/tools/section.d.ts +19 -0
  65. package/dist/tools/section.d.ts.map +1 -0
  66. package/dist/tools/section.js +50 -0
  67. package/dist/tools/section.js.map +1 -0
  68. package/package.json +76 -0
  69. package/scripts/build-db.ts +268 -0
  70. package/scripts/ingest.ts +214 -0
  71. package/scripts/load-seed-data.ts +133 -0
  72. package/scripts/quality-test.ts +346 -0
  73. package/scripts/test-mcp-tools.ts +187 -0
  74. package/scripts/test-remaining-tools.ts +107 -0
  75. package/src/index.ts +55 -0
  76. package/src/ingest/adapters/california-leginfo.ts +322 -0
  77. package/src/ingest/adapters/ecfr.ts +403 -0
  78. package/src/ingest/adapters/regulations-gov.ts +112 -0
  79. package/src/ingest/framework.ts +92 -0
  80. package/src/tools/action-items.ts +164 -0
  81. package/src/tools/applicability.ts +91 -0
  82. package/src/tools/compare.ts +61 -0
  83. package/src/tools/definitions.ts +79 -0
  84. package/src/tools/evidence.ts +53 -0
  85. package/src/tools/list.ts +120 -0
  86. package/src/tools/map.ts +100 -0
  87. package/src/tools/registry.ts +275 -0
  88. package/src/tools/search.ts +132 -0
  89. 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":"AAAA;;;;;;;;GAQG;AASH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;GAEG;AACH,MAAM,OAAO,WAAW;IACL,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,SAAS,CAAW;IAErC,YAAY,YAAoB,EAAE,SAAiB,EAAE,SAAmB;QACtE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa;QACjB,iCAAiC;QACjC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,YAAY;YACrB,SAAS,EAAE,qDAAqD;YAChE,QAAQ,EAAE,4BAA4B;YACtC,cAAc,EAAE,YAAY;YAC5B,YAAY,EAAE,YAAY;YAC1B,UAAU,EAAE,uCAAuC;YACnD,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,MAAM;SACxB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,CAAC,aAAa;QAClB,+CAA+C;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,8CAA8C,IAAI,UAAU,IAAI,CAAC,SAAS,MAAM,CAAC;QAE7F,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,CAAC,CAAC;QAEpE,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtC,YAAY;QACZ,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;YAC3B,gBAAgB,EAAE,KAAK;YACvB,mBAAmB,EAAE,IAAI;YACzB,YAAY,EAAE,OAAO;YACrB,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAErC,uCAAuC;QACvC,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,6EAA6E;QAC7E,sGAAsG;QACtG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wCAAwC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,oCAAoC;QACpC,MAAM,SAAS,GAAG,CAAC,IAAS,EAAS,EAAE;YACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YAEjD,MAAM,KAAK,GAAU,EAAE,CAAC;YAExB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACvC,CAAC;YAED,0BAA0B;YAC1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBACtE,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;wBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAExE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAEhD,gCAAgC;YAChC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,KAAK,CAAC,CAAC;YAE/C,oDAAoD;YACpD,MAAM,YAAY,GAAG,CAAC,IAAS,EAAS,EAAE;gBACxC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,EAAE,CAAC;gBAEjD,MAAM,IAAI,GAAU,EAAE,CAAC;gBAEvB,sCAAsC;gBACtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjE,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtC,CAAC;gBAED,oDAAoD;gBACpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;wBAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;wBACtE,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;4BAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;wBACpC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YAEF,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,CAAC,MAAM,qBAAqB,OAAO,EAAE,CAAC,CAAC;YAE3E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC3D,IAAI,OAAO,EAAE,CAAC;oBACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,yBAAyB;YACzB,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBAC1B,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAQ,EAAE,OAAe,EAAE,SAAiB;QAC/D,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,uBAAuB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAE3C,uBAAuB;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEhE,iFAAiF;QACjF,2DAA2D;QAC3D,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC;YACzD,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC;QAE/B,uCAAuC;QACvC,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAEzD,OAAO;YACL,aAAa,EAAE,cAAc;YAC7B,KAAK;YACL,IAAI;YACJ,OAAO,EAAE,QAAQ,OAAO,aAAa,SAAS,EAAE;YAChD,aAAa,EAAE,SAAS,EAAE,uDAAuD;YACjF,eAAe,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;SAC1E,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAY;QAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC9B,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,CAAC;YAED,0CAA0C;YAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,SAAS,CAAC,kBAAkB;gBACtD,IAAI,GAAG,KAAK,MAAM;oBAAE,SAAS,CAAC,aAAa;gBAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wBACpC,IAAI,IAAI;4BAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACrC,IAAI,IAAI;wBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,OAAY;QACzC,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAE,EAAE;YAC5B,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO;YAEpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACnB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACtB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBACxB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBACnE,CAAC;yBAAM,CAAC;wBACN,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wBACnC,IAAI,GAAG;4BAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,GAAuB;QAC3C,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5E,IAAI,SAAS,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;gBAC7C,OAAO,SAAS,CAAC,iBAAiB,CAAC;YACrC,CAAC;YAED,2BAA2B;YAC3B,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YACxE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,UAAU,GAAG,CAAC;QACtD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBAElC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,yBAAyB;oBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC1E,OAAO,CAAC,IAAI,CAAC,6BAA6B,KAAK,OAAO,CAAC,CAAC;oBACxD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBACzD,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACrE,CAAC;gBAED,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,KAAK,UAAU,GAAG,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,6BAA6B,KAAK,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC/D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,WAAiB;QACrC,IAAI,CAAC;YACH,8CAA8C;YAC9C,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,8CAA8C,IAAI,UAAU,IAAI,CAAC,SAAS,MAAM,CAAC;YAE7F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACtD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAEjE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAClD,OAAO;oBACL,UAAU,EAAE,KAAK;oBACjB,YAAY,EAAE,IAAI,IAAI,EAAE;oBACxB,OAAO,EAAE,EAAE;iBACZ,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAElD,OAAO;gBACL,UAAU,EAAE,YAAY,GAAG,WAAW;gBACtC,YAAY;gBACZ,OAAO,EAAE,YAAY,GAAG,WAAW;oBACjC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,SAAS,eAAe,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;oBACtE,CAAC,CAAC,EAAE;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,IAAI,IAAI,EAAE;gBACxB,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB;QACtB,wCAAwC;QACxC,4BAA4B;QAC5B,yCAAyC;QACzC,+CAA+C;QAC/C,8CAA8C;QAC9C,EAAE;QACF,kEAAkE;QAClE,wDAAwD;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -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,8 @@
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
+ export {};
8
+ //# sourceMappingURL=framework.js.map
@@ -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"}