openplanter 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +210 -0
  2. package/dist/builder.d.ts +11 -0
  3. package/dist/builder.d.ts.map +1 -0
  4. package/dist/builder.js +179 -0
  5. package/dist/builder.js.map +1 -0
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +548 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +51 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +114 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/credentials.d.ts +52 -0
  15. package/dist/credentials.d.ts.map +1 -0
  16. package/dist/credentials.js +371 -0
  17. package/dist/credentials.js.map +1 -0
  18. package/dist/demo.d.ts +26 -0
  19. package/dist/demo.d.ts.map +1 -0
  20. package/dist/demo.js +95 -0
  21. package/dist/demo.js.map +1 -0
  22. package/dist/engine.d.ts +91 -0
  23. package/dist/engine.d.ts.map +1 -0
  24. package/dist/engine.js +1036 -0
  25. package/dist/engine.js.map +1 -0
  26. package/dist/index.d.ts +30 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +39 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/investigation-tools/aph-holdings.d.ts +61 -0
  31. package/dist/investigation-tools/aph-holdings.d.ts.map +1 -0
  32. package/dist/investigation-tools/aph-holdings.js +459 -0
  33. package/dist/investigation-tools/aph-holdings.js.map +1 -0
  34. package/dist/investigation-tools/asic-officer-lookup.d.ts +42 -0
  35. package/dist/investigation-tools/asic-officer-lookup.d.ts.map +1 -0
  36. package/dist/investigation-tools/asic-officer-lookup.js +197 -0
  37. package/dist/investigation-tools/asic-officer-lookup.js.map +1 -0
  38. package/dist/investigation-tools/asx-calendar-fetcher.d.ts +42 -0
  39. package/dist/investigation-tools/asx-calendar-fetcher.d.ts.map +1 -0
  40. package/dist/investigation-tools/asx-calendar-fetcher.js +271 -0
  41. package/dist/investigation-tools/asx-calendar-fetcher.js.map +1 -0
  42. package/dist/investigation-tools/asx-parser.d.ts +66 -0
  43. package/dist/investigation-tools/asx-parser.d.ts.map +1 -0
  44. package/dist/investigation-tools/asx-parser.js +314 -0
  45. package/dist/investigation-tools/asx-parser.js.map +1 -0
  46. package/dist/investigation-tools/bulk-asx-announcements.d.ts +53 -0
  47. package/dist/investigation-tools/bulk-asx-announcements.d.ts.map +1 -0
  48. package/dist/investigation-tools/bulk-asx-announcements.js +204 -0
  49. package/dist/investigation-tools/bulk-asx-announcements.js.map +1 -0
  50. package/dist/investigation-tools/entity-resolver.d.ts +77 -0
  51. package/dist/investigation-tools/entity-resolver.d.ts.map +1 -0
  52. package/dist/investigation-tools/entity-resolver.js +346 -0
  53. package/dist/investigation-tools/entity-resolver.js.map +1 -0
  54. package/dist/investigation-tools/hotcopper-scraper.d.ts +73 -0
  55. package/dist/investigation-tools/hotcopper-scraper.d.ts.map +1 -0
  56. package/dist/investigation-tools/hotcopper-scraper.js +318 -0
  57. package/dist/investigation-tools/hotcopper-scraper.js.map +1 -0
  58. package/dist/investigation-tools/index.d.ts +15 -0
  59. package/dist/investigation-tools/index.d.ts.map +1 -0
  60. package/dist/investigation-tools/index.js +15 -0
  61. package/dist/investigation-tools/index.js.map +1 -0
  62. package/dist/investigation-tools/insider-graph.d.ts +173 -0
  63. package/dist/investigation-tools/insider-graph.d.ts.map +1 -0
  64. package/dist/investigation-tools/insider-graph.js +732 -0
  65. package/dist/investigation-tools/insider-graph.js.map +1 -0
  66. package/dist/investigation-tools/insider-suspicion-scorer.d.ts +97 -0
  67. package/dist/investigation-tools/insider-suspicion-scorer.d.ts.map +1 -0
  68. package/dist/investigation-tools/insider-suspicion-scorer.js +327 -0
  69. package/dist/investigation-tools/insider-suspicion-scorer.js.map +1 -0
  70. package/dist/investigation-tools/multi-forum-scraper.d.ts +104 -0
  71. package/dist/investigation-tools/multi-forum-scraper.d.ts.map +1 -0
  72. package/dist/investigation-tools/multi-forum-scraper.js +415 -0
  73. package/dist/investigation-tools/multi-forum-scraper.js.map +1 -0
  74. package/dist/investigation-tools/price-fetcher.d.ts +81 -0
  75. package/dist/investigation-tools/price-fetcher.d.ts.map +1 -0
  76. package/dist/investigation-tools/price-fetcher.js +268 -0
  77. package/dist/investigation-tools/price-fetcher.js.map +1 -0
  78. package/dist/investigation-tools/shared.d.ts +39 -0
  79. package/dist/investigation-tools/shared.d.ts.map +1 -0
  80. package/dist/investigation-tools/shared.js +203 -0
  81. package/dist/investigation-tools/shared.js.map +1 -0
  82. package/dist/investigation-tools/timeline-linker.d.ts +90 -0
  83. package/dist/investigation-tools/timeline-linker.d.ts.map +1 -0
  84. package/dist/investigation-tools/timeline-linker.js +219 -0
  85. package/dist/investigation-tools/timeline-linker.js.map +1 -0
  86. package/dist/investigation-tools/volume-scanner.d.ts +70 -0
  87. package/dist/investigation-tools/volume-scanner.d.ts.map +1 -0
  88. package/dist/investigation-tools/volume-scanner.js +227 -0
  89. package/dist/investigation-tools/volume-scanner.js.map +1 -0
  90. package/dist/model.d.ts +136 -0
  91. package/dist/model.d.ts.map +1 -0
  92. package/dist/model.js +1071 -0
  93. package/dist/model.js.map +1 -0
  94. package/dist/patching.d.ts +45 -0
  95. package/dist/patching.d.ts.map +1 -0
  96. package/dist/patching.js +317 -0
  97. package/dist/patching.js.map +1 -0
  98. package/dist/prompts.d.ts +15 -0
  99. package/dist/prompts.d.ts.map +1 -0
  100. package/dist/prompts.js +351 -0
  101. package/dist/prompts.js.map +1 -0
  102. package/dist/replay-log.d.ts +54 -0
  103. package/dist/replay-log.d.ts.map +1 -0
  104. package/dist/replay-log.js +94 -0
  105. package/dist/replay-log.js.map +1 -0
  106. package/dist/runtime.d.ts +53 -0
  107. package/dist/runtime.d.ts.map +1 -0
  108. package/dist/runtime.js +259 -0
  109. package/dist/runtime.js.map +1 -0
  110. package/dist/settings.d.ts +39 -0
  111. package/dist/settings.d.ts.map +1 -0
  112. package/dist/settings.js +146 -0
  113. package/dist/settings.js.map +1 -0
  114. package/dist/tool-defs.d.ts +58 -0
  115. package/dist/tool-defs.d.ts.map +1 -0
  116. package/dist/tool-defs.js +1029 -0
  117. package/dist/tool-defs.js.map +1 -0
  118. package/dist/tools.d.ts +72 -0
  119. package/dist/tools.d.ts.map +1 -0
  120. package/dist/tools.js +1454 -0
  121. package/dist/tools.js.map +1 -0
  122. package/dist/tui.d.ts +49 -0
  123. package/dist/tui.d.ts.map +1 -0
  124. package/dist/tui.js +699 -0
  125. package/dist/tui.js.map +1 -0
  126. package/package.json +126 -0
@@ -0,0 +1,459 @@
1
+ /**
2
+ * aph-holdings.ts – Australian Parliament House Register of Interests Scraper
3
+ *
4
+ * Scrapes and parses the APH Register of Members' / Senators' Interests to
5
+ * extract politician shareholdings and other financial interests.
6
+ *
7
+ * Data sources:
8
+ * - House of Representatives: https://www.aph.gov.au/Senators_and_Members/Members/Register
9
+ * - Senate: https://www.aph.gov.au/Parliamentary_Business/Committees/Senate/
10
+ * Senators_Interests/Senators_Interests_Register
11
+ *
12
+ * DISCLAIMER:
13
+ * This tool is provided for research and educational purposes only.
14
+ * Users are solely responsible for ensuring compliance with all applicable
15
+ * laws, regulations, and website terms before using this tool.
16
+ */
17
+ import { fetchHtml, isoNow } from "./shared.js";
18
+ // ── Constants ────────────────────────────────────────────────────
19
+ const BASE_URL = "https://www.aph.gov.au";
20
+ /** House of Representatives register (48th Parliament) */
21
+ const HOUSE_REGISTER_URL = BASE_URL + "/Senators_and_Members/Members/Register";
22
+ /** Senate register */
23
+ const SENATE_REGISTER_URL = BASE_URL +
24
+ "/Parliamentary_Business/Committees/Senate/Senators_Interests" +
25
+ "/Senators_Interests_Register";
26
+ const DEFAULT_DELAY = 1.0;
27
+ // Company-name normalisation suffixes (longest first)
28
+ const COMPANY_SUFFIXES = [
29
+ "Proprietary Limited",
30
+ "Pty Limited",
31
+ "Pty Ltd",
32
+ "Pty. Ltd.",
33
+ "Pty. Ltd",
34
+ "Pty Ltd.",
35
+ "Limited",
36
+ "Ltd.",
37
+ "Ltd",
38
+ "Incorporated",
39
+ "Inc.",
40
+ "Inc",
41
+ "Corporation",
42
+ "Corp.",
43
+ "Corp",
44
+ "No Liability",
45
+ "N.L.",
46
+ "NL",
47
+ ];
48
+ const COMPANY_SUFFIX_RE = new RegExp("\\b(?:" +
49
+ COMPANY_SUFFIXES.map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|") +
50
+ ")\\s*$", "i");
51
+ // Senate interest page section headings → our schema types
52
+ const SECTION_TYPE_MAP = {
53
+ "1": "shares",
54
+ "2": "other",
55
+ "3": "property",
56
+ "4": "other",
57
+ "5": "other",
58
+ "6": "other",
59
+ "7": "other",
60
+ "8": "other",
61
+ "9": "other",
62
+ "10": "other",
63
+ "11": "other",
64
+ "12": "other",
65
+ "13": "other",
66
+ "14": "other",
67
+ };
68
+ const SECTION_LABEL_MAP = {
69
+ "1": "shareholdings",
70
+ "2": "trusts",
71
+ "3": "real_estate",
72
+ "4": "directorships",
73
+ "5": "partnerships",
74
+ "6": "liabilities",
75
+ "7": "bonds_debentures",
76
+ "8": "savings_investments",
77
+ "9": "other_assets",
78
+ "10": "income_sources",
79
+ "11": "gifts",
80
+ "12": "sponsored_travel",
81
+ "13": "org_memberships",
82
+ "14": "other_interests",
83
+ };
84
+ // Regex patterns to detect nature of holding from free text
85
+ const NATURE_PATTERNS = [
86
+ {
87
+ nature: "spouse",
88
+ pattern: /\b(?:spouse|partner|wife|husband)\b/i,
89
+ },
90
+ {
91
+ nature: "trust",
92
+ pattern: /\b(?:trust|trustee|SMSF|super(?:annuation)?)\b/i,
93
+ },
94
+ {
95
+ nature: "indirect",
96
+ pattern: /\b(?:indirect|nominee|beneficial)\b/i,
97
+ },
98
+ ];
99
+ // ── Helpers ──────────────────────────────────────────────────────
100
+ function normaliseCompany(name) {
101
+ let cleaned = name.trim();
102
+ cleaned = cleaned.replace(COMPANY_SUFFIX_RE, "").trim();
103
+ cleaned = cleaned.replace(/\s+/g, " ");
104
+ cleaned = cleaned.replace(/[,.\s]+$/, "");
105
+ return cleaned;
106
+ }
107
+ function inferNature(text) {
108
+ for (const { nature, pattern } of NATURE_PATTERNS) {
109
+ if (pattern.test(text))
110
+ return nature;
111
+ }
112
+ return "direct";
113
+ }
114
+ // ── Senate Scraping ──────────────────────────────────────────────
115
+ function scrapeSenateListingFromHtml(ch) {
116
+ const senators = [];
117
+ // Find the table with "senator" or "party" in its headers
118
+ const tables = ch("table").toArray();
119
+ let targetTable = null;
120
+ for (const tbl of tables) {
121
+ const headers = ch(tbl)
122
+ .find("th")
123
+ .toArray()
124
+ .map((th) => ch(th).text().trim().toLowerCase());
125
+ if (headers.includes("senator") || headers.includes("party")) {
126
+ targetTable = ch(tbl);
127
+ break;
128
+ }
129
+ }
130
+ if (!targetTable)
131
+ return senators;
132
+ const rows = targetTable.find("tr").toArray();
133
+ for (const row of rows) {
134
+ const cells = ch(row).find("td");
135
+ if (cells.length < 3)
136
+ continue;
137
+ const link = cells.eq(0).find("a").first();
138
+ if (!link.length)
139
+ continue;
140
+ const name = link.text().trim();
141
+ let href = link.attr("href") ?? "";
142
+ if (href && !href.startsWith("http")) {
143
+ href = BASE_URL + href;
144
+ }
145
+ const party = cells.eq(1).text().trim();
146
+ const state = cells.eq(2).text().trim();
147
+ senators.push({ name, party, state, url: href });
148
+ }
149
+ return senators;
150
+ }
151
+ function parseSectionTable(ch, table, holdingType, sectionLabel, holdings) {
152
+ const rows = table.find("tr").toArray();
153
+ if (!rows.length)
154
+ return;
155
+ const firstRowThs = ch(rows[0]).find("th");
156
+ const hasHeader = firstRowThs.length > 0;
157
+ const dataRows = hasHeader ? rows.slice(1) : rows;
158
+ for (const row of dataRows) {
159
+ const cells = ch(row).find("td, th").toArray();
160
+ if (!cells.length)
161
+ continue;
162
+ const cellTexts = cells.map((cell) => ch(cell).text().trim());
163
+ if (!cellTexts.some((t) => t))
164
+ continue;
165
+ if (holdingType === "shares") {
166
+ const entityRaw = cellTexts[0] ?? "";
167
+ const entity = normaliseCompany(entityRaw);
168
+ const detail = cellTexts[1] ?? "";
169
+ const nature = inferNature(cellTexts.join(" "));
170
+ if (entity) {
171
+ holdings.push({
172
+ type: "shares",
173
+ entity,
174
+ entity_raw: entityRaw,
175
+ detail,
176
+ nature,
177
+ section: sectionLabel,
178
+ });
179
+ }
180
+ }
181
+ else if (holdingType === "property") {
182
+ const detailText = cellTexts.filter((t) => t).join(" | ");
183
+ if (detailText) {
184
+ holdings.push({
185
+ type: "property",
186
+ entity: "",
187
+ detail: detailText,
188
+ nature: inferNature(detailText),
189
+ section: sectionLabel,
190
+ });
191
+ }
192
+ }
193
+ else {
194
+ const detailText = cellTexts.filter((t) => t).join(" | ");
195
+ if (detailText) {
196
+ const entity = normaliseCompany(cellTexts[0] ?? "");
197
+ holdings.push({
198
+ type: "other",
199
+ entity,
200
+ detail: detailText,
201
+ nature: inferNature(detailText),
202
+ section: sectionLabel,
203
+ });
204
+ }
205
+ }
206
+ }
207
+ }
208
+ function parseSenatorInterestsPage(ch, stub) {
209
+ const holdings = [];
210
+ // Build ordered list of section headings
211
+ const headingEls = ch("h3, h4").toArray();
212
+ const sectionHeadings = [];
213
+ for (const heading of headingEls) {
214
+ const text = ch(heading).text().trim();
215
+ const match = text.match(/^(\d+)\./);
216
+ if (!match)
217
+ continue;
218
+ const sectionNum = match[1];
219
+ const holdingType = SECTION_TYPE_MAP[sectionNum] ?? "other";
220
+ const sectionLabel = SECTION_LABEL_MAP[sectionNum] ?? "other";
221
+ sectionHeadings.push({
222
+ el: ch(heading),
223
+ num: sectionNum,
224
+ holdingType,
225
+ sectionLabel,
226
+ });
227
+ }
228
+ // For each section, find content between this heading and the next
229
+ for (let idx = 0; idx < sectionHeadings.length; idx++) {
230
+ const { el: heading, holdingType, sectionLabel } = sectionHeadings[idx];
231
+ const nextHeading = idx + 1 < sectionHeadings.length
232
+ ? sectionHeadings[idx + 1].el
233
+ : null;
234
+ // Collect sibling elements between this heading and the next
235
+ const contentElements = [];
236
+ let sibling = heading.next();
237
+ while (sibling && sibling.length) {
238
+ // Check if we've hit the next section heading
239
+ if (nextHeading && sibling.is(nextHeading))
240
+ break;
241
+ const tagName = (sibling.prop("tagName") ?? "").toLowerCase();
242
+ if (tagName === "h3" || tagName === "h4") {
243
+ const sibText = sibling.text().trim();
244
+ if (/^\d+\./.test(sibText))
245
+ break;
246
+ }
247
+ contentElements.push(sibling);
248
+ sibling = sibling.next();
249
+ }
250
+ // Process content elements
251
+ for (const elem of contentElements) {
252
+ const tagName = (elem.prop("tagName") ?? "").toLowerCase();
253
+ if (tagName === "table") {
254
+ parseSectionTable(ch, elem, holdingType, sectionLabel, holdings);
255
+ }
256
+ else if (tagName === "ul" || tagName === "ol") {
257
+ const lis = elem.find("li").toArray();
258
+ for (const li of lis) {
259
+ const itemText = ch(li).text().trim();
260
+ if (itemText) {
261
+ const entity = holdingType === "shares"
262
+ ? normaliseCompany(itemText)
263
+ : "";
264
+ holdings.push({
265
+ type: holdingType,
266
+ entity,
267
+ entity_raw: holdingType === "shares" ? itemText : undefined,
268
+ detail: itemText,
269
+ nature: inferNature(itemText),
270
+ section: sectionLabel,
271
+ });
272
+ }
273
+ }
274
+ }
275
+ else if (tagName === "p") {
276
+ const pText = elem.text().trim();
277
+ if (pText && !pText.startsWith("Note:")) {
278
+ const entity = holdingType === "shares"
279
+ ? normaliseCompany(pText)
280
+ : "";
281
+ holdings.push({
282
+ type: holdingType,
283
+ entity,
284
+ entity_raw: holdingType === "shares" ? pText : undefined,
285
+ detail: pText,
286
+ nature: inferNature(pText),
287
+ section: sectionLabel,
288
+ });
289
+ }
290
+ }
291
+ else if (tagName === "div") {
292
+ const nestedTables = elem.find("table").toArray();
293
+ for (const tbl of nestedTables) {
294
+ parseSectionTable(ch, ch(tbl), holdingType, sectionLabel, holdings);
295
+ }
296
+ }
297
+ }
298
+ }
299
+ // Deduplicate holdings (same type + entity + detail)
300
+ const seen = new Set();
301
+ const uniqueHoldings = [];
302
+ for (const h of holdings) {
303
+ const key = `${h.type}|${h.entity}|${h.detail}`;
304
+ if (!seen.has(key)) {
305
+ seen.add(key);
306
+ uniqueHoldings.push(h);
307
+ }
308
+ }
309
+ // Format display name from "Surname, FirstName" → "FirstName Surname"
310
+ const nameParts = stub.name.split(",");
311
+ const displayName = nameParts.length === 2
312
+ ? `${nameParts[1].trim()} ${nameParts[0].trim()}`
313
+ : stub.name;
314
+ return {
315
+ name: displayName,
316
+ name_raw: stub.name,
317
+ party: stub.party,
318
+ chamber: "senate",
319
+ electorate: stub.state,
320
+ holdings: uniqueHoldings,
321
+ };
322
+ }
323
+ export async function scrapeSenate(memberFilter, delay = DEFAULT_DELAY) {
324
+ const listing$ = await fetchHtml(SENATE_REGISTER_URL, { delay });
325
+ const listing = scrapeSenateListingFromHtml(listing$);
326
+ if (!listing.length)
327
+ return [];
328
+ const results = [];
329
+ for (const stub of listing) {
330
+ if (memberFilter &&
331
+ memberFilter.toLowerCase() !== "all" &&
332
+ !stub.name.toLowerCase().includes(memberFilter.toLowerCase())) {
333
+ continue;
334
+ }
335
+ if (!stub.url)
336
+ continue;
337
+ try {
338
+ const page$ = await fetchHtml(stub.url, { delay });
339
+ const member = parseSenatorInterestsPage(page$, stub);
340
+ results.push(member);
341
+ }
342
+ catch (err) {
343
+ const msg = err instanceof Error ? err.message : String(err);
344
+ console.error(`[ERROR] Failed to parse senator ${stub.name}: ${msg}`);
345
+ }
346
+ }
347
+ return results;
348
+ }
349
+ // ── House of Representatives Scraping ────────────────────────────
350
+ function scrapeHouseListingFromHtml(ch) {
351
+ const members = [];
352
+ const tables = ch("table").toArray();
353
+ for (const table of tables) {
354
+ const rows = ch(table).find("tr").toArray();
355
+ for (const row of rows) {
356
+ const cells = ch(row).find("td");
357
+ if (cells.length < 2)
358
+ continue;
359
+ const nameCell = cells.length >= 2 ? cells.eq(1) : cells.eq(0);
360
+ const cellText = nameCell.text().trim();
361
+ if (!cellText)
362
+ continue;
363
+ // Try to find PDF link
364
+ let pdfUrl = "";
365
+ const pdfLinks = ch(row).find("a").toArray();
366
+ for (const a of pdfLinks) {
367
+ const href = ch(a).attr("href") ?? "";
368
+ if (/\.pdf$/i.test(href)) {
369
+ pdfUrl = href.startsWith("http") ? href : BASE_URL + href;
370
+ break;
371
+ }
372
+ }
373
+ // Parse "Surname, Title FirstName, Member for Electorate, STATE"
374
+ let name = cellText;
375
+ let electorate = "";
376
+ let state = "";
377
+ const memberForMatch = cellText.match(/Member\s+for\s+([^,]+?)(?:,\s*([A-Z]{2,3}))?$/);
378
+ if (memberForMatch) {
379
+ electorate = memberForMatch[1].trim();
380
+ state = memberForMatch[2] ?? "";
381
+ name = cellText
382
+ .slice(0, memberForMatch.index)
383
+ .trim()
384
+ .replace(/,\s*$/, "");
385
+ }
386
+ members.push({ name, electorate, state, pdf_url: pdfUrl });
387
+ }
388
+ }
389
+ return members;
390
+ }
391
+ export async function scrapeHouse(memberFilter, delay = DEFAULT_DELAY) {
392
+ const ch = await fetchHtml(HOUSE_REGISTER_URL, { delay });
393
+ const listing = scrapeHouseListingFromHtml(ch);
394
+ if (!listing.length)
395
+ return [];
396
+ const results = [];
397
+ for (const stub of listing) {
398
+ if (memberFilter &&
399
+ memberFilter.toLowerCase() !== "all" &&
400
+ !stub.name.toLowerCase().includes(memberFilter.toLowerCase())) {
401
+ continue;
402
+ }
403
+ // Clean up name: "Surname, Hon Title" → "Title Surname"
404
+ const nameParts = stub.name.split(",", 2);
405
+ let displayName = nameParts.length === 2
406
+ ? `${nameParts[1].trim()} ${nameParts[0].trim()}`
407
+ : stub.name;
408
+ // Remove honorific prefixes
409
+ displayName = displayName
410
+ .replace(/^(Hon\s+|Dr\s+|Mr\s+|Mrs\s+|Ms\s+|Miss\s+)+/i, "")
411
+ .trim();
412
+ results.push({
413
+ name: displayName,
414
+ name_raw: stub.name,
415
+ party: "",
416
+ chamber: "house",
417
+ electorate: stub.electorate,
418
+ state: stub.state,
419
+ pdf_url: stub.pdf_url,
420
+ holdings: [],
421
+ });
422
+ }
423
+ return results;
424
+ }
425
+ // ── Main entry point ─────────────────────────────────────────────
426
+ export async function scrapeAph(options) {
427
+ const member = options?.member ?? "all";
428
+ const chamber = options?.chamber ?? "both";
429
+ const delay = options?.delay ?? DEFAULT_DELAY;
430
+ const members = [];
431
+ if (chamber === "senate" || chamber === "both") {
432
+ try {
433
+ const senators = await scrapeSenate(member, delay);
434
+ members.push(...senators);
435
+ }
436
+ catch (err) {
437
+ const msg = err instanceof Error ? err.message : String(err);
438
+ console.error(`[ERROR] Senate scraping failed: ${msg}`);
439
+ }
440
+ }
441
+ if (chamber === "house" || chamber === "both") {
442
+ try {
443
+ const house = await scrapeHouse(member, delay);
444
+ members.push(...house);
445
+ }
446
+ catch (err) {
447
+ const msg = err instanceof Error ? err.message : String(err);
448
+ console.error(`[ERROR] House scraping failed: ${msg}`);
449
+ }
450
+ }
451
+ return {
452
+ scraped_at: isoNow(),
453
+ chamber,
454
+ member_filter: member,
455
+ total_members: members.length,
456
+ members,
457
+ };
458
+ }
459
+ //# sourceMappingURL=aph-holdings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aph-holdings.js","sourceRoot":"","sources":["../../src/investigation-tools/aph-holdings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * asic-officer-lookup.ts – Query ASIC company officer/director data by ABN or
3
+ * ASX ticker.
4
+ *
5
+ * Data sources:
6
+ * - ASIC Connect Registry Search:
7
+ * https://connectonline.asic.gov.au/RegistrySearch/faces/landing/SearchRegisters.jspx
8
+ * - Australian Business Register (ABR) JSON API:
9
+ * https://abr.business.gov.au/json/AbnDetails.aspx?abn=XXX&callback=callback
10
+ * - ASX Company Info API:
11
+ * https://www.asx.com.au/asx/1/company/{ticker}
12
+ */
13
+ export interface AsxCompanyInfo {
14
+ name_full?: string;
15
+ name_short?: string;
16
+ industry_group_name?: string;
17
+ listing_date?: string;
18
+ [key: string]: unknown;
19
+ }
20
+ export interface AbrData {
21
+ Abn?: string;
22
+ EntityName?: string;
23
+ BusinessName?: Array<string | {
24
+ Value?: string;
25
+ }>;
26
+ [key: string]: unknown;
27
+ }
28
+ export interface OfficerRecord {
29
+ company_name: string | null;
30
+ abn: string | null;
31
+ ticker: string | null;
32
+ officer_name: string | null;
33
+ role: string | null;
34
+ appointment_date: string | null;
35
+ cessation_date: string | null;
36
+ _note?: string;
37
+ }
38
+ export declare function resolveTicker(ticker: string, delay?: number): Promise<AsxCompanyInfo | null>;
39
+ export declare function queryAbr(abn: string, delay?: number): Promise<AbrData | null>;
40
+ export declare function queryAsic(_searchTerm: string, delay?: number): Promise<OfficerRecord[]>;
41
+ export declare function lookupOfficers(abnOrTicker: string, maxResults?: number): Promise<OfficerRecord[]>;
42
+ //# sourceMappingURL=asic-officer-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asic-officer-lookup.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/asic-officer-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6BH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAsB,GAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAShC;AAID,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAsB,GAC5B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAsBzB;AAID,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,MAAsB,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAgE1B;AAID,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAA4B,GACvC,OAAO,CAAC,aAAa,EAAE,CAAC,CA0F1B"}