@happyvertical/smrt-users 0.57.2 → 0.57.3
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/README.md +58 -0
- package/dist/chunks/{TerminalAuthService-DUJYJWPP.js → TerminalAuthService-BBWemruU.js} +3 -3
- package/dist/chunks/TerminalAuthService-BBWemruU.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +610 -6
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +2176 -1
- package/dist/member-register/index.d.ts +3 -0
- package/dist/member-register/index.d.ts.map +1 -0
- package/dist/member-register/models.d.ts +103 -0
- package/dist/member-register/models.d.ts.map +1 -0
- package/dist/member-register/service.d.ts +79 -0
- package/dist/member-register/service.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +688 -7
- package/dist/sveltekit.js +1 -1
- package/package.json +10 -10
- package/dist/chunks/TerminalAuthService-DUJYJWPP.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/member-register/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** Tenant-scoped legal member-register records. */
|
|
2
|
+
import { SmrtCollection, SmrtObject } from '@happyvertical/smrt-core';
|
|
3
|
+
export type LegalMemberKind = 'individual' | 'organisation';
|
|
4
|
+
export type LegalMemberStatus = 'active' | 'suspended' | 'resigned' | 'ceased';
|
|
5
|
+
export type MemberReferenceKind = 'share' | 'dues' | 'subscription' | 'agreement' | 'ledger';
|
|
6
|
+
/** A tenant-configured legal class; it has no authority or entitlement effect. */
|
|
7
|
+
export declare class MemberClass extends SmrtObject {
|
|
8
|
+
tenantId: string;
|
|
9
|
+
key: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
/** Host-defined policy hints only; the register does not interpret law. */
|
|
13
|
+
policyMetadata: Record<string, unknown> | null;
|
|
14
|
+
}
|
|
15
|
+
/** The legal register entry, deliberately separate from RBAC Membership. */
|
|
16
|
+
export declare class LegalMember extends SmrtObject {
|
|
17
|
+
tenantId: string;
|
|
18
|
+
memberClassId: string;
|
|
19
|
+
kind: LegalMemberKind;
|
|
20
|
+
displayName: string;
|
|
21
|
+
/** Optional login identity. Its tenant authority is intentionally irrelevant. */
|
|
22
|
+
userId: string | null;
|
|
23
|
+
/** Optional person or organisation profile; an external party needs neither. */
|
|
24
|
+
profileId: string | null;
|
|
25
|
+
/** A host-owned external-party key, not an inferred identity. */
|
|
26
|
+
externalPartyRef: string | null;
|
|
27
|
+
joinedOn: string;
|
|
28
|
+
leftOn: string | null;
|
|
29
|
+
status: LegalMemberStatus;
|
|
30
|
+
}
|
|
31
|
+
/** Append-only effective history; current status never erases it. */
|
|
32
|
+
export declare class LegalMemberStatusHistory extends SmrtObject {
|
|
33
|
+
tenantId: string;
|
|
34
|
+
memberId: string;
|
|
35
|
+
status: LegalMemberStatus;
|
|
36
|
+
effectiveOn: string;
|
|
37
|
+
/** Stable correction order for entries sharing an effective date. */
|
|
38
|
+
sequence: number;
|
|
39
|
+
reason: string;
|
|
40
|
+
actorRef: string | null;
|
|
41
|
+
/** History is corrected by appending another effective entry, never rewriting it. */
|
|
42
|
+
save(): Promise<this>;
|
|
43
|
+
delete(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/** A link to authoritative share/dues/subscription/agreement/ledger evidence. */
|
|
46
|
+
export declare class LegalMemberReference extends SmrtObject {
|
|
47
|
+
tenantId: string;
|
|
48
|
+
memberId: string;
|
|
49
|
+
kind: MemberReferenceKind;
|
|
50
|
+
/** Qualified external model name or host namespace, e.g. @happyvertical/smrt-ledgers:JournalEntry. */
|
|
51
|
+
sourceType: string;
|
|
52
|
+
sourceId: string;
|
|
53
|
+
/** Whether a caller supplied authoritative evidence; no balance is duplicated here. */
|
|
54
|
+
authoritative: boolean;
|
|
55
|
+
/** The date on which this evidence may first support a record-date decision. */
|
|
56
|
+
effectiveFrom: string;
|
|
57
|
+
effectiveTo: string | null;
|
|
58
|
+
/** Original evidence withdrawn by this append-only dated record. */
|
|
59
|
+
revokesId: string | null;
|
|
60
|
+
save(): Promise<this>;
|
|
61
|
+
delete(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
/** A dated register of board/officer appointments; it does not implement elections. */
|
|
64
|
+
export declare class MemberOfficerAppointment extends SmrtObject {
|
|
65
|
+
tenantId: string;
|
|
66
|
+
memberId: string;
|
|
67
|
+
role: string;
|
|
68
|
+
effectiveFrom: string;
|
|
69
|
+
effectiveTo: string | null;
|
|
70
|
+
/** Host-defined authority descriptors; this is not an RBAC grant. */
|
|
71
|
+
authority: Record<string, unknown> | null;
|
|
72
|
+
}
|
|
73
|
+
export declare class MemberEligibilitySnapshot extends SmrtObject {
|
|
74
|
+
tenantId: string;
|
|
75
|
+
memberId: string;
|
|
76
|
+
recordDate: string;
|
|
77
|
+
eligible: boolean;
|
|
78
|
+
reason: string;
|
|
79
|
+
/** Preserves inputs, including unavailable evidence, for a neutral export. */
|
|
80
|
+
evidence: Record<string, unknown> | null;
|
|
81
|
+
/** Record-date evidence is immutable; a later request creates a new snapshot. */
|
|
82
|
+
save(): Promise<this>;
|
|
83
|
+
delete(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
export declare class MemberClassCollection extends SmrtCollection<MemberClass> {
|
|
86
|
+
static readonly _itemClass: typeof MemberClass;
|
|
87
|
+
}
|
|
88
|
+
export declare class LegalMemberCollection extends SmrtCollection<LegalMember> {
|
|
89
|
+
static readonly _itemClass: typeof LegalMember;
|
|
90
|
+
}
|
|
91
|
+
export declare class LegalMemberStatusHistoryCollection extends SmrtCollection<LegalMemberStatusHistory> {
|
|
92
|
+
static readonly _itemClass: typeof LegalMemberStatusHistory;
|
|
93
|
+
}
|
|
94
|
+
export declare class LegalMemberReferenceCollection extends SmrtCollection<LegalMemberReference> {
|
|
95
|
+
static readonly _itemClass: typeof LegalMemberReference;
|
|
96
|
+
}
|
|
97
|
+
export declare class MemberOfficerAppointmentCollection extends SmrtCollection<MemberOfficerAppointment> {
|
|
98
|
+
static readonly _itemClass: typeof MemberOfficerAppointment;
|
|
99
|
+
}
|
|
100
|
+
export declare class MemberEligibilitySnapshotCollection extends SmrtCollection<MemberEligibilitySnapshot> {
|
|
101
|
+
static readonly _itemClass: typeof MemberEligibilitySnapshot;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/member-register/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
import { type LegalMember, type LegalMemberKind, type LegalMemberReference, type LegalMemberStatus, type MemberClass, type MemberOfficerAppointment, type MemberReferenceKind } from './models.js';
|
|
3
|
+
export type IsoDate = string;
|
|
4
|
+
export declare class MemberRegisterError extends Error {
|
|
5
|
+
readonly code: 'MEMBER_REGISTER_INVALID' | 'MEMBER_REGISTER_NOT_FOUND' | 'MEMBER_REGISTER_TENANT_MISMATCH';
|
|
6
|
+
constructor(code: 'MEMBER_REGISTER_INVALID' | 'MEMBER_REGISTER_NOT_FOUND' | 'MEMBER_REGISTER_TENANT_MISMATCH', message: string);
|
|
7
|
+
}
|
|
8
|
+
export interface MemberRegisterActor {
|
|
9
|
+
tenantId: string;
|
|
10
|
+
actorRef?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface EligibilityPolicy {
|
|
13
|
+
memberClassKeys?: readonly string[];
|
|
14
|
+
statuses?: readonly LegalMemberStatus[];
|
|
15
|
+
requireAuthoritativeKinds?: readonly MemberReferenceKind[];
|
|
16
|
+
}
|
|
17
|
+
export interface EligibilityRow {
|
|
18
|
+
memberId: string;
|
|
19
|
+
displayName: string;
|
|
20
|
+
memberClassKey: string;
|
|
21
|
+
recordDate: IsoDate;
|
|
22
|
+
eligible: boolean;
|
|
23
|
+
reason: string;
|
|
24
|
+
evidence: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/** Trusted, tenant-scoped register writer. Hosts authorize the actor before construction. */
|
|
27
|
+
export declare class MemberRegisterService {
|
|
28
|
+
private readonly db;
|
|
29
|
+
private readonly actor;
|
|
30
|
+
private readonly transactionBound?;
|
|
31
|
+
private static readonly transactionToken;
|
|
32
|
+
constructor(db: DatabaseInterface, actor: MemberRegisterActor, transactionBound?: symbol | undefined);
|
|
33
|
+
private transaction;
|
|
34
|
+
private scope;
|
|
35
|
+
private member;
|
|
36
|
+
private assertReferenceKind;
|
|
37
|
+
addClass(input: {
|
|
38
|
+
key: string;
|
|
39
|
+
name: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
policyMetadata?: Record<string, unknown> | null;
|
|
42
|
+
}): Promise<MemberClass>;
|
|
43
|
+
enroll(input: {
|
|
44
|
+
memberClassId: string;
|
|
45
|
+
kind: LegalMemberKind;
|
|
46
|
+
displayName: string;
|
|
47
|
+
joinedOn: IsoDate;
|
|
48
|
+
userId?: string | null;
|
|
49
|
+
profileId?: string | null;
|
|
50
|
+
externalPartyRef?: string | null;
|
|
51
|
+
}): Promise<LegalMember>;
|
|
52
|
+
setStatus(memberId: string, input: {
|
|
53
|
+
status: LegalMemberStatus;
|
|
54
|
+
effectiveOn: IsoDate;
|
|
55
|
+
reason?: string;
|
|
56
|
+
}): Promise<LegalMember>;
|
|
57
|
+
addReference(memberId: string, input: {
|
|
58
|
+
kind: MemberReferenceKind;
|
|
59
|
+
sourceType: string;
|
|
60
|
+
sourceId: string;
|
|
61
|
+
authoritative?: boolean;
|
|
62
|
+
effectiveFrom: IsoDate;
|
|
63
|
+
effectiveTo?: IsoDate | null;
|
|
64
|
+
}): Promise<LegalMemberReference>;
|
|
65
|
+
/** Append a dated withdrawal without changing past evidence or snapshots. */
|
|
66
|
+
revokeReference(referenceId: string, input: {
|
|
67
|
+
effectiveOn: IsoDate;
|
|
68
|
+
}): Promise<LegalMemberReference>;
|
|
69
|
+
appoint(memberId: string, input: {
|
|
70
|
+
role: string;
|
|
71
|
+
effectiveFrom: IsoDate;
|
|
72
|
+
effectiveTo?: IsoDate | null;
|
|
73
|
+
authority?: Record<string, unknown> | null;
|
|
74
|
+
}): Promise<MemberOfficerAppointment>;
|
|
75
|
+
asOf(recordDate: IsoDate, policy?: EligibilityPolicy): Promise<EligibilityRow[]>;
|
|
76
|
+
static exportJson(rows: readonly EligibilityRow[]): string;
|
|
77
|
+
static exportCsv(rows: readonly EligibilityRow[]): string;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/member-register/service.ts"],"names":[],"mappings":"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"}
|