@comms-id/asx 0.4.0 → 0.4.2

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 (51) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-profile.d.ts +21 -0
  3. package/dist/browser-profile.js +115 -0
  4. package/dist/client-replies.d.ts +178 -0
  5. package/dist/client-replies.js +57 -0
  6. package/dist/client.d.ts +25 -0
  7. package/dist/client.js +179 -0
  8. package/dist/collection.d.ts +555 -0
  9. package/dist/collection.js +194 -0
  10. package/dist/company-events.d.ts +2 -0
  11. package/dist/company-events.js +48 -0
  12. package/dist/company-record.d.ts +4 -0
  13. package/dist/company-record.js +60 -0
  14. package/dist/company-stream-client.d.ts +4 -0
  15. package/dist/company-stream-client.js +139 -0
  16. package/dist/company-stream.d.ts +46 -0
  17. package/dist/company-stream.js +117 -0
  18. package/dist/contract/http-api.d.ts +139 -0
  19. package/dist/contract/http-api.js +100 -0
  20. package/dist/directory-search.d.ts +2 -0
  21. package/dist/directory-search.js +33 -0
  22. package/dist/enrichment.d.ts +75 -0
  23. package/dist/enrichment.js +114 -0
  24. package/dist/http.d.ts +1 -0
  25. package/dist/http.js +49 -0
  26. package/dist/live.d.ts +56 -0
  27. package/dist/live.js +129 -0
  28. package/dist/model.d.ts +112 -0
  29. package/dist/model.js +86 -0
  30. package/dist/parse.d.ts +4 -0
  31. package/dist/parse.js +130 -0
  32. package/dist/profile-contact.d.ts +13 -0
  33. package/dist/profile-contact.js +66 -0
  34. package/dist/publication.d.ts +25 -0
  35. package/dist/publication.js +89 -0
  36. package/dist/refresh-coordinator.d.ts +96 -0
  37. package/dist/refresh-coordinator.js +194 -0
  38. package/dist/refresh.d.ts +126 -0
  39. package/dist/refresh.js +157 -0
  40. package/dist/requests.d.ts +10 -0
  41. package/dist/requests.js +21 -0
  42. package/dist/runtime/http.js +8 -1
  43. package/dist/search-service.d.ts +16 -0
  44. package/dist/search-service.js +64 -0
  45. package/dist/service.d.ts +35 -0
  46. package/dist/service.js +99 -0
  47. package/dist/snapshot.d.ts +328 -0
  48. package/dist/snapshot.js +151 -0
  49. package/dist/source-record.d.ts +63 -0
  50. package/dist/source-record.js +91 -0
  51. package/package.json +3 -3
@@ -0,0 +1,64 @@
1
+ import { Effect, Result, Schema } from "effect";
2
+ import { SuggestionsResponse } from "./client-replies.js";
3
+ import { suggestDirectory } from "./directory-search.js";
4
+ import { failure, Failure, isFallbackEligible, isTimestamp } from "./model.js";
5
+ const searchSource = Effect.fn("ASX.searchSource")(function* (sources, source, query, limit) {
6
+ const read = sources[source];
7
+ if (!read)
8
+ return yield* Effect.fail(failure(source === "live" ? "CONFIGURATION_ERROR" : "SNAPSHOT_UNAVAILABLE"));
9
+ const input = yield* Effect.tryPromise({
10
+ try: (signal) => read(query, limit, signal),
11
+ catch: (error) => source === "snapshot"
12
+ ? failure("SNAPSHOT_UNAVAILABLE")
13
+ : Schema.is(Failure)(error)
14
+ ? failure(error.code)
15
+ : failure("TRANSPORT_FAILED"),
16
+ });
17
+ const reply = yield* Schema.decodeUnknownEffect(SuggestionsResponse)(input).pipe(Effect.mapError(() => failure(source === "snapshot" ? "SNAPSHOT_UNAVAILABLE" : "PARSE_FAILED")));
18
+ if (reply.source !== source)
19
+ return yield* Effect.fail(failure("SOURCE_MISMATCH"));
20
+ if (!isTimestamp(reply.directoryObservedAt) ||
21
+ reply.suggestions.length > limit ||
22
+ new Set(reply.suggestions.map((entry) => entry.ticker)).size !== reply.suggestions.length ||
23
+ reply.suggestions.some((entry) => !entry.companyName.trim()) ||
24
+ (reply.source === "snapshot" && reply.fallbackReason !== undefined))
25
+ return yield* Effect.fail(failure(source === "snapshot" ? "SNAPSHOT_UNAVAILABLE" : "PARSE_FAILED"));
26
+ return reply;
27
+ });
28
+ const search = Effect.fn("ASX.search")(function* (sources, query, limit, mode) {
29
+ yield* Effect.try({
30
+ try: () => suggestDirectory([], query, limit),
31
+ catch: () => failure("INVALID_INPUT"),
32
+ });
33
+ if (!["live", "snapshot", "live-first"].includes(mode))
34
+ return yield* Effect.fail(failure("INVALID_INPUT"));
35
+ if (mode === "snapshot")
36
+ return yield* searchSource(sources, "snapshot", query, limit);
37
+ const live = yield* searchSource(sources, "live", query, limit).pipe(Effect.result);
38
+ if (Result.isSuccess(live))
39
+ return live.success;
40
+ if (mode === "live" || !isFallbackEligible(live.failure.code))
41
+ return yield* Effect.fail(live.failure);
42
+ const saved = yield* searchSource(sources, "snapshot", query, limit);
43
+ return { ...saved, fallbackReason: live.failure.code };
44
+ });
45
+ /** Read-only search composition. Live-first acquires saved evidence only after an eligible outage. */
46
+ export function createAsxSearchService(sources) {
47
+ return {
48
+ suggest: async (query, options = {}) => {
49
+ try {
50
+ const result = await Effect.runPromise(Effect.result(search(sources, query, options.limit ?? 8, options.mode ?? "snapshot")), { signal: options.signal });
51
+ if (Result.isFailure(result))
52
+ throw result.failure;
53
+ return result.success;
54
+ }
55
+ catch (error) {
56
+ throw options.signal?.aborted
57
+ ? failure("CANCELLED")
58
+ : Schema.is(Failure)(error)
59
+ ? failure(error.code)
60
+ : failure("INTERNAL_ERROR");
61
+ }
62
+ },
63
+ };
64
+ }
@@ -0,0 +1,35 @@
1
+ import { type AsxError, Observation } from "./model.js";
2
+ import { type ConfirmedEnrichment } from "./enrichment.js";
3
+ export type LookupMode = "live" | "snapshot" | "live-first";
4
+ export type LookupReply = {
5
+ readonly status: "found";
6
+ readonly source: "live";
7
+ readonly observation: Observation;
8
+ } | {
9
+ readonly status: "missing";
10
+ readonly source: "live";
11
+ readonly startedAt: string;
12
+ readonly observedAt: string;
13
+ } | {
14
+ readonly status: "found";
15
+ readonly source: "snapshot";
16
+ readonly observation: Observation;
17
+ readonly generation: string;
18
+ readonly enrichment?: ConfirmedEnrichment;
19
+ readonly requiresRecheck: true;
20
+ readonly fallbackReason?: AsxError["code"];
21
+ } | {
22
+ readonly status: "missing";
23
+ readonly source: "snapshot";
24
+ readonly generation: string;
25
+ };
26
+ export interface AsxSources {
27
+ readonly live?: (ticker: string, signal: AbortSignal) => Promise<unknown>;
28
+ readonly snapshot?: (ticker: string, signal: AbortSignal) => Promise<unknown>;
29
+ }
30
+ export declare function createAsxService(sources: AsxSources): {
31
+ lookup: (ticker: string, options?: {
32
+ mode?: LookupMode;
33
+ signal?: AbortSignal;
34
+ }) => Promise<LookupReply>;
35
+ };
@@ -0,0 +1,99 @@
1
+ import { Effect, Fiber, Result, Schema } from "effect";
2
+ import { failure, Failure, isFallbackEligible, isTimestamp, LiveOutcome, Observation, validObservation, } from "./model.js";
3
+ import { normalizeTicker } from "./parse.js";
4
+ import { SnapshotOutcome } from "./snapshot.js";
5
+ import { validEnrichment } from "./enrichment.js";
6
+ function safeError(error, fallback) {
7
+ return Schema.is(Failure)(error) ? failure(error.code) : failure(fallback);
8
+ }
9
+ const liveLookup = Effect.fn("ASX.live")(function* (sources, ticker) {
10
+ const live = sources.live;
11
+ if (!live)
12
+ return yield* Effect.fail(failure("CONFIGURATION_ERROR"));
13
+ const input = yield* Effect.tryPromise({
14
+ try: (signal) => live(ticker, signal),
15
+ catch: (error) => safeError(error, "TRANSPORT_FAILED"),
16
+ });
17
+ const decoded = yield* Schema.decodeUnknownEffect(LiveOutcome)(input).pipe(Effect.mapError(() => failure("PARSE_FAILED")));
18
+ if (decoded.status === "missing") {
19
+ if (!isTimestamp(decoded.observedAt) ||
20
+ !isTimestamp(decoded.startedAt) ||
21
+ decoded.startedAt > decoded.observedAt)
22
+ return yield* Effect.fail(failure("PARSE_FAILED"));
23
+ }
24
+ else {
25
+ if (!validObservation(decoded.observation))
26
+ return yield* Effect.fail(failure("PARSE_FAILED"));
27
+ if (decoded.observation.company.ticker !== ticker)
28
+ return yield* Effect.fail(failure("SOURCE_MISMATCH"));
29
+ }
30
+ return decoded;
31
+ });
32
+ const snapshotLookup = Effect.fn("ASX.snapshot")(function* (sources, ticker) {
33
+ const snapshot = sources.snapshot;
34
+ if (!snapshot)
35
+ return yield* Effect.fail(failure("SNAPSHOT_UNAVAILABLE"));
36
+ const input = yield* Effect.tryPromise({
37
+ try: (signal) => snapshot(ticker, signal),
38
+ catch: () => failure("SNAPSHOT_UNAVAILABLE"),
39
+ });
40
+ const reply = yield* Schema.decodeUnknownEffect(SnapshotOutcome)(input).pipe(Effect.mapError(() => failure("SNAPSHOT_UNAVAILABLE")));
41
+ if (!/^[a-f0-9]{64}$/.test(reply.generation) || reply.status === "unavailable")
42
+ return yield* Effect.fail(failure("SNAPSHOT_UNAVAILABLE"));
43
+ if (reply.status === "found" &&
44
+ (!Schema.is(Observation)(reply.observation) ||
45
+ !validObservation(reply.observation) ||
46
+ reply.observation.company.ticker !== ticker ||
47
+ (reply.enrichment !== undefined &&
48
+ !validEnrichment(reply.enrichment, reply.observation.company))))
49
+ return yield* Effect.fail(failure("SNAPSHOT_UNAVAILABLE"));
50
+ return reply;
51
+ });
52
+ const lookup = Effect.fn("ASX.lookup")(function* (sources, input, mode) {
53
+ const ticker = yield* Effect.try({
54
+ try: () => normalizeTicker(input),
55
+ catch: () => failure("INVALID_INPUT"),
56
+ });
57
+ if (!["live", "snapshot", "live-first"].includes(mode))
58
+ return yield* Effect.fail(failure("INVALID_INPUT"));
59
+ if (mode === "snapshot") {
60
+ const saved = yield* snapshotLookup(sources, ticker);
61
+ return saved.status === "missing"
62
+ ? { ...saved, source: "snapshot" }
63
+ : { ...saved, source: "snapshot", requiresRecheck: true };
64
+ }
65
+ const saved = mode === "live-first" && sources.snapshot
66
+ ? yield* snapshotLookup(sources, ticker).pipe(Effect.result, Effect.forkChild({ startImmediately: true }))
67
+ : undefined;
68
+ const live = yield* liveLookup(sources, ticker).pipe(Effect.result);
69
+ if (Result.isSuccess(live))
70
+ return { ...live.success, source: "live" };
71
+ if (!isFallbackEligible(live.failure.code) || !saved)
72
+ return yield* Effect.fail(live.failure);
73
+ const result = yield* Fiber.join(saved);
74
+ if (Result.isFailure(result))
75
+ return yield* Effect.fail(result.failure);
76
+ if (result.success.status === "missing")
77
+ return yield* Effect.fail(live.failure);
78
+ return {
79
+ ...result.success,
80
+ source: "snapshot",
81
+ requiresRecheck: true,
82
+ fallbackReason: live.failure.code,
83
+ };
84
+ });
85
+ export function createAsxService(sources) {
86
+ return {
87
+ lookup: async (ticker, options = {}) => {
88
+ try {
89
+ const result = await Effect.runPromise(Effect.result(lookup(sources, ticker, options.mode ?? "live-first")), { signal: options.signal });
90
+ if (Result.isFailure(result))
91
+ throw result.failure;
92
+ return result.success;
93
+ }
94
+ catch (error) {
95
+ throw options.signal?.aborted ? failure("CANCELLED") : safeError(error, "INTERNAL_ERROR");
96
+ }
97
+ },
98
+ };
99
+ }
@@ -0,0 +1,328 @@
1
+ import { Schema } from "effect";
2
+ import { DirectoryEntry } from "./model.js";
3
+ import { ConfirmedEnrichment } from "./enrichment.js";
4
+ /**
5
+ * An ABN matched to a listed company by the owner-accepted name rules (#385): the
6
+ * full legal name, one trailing company suffix removed, a trailing "(THE)" moved to
7
+ * the front, or a comma ignored. A name match, never proof of issuer identity.
8
+ */
9
+ export declare const AbnNameMatch: Schema.Struct<{
10
+ readonly abn: Schema.String;
11
+ readonly acn: Schema.NullOr<Schema.String>;
12
+ readonly abnEntityName: Schema.NonEmptyString;
13
+ readonly rule: Schema.Literals<readonly ["full-name", "suffix-removed", "the-moved", "comma-ignored"]>;
14
+ readonly abnSnapshotDate: Schema.String;
15
+ }>;
16
+ export interface AbnNameMatch extends Schema.Schema.Type<typeof AbnNameMatch> {
17
+ }
18
+ export declare const CompanyRecord: Schema.Struct<{
19
+ readonly directory: Schema.Struct<{
20
+ readonly ticker: Schema.String;
21
+ readonly companyName: Schema.String;
22
+ readonly industryGroup: Schema.NullOr<Schema.String>;
23
+ readonly listingDate: Schema.NullOr<Schema.String>;
24
+ readonly marketCapitalisation: Schema.NullOr<Schema.Number>;
25
+ }>;
26
+ readonly observation: Schema.NullOr<Schema.Struct<{
27
+ readonly company: Schema.Struct<{
28
+ readonly raw: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>>;
29
+ readonly ticker: Schema.String;
30
+ readonly sourceId: Schema.String;
31
+ readonly companyName: Schema.String;
32
+ readonly address: Schema.NullOr<Schema.String>;
33
+ readonly tel: Schema.NullOr<Schema.String>;
34
+ readonly fax: Schema.NullOr<Schema.String>;
35
+ readonly website: Schema.NullOr<Schema.String>;
36
+ readonly description: Schema.NullOr<Schema.String>;
37
+ readonly issueType: Schema.NullOr<Schema.String>;
38
+ readonly foreignExempt: Schema.NullOr<Schema.Boolean>;
39
+ readonly people: Schema.$Array<Schema.Struct<{
40
+ readonly sourceName: Schema.String;
41
+ readonly displayName: Schema.String;
42
+ readonly title: Schema.String;
43
+ readonly sourceCategory: Schema.Literals<readonly ["directors", "secretaries"]>;
44
+ }>>;
45
+ }>;
46
+ readonly startedAt: Schema.String;
47
+ readonly observedAt: Schema.String;
48
+ readonly lastChangedAt: Schema.String;
49
+ }>>;
50
+ readonly sources: Schema.optionalKey<Schema.Struct<{
51
+ readonly asx: Schema.optionalKey<Schema.Struct<{
52
+ readonly source: Schema.Literals<readonly ["asx", "morningstar", "google-finance"]>;
53
+ readonly ticker: Schema.String;
54
+ readonly sourceUrl: Schema.String;
55
+ readonly sourceId: Schema.NonEmptyString;
56
+ readonly status: Schema.Literals<readonly ["found", "missing"]>;
57
+ readonly startedAt: Schema.String;
58
+ readonly observedAt: Schema.String;
59
+ readonly payload: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
60
+ readonly websites: Schema.$Array<Schema.String>;
61
+ }>>;
62
+ readonly morningstar: Schema.optionalKey<Schema.Struct<{
63
+ readonly source: Schema.Literals<readonly ["asx", "morningstar", "google-finance"]>;
64
+ readonly ticker: Schema.String;
65
+ readonly sourceUrl: Schema.String;
66
+ readonly sourceId: Schema.NonEmptyString;
67
+ readonly status: Schema.Literals<readonly ["found", "missing"]>;
68
+ readonly startedAt: Schema.String;
69
+ readonly observedAt: Schema.String;
70
+ readonly payload: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
71
+ readonly websites: Schema.$Array<Schema.String>;
72
+ }>>;
73
+ readonly "google-finance": Schema.optionalKey<Schema.Struct<{
74
+ readonly source: Schema.Literals<readonly ["asx", "morningstar", "google-finance"]>;
75
+ readonly ticker: Schema.String;
76
+ readonly sourceUrl: Schema.String;
77
+ readonly sourceId: Schema.NonEmptyString;
78
+ readonly status: Schema.Literals<readonly ["found", "missing"]>;
79
+ readonly startedAt: Schema.String;
80
+ readonly observedAt: Schema.String;
81
+ readonly payload: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
82
+ readonly websites: Schema.$Array<Schema.String>;
83
+ }>>;
84
+ }>>;
85
+ readonly enrichment: Schema.optionalKey<Schema.Struct<{
86
+ readonly ticker: Schema.String;
87
+ readonly sourceId: Schema.NonEmptyString;
88
+ readonly abn: Schema.String;
89
+ readonly acn: Schema.NullOr<Schema.String>;
90
+ readonly legalName: Schema.NonEmptyString;
91
+ readonly identityEvidence: Schema.Struct<{
92
+ readonly url: Schema.String;
93
+ readonly sha256: Schema.String;
94
+ readonly observedAt: Schema.String;
95
+ readonly kind: Schema.Literals<readonly ["issuer-filing", "issuer-website"]>;
96
+ }>;
97
+ readonly abrEvidence: Schema.Struct<{
98
+ readonly source: Schema.Literals<readonly ["abr-live", "abr-snapshot"]>;
99
+ readonly observedAt: Schema.String;
100
+ }>;
101
+ readonly website: Schema.NullOr<Schema.Struct<{
102
+ readonly url: Schema.String;
103
+ readonly evidence: Schema.Struct<{
104
+ readonly url: Schema.String;
105
+ readonly sha256: Schema.String;
106
+ readonly observedAt: Schema.String;
107
+ readonly kind: Schema.Literals<readonly ["issuer-filing", "issuer-website"]>;
108
+ }>;
109
+ }>>;
110
+ }>>;
111
+ readonly abnNameMatch: Schema.optionalKey<Schema.Struct<{
112
+ readonly abn: Schema.String;
113
+ readonly acn: Schema.NullOr<Schema.String>;
114
+ readonly abnEntityName: Schema.NonEmptyString;
115
+ readonly rule: Schema.Literals<readonly ["full-name", "suffix-removed", "the-moved", "comma-ignored"]>;
116
+ readonly abnSnapshotDate: Schema.String;
117
+ }>>;
118
+ readonly missingAt: Schema.optionalKey<Schema.Struct<{
119
+ readonly startedAt: Schema.String;
120
+ readonly observedAt: Schema.String;
121
+ }>>;
122
+ }>;
123
+ export interface CompanyRecord extends Schema.Schema.Type<typeof CompanyRecord> {
124
+ }
125
+ declare const Dataset: Schema.Struct<{
126
+ readonly formatVersion: Schema.Literal<1>;
127
+ readonly directoryObservedAt: Schema.String;
128
+ readonly records: Schema.$Array<Schema.Struct<{
129
+ readonly directory: Schema.Struct<{
130
+ readonly ticker: Schema.String;
131
+ readonly companyName: Schema.String;
132
+ readonly industryGroup: Schema.NullOr<Schema.String>;
133
+ readonly listingDate: Schema.NullOr<Schema.String>;
134
+ readonly marketCapitalisation: Schema.NullOr<Schema.Number>;
135
+ }>;
136
+ readonly observation: Schema.NullOr<Schema.Struct<{
137
+ readonly company: Schema.Struct<{
138
+ readonly raw: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>>;
139
+ readonly ticker: Schema.String;
140
+ readonly sourceId: Schema.String;
141
+ readonly companyName: Schema.String;
142
+ readonly address: Schema.NullOr<Schema.String>;
143
+ readonly tel: Schema.NullOr<Schema.String>;
144
+ readonly fax: Schema.NullOr<Schema.String>;
145
+ readonly website: Schema.NullOr<Schema.String>;
146
+ readonly description: Schema.NullOr<Schema.String>;
147
+ readonly issueType: Schema.NullOr<Schema.String>;
148
+ readonly foreignExempt: Schema.NullOr<Schema.Boolean>;
149
+ readonly people: Schema.$Array<Schema.Struct<{
150
+ readonly sourceName: Schema.String;
151
+ readonly displayName: Schema.String;
152
+ readonly title: Schema.String;
153
+ readonly sourceCategory: Schema.Literals<readonly ["directors", "secretaries"]>;
154
+ }>>;
155
+ }>;
156
+ readonly startedAt: Schema.String;
157
+ readonly observedAt: Schema.String;
158
+ readonly lastChangedAt: Schema.String;
159
+ }>>;
160
+ readonly sources: Schema.optionalKey<Schema.Struct<{
161
+ readonly asx: Schema.optionalKey<Schema.Struct<{
162
+ readonly source: Schema.Literals<readonly ["asx", "morningstar", "google-finance"]>;
163
+ readonly ticker: Schema.String;
164
+ readonly sourceUrl: Schema.String;
165
+ readonly sourceId: Schema.NonEmptyString;
166
+ readonly status: Schema.Literals<readonly ["found", "missing"]>;
167
+ readonly startedAt: Schema.String;
168
+ readonly observedAt: Schema.String;
169
+ readonly payload: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
170
+ readonly websites: Schema.$Array<Schema.String>;
171
+ }>>;
172
+ readonly morningstar: Schema.optionalKey<Schema.Struct<{
173
+ readonly source: Schema.Literals<readonly ["asx", "morningstar", "google-finance"]>;
174
+ readonly ticker: Schema.String;
175
+ readonly sourceUrl: Schema.String;
176
+ readonly sourceId: Schema.NonEmptyString;
177
+ readonly status: Schema.Literals<readonly ["found", "missing"]>;
178
+ readonly startedAt: Schema.String;
179
+ readonly observedAt: Schema.String;
180
+ readonly payload: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
181
+ readonly websites: Schema.$Array<Schema.String>;
182
+ }>>;
183
+ readonly "google-finance": Schema.optionalKey<Schema.Struct<{
184
+ readonly source: Schema.Literals<readonly ["asx", "morningstar", "google-finance"]>;
185
+ readonly ticker: Schema.String;
186
+ readonly sourceUrl: Schema.String;
187
+ readonly sourceId: Schema.NonEmptyString;
188
+ readonly status: Schema.Literals<readonly ["found", "missing"]>;
189
+ readonly startedAt: Schema.String;
190
+ readonly observedAt: Schema.String;
191
+ readonly payload: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
192
+ readonly websites: Schema.$Array<Schema.String>;
193
+ }>>;
194
+ }>>;
195
+ readonly enrichment: Schema.optionalKey<Schema.Struct<{
196
+ readonly ticker: Schema.String;
197
+ readonly sourceId: Schema.NonEmptyString;
198
+ readonly abn: Schema.String;
199
+ readonly acn: Schema.NullOr<Schema.String>;
200
+ readonly legalName: Schema.NonEmptyString;
201
+ readonly identityEvidence: Schema.Struct<{
202
+ readonly url: Schema.String;
203
+ readonly sha256: Schema.String;
204
+ readonly observedAt: Schema.String;
205
+ readonly kind: Schema.Literals<readonly ["issuer-filing", "issuer-website"]>;
206
+ }>;
207
+ readonly abrEvidence: Schema.Struct<{
208
+ readonly source: Schema.Literals<readonly ["abr-live", "abr-snapshot"]>;
209
+ readonly observedAt: Schema.String;
210
+ }>;
211
+ readonly website: Schema.NullOr<Schema.Struct<{
212
+ readonly url: Schema.String;
213
+ readonly evidence: Schema.Struct<{
214
+ readonly url: Schema.String;
215
+ readonly sha256: Schema.String;
216
+ readonly observedAt: Schema.String;
217
+ readonly kind: Schema.Literals<readonly ["issuer-filing", "issuer-website"]>;
218
+ }>;
219
+ }>>;
220
+ }>>;
221
+ readonly abnNameMatch: Schema.optionalKey<Schema.Struct<{
222
+ readonly abn: Schema.String;
223
+ readonly acn: Schema.NullOr<Schema.String>;
224
+ readonly abnEntityName: Schema.NonEmptyString;
225
+ readonly rule: Schema.Literals<readonly ["full-name", "suffix-removed", "the-moved", "comma-ignored"]>;
226
+ readonly abnSnapshotDate: Schema.String;
227
+ }>>;
228
+ readonly missingAt: Schema.optionalKey<Schema.Struct<{
229
+ readonly startedAt: Schema.String;
230
+ readonly observedAt: Schema.String;
231
+ }>>;
232
+ }>>;
233
+ }>;
234
+ export type AsxDataset = typeof Dataset.Type;
235
+ export declare const SnapshotOutcome: Schema.Union<readonly [Schema.Struct<{
236
+ readonly status: Schema.Literal<"found">;
237
+ readonly observation: Schema.Struct<{
238
+ readonly company: Schema.Struct<{
239
+ readonly raw: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>>;
240
+ readonly ticker: Schema.String;
241
+ readonly sourceId: Schema.String;
242
+ readonly companyName: Schema.String;
243
+ readonly address: Schema.NullOr<Schema.String>;
244
+ readonly tel: Schema.NullOr<Schema.String>;
245
+ readonly fax: Schema.NullOr<Schema.String>;
246
+ readonly website: Schema.NullOr<Schema.String>;
247
+ readonly description: Schema.NullOr<Schema.String>;
248
+ readonly issueType: Schema.NullOr<Schema.String>;
249
+ readonly foreignExempt: Schema.NullOr<Schema.Boolean>;
250
+ readonly people: Schema.$Array<Schema.Struct<{
251
+ readonly sourceName: Schema.String;
252
+ readonly displayName: Schema.String;
253
+ readonly title: Schema.String;
254
+ readonly sourceCategory: Schema.Literals<readonly ["directors", "secretaries"]>;
255
+ }>>;
256
+ }>;
257
+ readonly startedAt: Schema.String;
258
+ readonly observedAt: Schema.String;
259
+ readonly lastChangedAt: Schema.String;
260
+ }>;
261
+ readonly enrichment: Schema.optionalKey<Schema.Struct<{
262
+ readonly ticker: Schema.String;
263
+ readonly sourceId: Schema.NonEmptyString;
264
+ readonly abn: Schema.String;
265
+ readonly acn: Schema.NullOr<Schema.String>;
266
+ readonly legalName: Schema.NonEmptyString;
267
+ readonly identityEvidence: Schema.Struct<{
268
+ readonly url: Schema.String;
269
+ readonly sha256: Schema.String;
270
+ readonly observedAt: Schema.String;
271
+ readonly kind: Schema.Literals<readonly ["issuer-filing", "issuer-website"]>;
272
+ }>;
273
+ readonly abrEvidence: Schema.Struct<{
274
+ readonly source: Schema.Literals<readonly ["abr-live", "abr-snapshot"]>;
275
+ readonly observedAt: Schema.String;
276
+ }>;
277
+ readonly website: Schema.NullOr<Schema.Struct<{
278
+ readonly url: Schema.String;
279
+ readonly evidence: Schema.Struct<{
280
+ readonly url: Schema.String;
281
+ readonly sha256: Schema.String;
282
+ readonly observedAt: Schema.String;
283
+ readonly kind: Schema.Literals<readonly ["issuer-filing", "issuer-website"]>;
284
+ }>;
285
+ }>>;
286
+ }>>;
287
+ readonly generation: Schema.String;
288
+ }>, Schema.Struct<{
289
+ readonly status: Schema.Literal<"missing">;
290
+ readonly generation: Schema.String;
291
+ }>, Schema.Struct<{
292
+ readonly status: Schema.Literal<"unavailable">;
293
+ readonly generation: Schema.String;
294
+ }>]>;
295
+ export type SnapshotOutcome = typeof SnapshotOutcome.Type;
296
+ export interface AsxSnapshot {
297
+ readonly generation: string;
298
+ /** Entire company row, including independent source payloads even when ASX details are absent. */
299
+ readonly record: (ticker: string) => CompanyRecord | null;
300
+ readonly lookup: (ticker: string, signal?: AbortSignal) => Promise<SnapshotOutcome>;
301
+ readonly suggest: (query: string, limit?: number) => readonly DirectoryEntry[];
302
+ readonly findByAbn: (abn: string) => readonly {
303
+ directory: DirectoryEntry;
304
+ enrichment: ConfirmedEnrichment;
305
+ }[];
306
+ /** Listed companies whose name matches this ABN's entity name under the #385 rules. */
307
+ readonly findNameMatchesByAbn: (abn: string) => readonly {
308
+ directory: DirectoryEntry;
309
+ nameMatch: AbnNameMatch;
310
+ }[];
311
+ readonly metadata: () => {
312
+ directoryObservedAt: string;
313
+ records: number;
314
+ availableProfiles: number;
315
+ confirmedAbns: number;
316
+ unresolvedAbns: number;
317
+ confirmedWebsites: number;
318
+ };
319
+ }
320
+ export declare function decodeDataset(input: unknown): AsxDataset;
321
+ /** Build content-addressed bytes; the host must verify its write before selection. */
322
+ export declare function encodeSnapshot(input: unknown): Promise<{
323
+ generation: string;
324
+ text: string;
325
+ }>;
326
+ /** The trusted host pins the expected generation; body content cannot choose it. */
327
+ export declare function openSnapshot(text: string, expectedGeneration: string): Promise<AsxSnapshot>;
328
+ export {};