@ai-matrx/records 0.87.32 → 0.92.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -0
- package/README.md +115 -0
- package/dist/{client-E0VQ0NPO.d.ts → client-DE9Mq6YX.d.cts} +8 -5
- package/dist/{client-C3ZZNfGH.d.cts → client-vJAb7g9r.d.ts} +8 -5
- package/dist/core/index.cjs +25 -7
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +23 -12
- package/dist/core/index.d.ts +23 -12
- package/dist/core/index.js +25 -7
- package/dist/core/index.js.map +1 -1
- package/dist/data/index.cjs +19 -7
- package/dist/data/index.cjs.map +1 -1
- package/dist/data/index.d.cts +12 -142
- package/dist/data/index.d.ts +12 -142
- package/dist/data/index.js +19 -7
- package/dist/data/index.js.map +1 -1
- package/dist/{declareTable-BK3zufr7.d.cts → declareTable-Btg5bql1.d.cts} +4 -4
- package/dist/{declareTable-B12XybRp.d.ts → declareTable-JKt2q34d.d.ts} +4 -4
- package/dist/entity/index.cjs +984 -0
- package/dist/entity/index.cjs.map +1 -0
- package/dist/entity/index.d.cts +36 -0
- package/dist/entity/index.d.ts +36 -0
- package/dist/entity/index.js +964 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/react.cjs +1024 -0
- package/dist/entity/react.cjs.map +1 -0
- package/dist/entity/react.d.cts +511 -0
- package/dist/entity/react.d.ts +511 -0
- package/dist/entity/react.js +1015 -0
- package/dist/entity/react.js.map +1 -0
- package/dist/{field-BanTVGK2.d.cts → field-BJBnTyJ0.d.cts} +1 -1
- package/dist/{field-BPABOJ2Y.d.ts → field-Ti5iAxFr.d.ts} +1 -1
- package/dist/forms/index.cjs +984 -0
- package/dist/forms/index.cjs.map +1 -0
- package/dist/forms/index.d.cts +333 -0
- package/dist/forms/index.d.ts +333 -0
- package/dist/forms/index.js +961 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/index.cjs +10 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -8
- package/dist/index.d.ts +11 -8
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.cts +7 -6
- package/dist/memory/index.d.ts +7 -6
- package/dist/port-CPVBfDxS.d.cts +301 -0
- package/dist/port-D2i2o7Lg.d.ts +301 -0
- package/dist/portal-Db4CYyHe.d.ts +331 -0
- package/dist/portal-DfeY2Boy.d.cts +331 -0
- package/dist/{ports-TMWX-t9l.d.ts → ports-BWtxAnXh.d.ts} +2 -2
- package/dist/{ports-D8-iuY1P.d.cts → ports-DSU2RsR6.d.cts} +2 -2
- package/dist/react/index.cjs +55 -523
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +14 -1
- package/dist/react/index.d.ts +14 -1
- package/dist/react/index.js +52 -527
- package/dist/react/index.js.map +1 -1
- package/dist/realtime/index.d.cts +2 -2
- package/dist/realtime/index.d.ts +2 -2
- package/dist/{record-DpB2QgAZ.d.cts → record-BQi92d4-.d.cts} +7 -1
- package/dist/{record-DpB2QgAZ.d.ts → record-BQi92d4-.d.ts} +7 -1
- package/dist/relation-DMwkmzgN.d.cts +230 -0
- package/dist/relation-DlcqV_W5.d.ts +230 -0
- package/dist/rule-B8kR0l01.d.ts +250 -0
- package/dist/rule-BMViCLmW.d.cts +250 -0
- package/dist/search/index.cjs +283 -0
- package/dist/search/index.cjs.map +1 -0
- package/dist/search/index.d.cts +44 -0
- package/dist/search/index.d.ts +44 -0
- package/dist/search/index.js +260 -0
- package/dist/search/index.js.map +1 -0
- package/dist/setup/index.cjs +6854 -0
- package/dist/setup/index.cjs.map +1 -0
- package/dist/setup/index.d.cts +87 -0
- package/dist/setup/index.d.ts +87 -0
- package/dist/setup/index.js +6829 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/{subscription-D7KQBHXN.d.ts → subscription-5CLN3Jug.d.ts} +3 -249
- package/dist/{subscription-BD9DnJxX.d.cts → subscription-D-VEzvyy.d.cts} +3 -249
- package/dist/{table-kind-BZu8mtND.d.cts → table-kind-CVp43g6h.d.ts} +3 -558
- package/dist/{table-kind-xKxTHtrV.d.ts → table-kind-Cm6PXkWx.d.cts} +3 -558
- package/dist/templates/index.d.cts +10 -9
- package/dist/templates/index.d.ts +10 -9
- package/dist/typed-table/index.cjs +19 -7
- package/dist/typed-table/index.cjs.map +1 -1
- package/dist/typed-table/index.d.cts +10 -7
- package/dist/typed-table/index.d.ts +10 -7
- package/dist/typed-table/index.js +19 -7
- package/dist/typed-table/index.js.map +1 -1
- package/dist/{types-CLP5H4Wk.d.cts → types-9Q5SHRDJ.d.cts} +2 -2
- package/dist/{types-DmPkWQic.d.ts → types-CfYy-vdV.d.ts} +2 -2
- package/dist/{types-C2uspRtf.d.cts → types-Cs2MyE3u.d.cts} +2 -2
- package/dist/{types-Dv61jStB.d.ts → types-DF-dxB_l.d.ts} +2 -2
- package/dist/types-DTEGaxso.d.cts +139 -0
- package/dist/types-Dji5SpFS.d.ts +139 -0
- package/dist/use-cases/index.d.cts +5 -5
- package/dist/use-cases/index.d.ts +5 -5
- package/dist/{validate-CWVToe1T.d.ts → validate-BydKd-Le.d.ts} +1 -1
- package/dist/{validate-DEB_mn4Y.d.cts → validate-CqJakTKk.d.cts} +1 -1
- package/dist/versions/index.cjs +375 -0
- package/dist/versions/index.cjs.map +1 -0
- package/dist/versions/index.d.cts +160 -0
- package/dist/versions/index.d.ts +160 -0
- package/dist/versions/index.js +353 -0
- package/dist/versions/index.js.map +1 -0
- package/package.json +62 -2
package/dist/memory/index.d.cts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { T as TemplateSpec } from '../types-
|
|
3
|
-
import { P as PgError } from '../record-
|
|
4
|
-
import '../subscription-
|
|
5
|
-
import '../
|
|
6
|
-
import '../
|
|
1
|
+
import { c as RecordsDataSource, a as RecordsConfig } from '../ports-DSU2RsR6.cjs';
|
|
2
|
+
import { T as TemplateSpec } from '../types-9Q5SHRDJ.cjs';
|
|
3
|
+
import { P as PgError } from '../record-BQi92d4-.cjs';
|
|
4
|
+
import '../subscription-D-VEzvyy.cjs';
|
|
5
|
+
import '../rule-BMViCLmW.cjs';
|
|
6
|
+
import '../types-Cs2MyE3u.cjs';
|
|
7
|
+
import '../field-BJBnTyJ0.cjs';
|
|
7
8
|
|
|
8
9
|
type Json$1 = Record<string, unknown>;
|
|
9
10
|
/** One presented column, exactly as `platform.drill_describe(...).api.columns[]` says it. */
|
package/dist/memory/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { T as TemplateSpec } from '../types-
|
|
3
|
-
import { P as PgError } from '../record-
|
|
4
|
-
import '../subscription-
|
|
5
|
-
import '../
|
|
6
|
-
import '../
|
|
1
|
+
import { c as RecordsDataSource, a as RecordsConfig } from '../ports-BWtxAnXh.js';
|
|
2
|
+
import { T as TemplateSpec } from '../types-CfYy-vdV.js';
|
|
3
|
+
import { P as PgError } from '../record-BQi92d4-.js';
|
|
4
|
+
import '../subscription-5CLN3Jug.js';
|
|
5
|
+
import '../rule-B8kR0l01.js';
|
|
6
|
+
import '../types-DF-dxB_l.js';
|
|
7
|
+
import '../field-Ti5iAxFr.js';
|
|
7
8
|
|
|
8
9
|
type Json$1 = Record<string, unknown>;
|
|
9
10
|
/** One presented column, exactly as `platform.drill_describe(...).api.columns[]` says it. */
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { L as Lane, H as HostDataPort, V as Values } from './types-DTEGaxso.cjs';
|
|
2
|
+
import { U as Uuid, R as RecordsResult } from './record-BQi92d4-.cjs';
|
|
3
|
+
import * as _ai_matrx_realtime from '@ai-matrx/realtime';
|
|
4
|
+
import { RealtimeManager, ChannelSpec } from '@ai-matrx/realtime';
|
|
5
|
+
|
|
6
|
+
/** A link as the door words it: `{token, id, label}`. */
|
|
7
|
+
interface EntityWireRef {
|
|
8
|
+
token: string;
|
|
9
|
+
id: Uuid;
|
|
10
|
+
label: string | null;
|
|
11
|
+
}
|
|
12
|
+
/** One row exactly as `platform.entity_list_scoped` / `entity_get` answer it. */
|
|
13
|
+
interface EntityWireRow {
|
|
14
|
+
id: Uuid;
|
|
15
|
+
version: number;
|
|
16
|
+
organization_id: Uuid;
|
|
17
|
+
/** The row's own organization's custom fields, already masked by the store (a hidden field is null). */
|
|
18
|
+
_custom?: Record<string, unknown>;
|
|
19
|
+
/** The token's own columns; link columns are `EntityWireRef[]`. */
|
|
20
|
+
[column: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
interface EntitySortApplied {
|
|
23
|
+
column: string;
|
|
24
|
+
dir: "asc" | "desc";
|
|
25
|
+
nulls: "first" | "last";
|
|
26
|
+
}
|
|
27
|
+
interface EntityListAnswer {
|
|
28
|
+
rows: EntityWireRow[];
|
|
29
|
+
/** null when not asked for. */
|
|
30
|
+
total: number | null;
|
|
31
|
+
/** The total stopped at the store's count cap; `total` is then a floor, not a count. */
|
|
32
|
+
total_is_capped: boolean;
|
|
33
|
+
page_size: number;
|
|
34
|
+
/** The keyset cursor of the next page; opaque. */
|
|
35
|
+
next_after: string | null;
|
|
36
|
+
has_more: boolean;
|
|
37
|
+
sort_applied: EntitySortApplied[];
|
|
38
|
+
/** Sort columns the door could not use (it keeps one key today). Said back, never hidden. */
|
|
39
|
+
sort_ignored: string[];
|
|
40
|
+
feed_cursor: null;
|
|
41
|
+
}
|
|
42
|
+
interface EntityGetAnswer {
|
|
43
|
+
rows: EntityWireRow[];
|
|
44
|
+
/** Ids that are not there or that this person cannot open. */
|
|
45
|
+
missing: Uuid[];
|
|
46
|
+
feed_cursor: null;
|
|
47
|
+
}
|
|
48
|
+
interface EntityColumnWire {
|
|
49
|
+
key: string;
|
|
50
|
+
label: string;
|
|
51
|
+
type: string;
|
|
52
|
+
origin: "platform" | "custom";
|
|
53
|
+
required: boolean;
|
|
54
|
+
readOnly: boolean;
|
|
55
|
+
linksTo?: string[];
|
|
56
|
+
choices?: string[];
|
|
57
|
+
/** Custom columns only. */
|
|
58
|
+
field_id?: Uuid;
|
|
59
|
+
organization?: string;
|
|
60
|
+
organization_id?: Uuid;
|
|
61
|
+
}
|
|
62
|
+
interface EntityColumnsAnswer {
|
|
63
|
+
label: string;
|
|
64
|
+
token: string;
|
|
65
|
+
columns: EntityColumnWire[];
|
|
66
|
+
can_create: boolean;
|
|
67
|
+
can_update: boolean;
|
|
68
|
+
/** The type's landing lane (`platform.entity_default_list_scope`). */
|
|
69
|
+
default_scope: Lane;
|
|
70
|
+
}
|
|
71
|
+
/** One filter predicate as the door reads it (CONTRACT §3.2). */
|
|
72
|
+
interface EntityWirePredicate {
|
|
73
|
+
column: string;
|
|
74
|
+
op: string;
|
|
75
|
+
value?: unknown;
|
|
76
|
+
values?: unknown[];
|
|
77
|
+
negated?: boolean;
|
|
78
|
+
}
|
|
79
|
+
interface EntityWireSort {
|
|
80
|
+
column: string;
|
|
81
|
+
dir: "asc" | "desc";
|
|
82
|
+
nulls: "last";
|
|
83
|
+
}
|
|
84
|
+
interface EntityWireQuery {
|
|
85
|
+
/** Absent = the type's own landing lane. `organization_id` narrows any lane and never locks it. */
|
|
86
|
+
scope?: {
|
|
87
|
+
kind?: Lane;
|
|
88
|
+
organization_id?: Uuid;
|
|
89
|
+
};
|
|
90
|
+
filter?: {
|
|
91
|
+
all: EntityWirePredicate[];
|
|
92
|
+
};
|
|
93
|
+
search?: string;
|
|
94
|
+
sort?: EntityWireSort[];
|
|
95
|
+
pageSize?: number;
|
|
96
|
+
}
|
|
97
|
+
/** What every write door answers (`entity_insert` / `entity_update` / `entity_archive` / `entity_unarchive`). */
|
|
98
|
+
interface EntityWriteAnswer {
|
|
99
|
+
status: string;
|
|
100
|
+
/** The rows as the read door now reads them, each with its NEW `version`. */
|
|
101
|
+
rows: EntityWireRow[];
|
|
102
|
+
validation: unknown[];
|
|
103
|
+
feed_cursor: null;
|
|
104
|
+
/** Archive and restore say what they did, in the store's words (trash words on these types). */
|
|
105
|
+
message?: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* THE ECHO HEADER (U6). The entity doors take no `_op_id` argument: the writer's op id rides the request
|
|
110
|
+
* as this header, PostgREST hands it to `request.headers`, and `platform._entity_org_notice` puts it on
|
|
111
|
+
* the notice as `op_id`, so the browser that wrote drops its own echo (`@ai-matrx/records` `isOwnOp`).
|
|
112
|
+
*/
|
|
113
|
+
declare const OP_ID_HEADER = "x-matrx-op-id";
|
|
114
|
+
/** What a write takes beyond its arguments: the op id minted for it (`mintOpId`). */
|
|
115
|
+
interface EntityWriteOptions {
|
|
116
|
+
opId?: string;
|
|
117
|
+
}
|
|
118
|
+
/** The schema every entity door lives in. */
|
|
119
|
+
declare const ENTITY_DOOR_SCHEMA = "platform";
|
|
120
|
+
interface CreateEntityClientOptions {
|
|
121
|
+
/** A supabase-js v2 client for the signed-in person, or anything with `rpc(fn, args, {schema})`. */
|
|
122
|
+
dataSource?: unknown;
|
|
123
|
+
/** Same thing, spelled the way the plan names it. Give one of the two. */
|
|
124
|
+
supabase?: unknown;
|
|
125
|
+
}
|
|
126
|
+
interface EntityListRequest extends EntityWireQuery {
|
|
127
|
+
token: string;
|
|
128
|
+
/** Keyset cursor from the previous answer's `next_after`. */
|
|
129
|
+
after?: string | null;
|
|
130
|
+
/** Ask the door to skip the count. Default: counted. */
|
|
131
|
+
withTotal?: boolean;
|
|
132
|
+
archived?: "active" | "archived" | "all";
|
|
133
|
+
}
|
|
134
|
+
interface EntityClient {
|
|
135
|
+
list(request: EntityListRequest): Promise<RecordsResult<EntityListAnswer>>;
|
|
136
|
+
get(request: {
|
|
137
|
+
token: string;
|
|
138
|
+
ids: readonly Uuid[];
|
|
139
|
+
}): Promise<RecordsResult<EntityGetAnswer>>;
|
|
140
|
+
/** `organizationId` null reads the custom fields of every organization the person belongs to. */
|
|
141
|
+
columns(request: {
|
|
142
|
+
token: string;
|
|
143
|
+
organizationId?: Uuid | null;
|
|
144
|
+
}): Promise<RecordsResult<EntityColumnsAnswer>>;
|
|
145
|
+
/** One `entity_data` knob as `platform.knob_resolve` answers it for an organization (live updates read three). */
|
|
146
|
+
knob(request: {
|
|
147
|
+
key: string;
|
|
148
|
+
organizationId?: Uuid | null;
|
|
149
|
+
}): Promise<RecordsResult<unknown>>;
|
|
150
|
+
/** `platform.entity_insert`: rows into the organization the host names (never guessed). */
|
|
151
|
+
insert(request: {
|
|
152
|
+
token: string;
|
|
153
|
+
organizationId: Uuid;
|
|
154
|
+
rows: readonly Record<string, unknown>[];
|
|
155
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
156
|
+
/** `platform.entity_update`: one row, refused as stale (`MX001`) unless `baseVersion` is still current. */
|
|
157
|
+
update(request: {
|
|
158
|
+
token: string;
|
|
159
|
+
id: Uuid;
|
|
160
|
+
baseVersion: number;
|
|
161
|
+
patch: Record<string, unknown>;
|
|
162
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
163
|
+
/** `platform.entity_archive` (on these types, the trash). */
|
|
164
|
+
archive(request: {
|
|
165
|
+
token: string;
|
|
166
|
+
ids: readonly Uuid[];
|
|
167
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
168
|
+
/** `platform.entity_unarchive`. */
|
|
169
|
+
unarchive(request: {
|
|
170
|
+
token: string;
|
|
171
|
+
ids: readonly Uuid[];
|
|
172
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
173
|
+
/** The organizations the person belongs to, as row security counts them (`iam.my_orgs()`: archived ones closed). */
|
|
174
|
+
memberOrganizations(): Promise<RecordsResult<Uuid[]>>;
|
|
175
|
+
}
|
|
176
|
+
declare function createEntityClient(options: CreateEntityClientOptions): EntityClient;
|
|
177
|
+
|
|
178
|
+
/** The topic is a CONTRACT WITH THE DATABASE (a trigger writes it, an RLS policy parses it): built once, here. */
|
|
179
|
+
declare const entityOrgChannel: _ai_matrx_realtime.ChannelNamespace;
|
|
180
|
+
/** The broadcast event the database sends on an organization topic. */
|
|
181
|
+
declare const ENTITY_NOTICE_EVENT = "entity_bump";
|
|
182
|
+
/** Starting values of the knobs the runtime coalesces with (entity_data.realtime_batch_ms / _max_wait_ms). */
|
|
183
|
+
declare const DEFAULT_BATCH_MS = 150;
|
|
184
|
+
declare const DEFAULT_MAX_WAIT_MS = 1000;
|
|
185
|
+
/** Starting value of knob entity_data.realtime_max_org_topics. */
|
|
186
|
+
declare const DEFAULT_MAX_ORG_TOPICS = 20;
|
|
187
|
+
interface EntityNotice {
|
|
188
|
+
id?: string;
|
|
189
|
+
entity_type?: string;
|
|
190
|
+
organization_id?: string;
|
|
191
|
+
op?: "created" | "updated" | "deleted";
|
|
192
|
+
/** The client operation that caused it (header `x-matrx-op-id`), or null for any other writer. */
|
|
193
|
+
op_id?: string | null;
|
|
194
|
+
/** `null` MEANS "more changed than the database lists: re-read". */
|
|
195
|
+
ids?: string[] | null;
|
|
196
|
+
at?: string;
|
|
197
|
+
}
|
|
198
|
+
/** A redelivered notice is the same notice: the database mints one id per send. */
|
|
199
|
+
declare function entityNoticeKey(notice: EntityNotice): string | undefined;
|
|
200
|
+
declare function entityOrgTopic(organizationId: string, token: string): string;
|
|
201
|
+
/** The channel spec for one (organization, token): private, echo-guarded, deduped, backfilled. */
|
|
202
|
+
declare function entityOrgChannelSpec(organizationId: string, token: string, onNotice: (notice: EntityNotice) => void, onBackfill: () => void): ChannelSpec;
|
|
203
|
+
/**
|
|
204
|
+
* Which organization topics to join, in order, until `max`: the active organization, the alias's `org`
|
|
205
|
+
* filter, then the organizations of held rows by number of held rows (descending; organization id
|
|
206
|
+
* ascending on ties), then the person's remaining memberships by id. Only memberships are kept when they
|
|
207
|
+
* are known — any other topic is refused by the database anyway. Deterministic for the same input.
|
|
208
|
+
*/
|
|
209
|
+
declare function orderOrganizationTopics(input: {
|
|
210
|
+
active?: string | null;
|
|
211
|
+
filter?: string | null;
|
|
212
|
+
held?: ReadonlyMap<string, number>;
|
|
213
|
+
members?: readonly string[] | null;
|
|
214
|
+
max: number;
|
|
215
|
+
}): string[];
|
|
216
|
+
interface EntityNoticeSink {
|
|
217
|
+
/** `ids` to re-read, or `null` to re-read everything this reader shows. */
|
|
218
|
+
rows(ids: string[] | null): void;
|
|
219
|
+
}
|
|
220
|
+
interface EntityRealtime {
|
|
221
|
+
/** Hear `token` across `organizationIds`; the sink gets one coalesced call per burst. Returns the stop. */
|
|
222
|
+
subscribe(target: {
|
|
223
|
+
token: string;
|
|
224
|
+
organizationIds: readonly string[];
|
|
225
|
+
}, sink: EntityNoticeSink): () => void;
|
|
226
|
+
}
|
|
227
|
+
interface CreateEntityRealtimeOptions {
|
|
228
|
+
/** The host's realtime manager. Left out, the AMBIENT manager the app mounted — never a socket of our own. */
|
|
229
|
+
manager?: RealtimeManager;
|
|
230
|
+
/** Knob entity_data.realtime_batch_ms (starting value 150). */
|
|
231
|
+
batchMs?: number;
|
|
232
|
+
/** Knob entity_data.realtime_max_wait_ms (starting value 1000). */
|
|
233
|
+
maxWaitMs?: number;
|
|
234
|
+
}
|
|
235
|
+
/** The live-notice layer for platform lists, bound to a realtime manager. One per host is enough. */
|
|
236
|
+
declare function createEntityRealtime(options?: CreateEntityRealtimeOptions): EntityRealtime;
|
|
237
|
+
/** The three live-update knobs as the store answers them for an organization (starting values when unset). */
|
|
238
|
+
declare function readEntityRealtimeKnobs(client: Pick<EntityClient, "knob">, organizationId?: string | null): Promise<{
|
|
239
|
+
batchMs: number;
|
|
240
|
+
maxWaitMs: number;
|
|
241
|
+
maxOrgTopics: number;
|
|
242
|
+
}>;
|
|
243
|
+
|
|
244
|
+
/** An alias as the Applet record declares it for an entity: one token (a `platform.entity_types` word). */
|
|
245
|
+
interface EntityAlias {
|
|
246
|
+
kind: "entity";
|
|
247
|
+
token: string;
|
|
248
|
+
/** Whose custom fields `columns()` reads. Left out: every organization the person belongs to. */
|
|
249
|
+
organizationId?: Uuid;
|
|
250
|
+
/** Shown in `sources()`; the type's own name when left out. */
|
|
251
|
+
label?: string;
|
|
252
|
+
}
|
|
253
|
+
interface CreateEntityDataPortOptions {
|
|
254
|
+
/** A client from `createEntityClient` … */
|
|
255
|
+
client?: EntityClient;
|
|
256
|
+
/** … or the supabase-js client (or `rpc` source) to build one from. Give one of the two. */
|
|
257
|
+
dataSource?: unknown;
|
|
258
|
+
aliases: Readonly<Record<string, EntityAlias>>;
|
|
259
|
+
/**
|
|
260
|
+
* TOKEN-FIRST (the `/react` layer): an alias nobody declared is read as a type token —
|
|
261
|
+
* `list("party")` is `{kind:"entity", token:"party"}`. `sources()` still lists only the declared
|
|
262
|
+
* aliases. Off by default: an Applet's port answers only what its record declares.
|
|
263
|
+
*/
|
|
264
|
+
tokensAreAliases?: boolean;
|
|
265
|
+
/**
|
|
266
|
+
* The active organization (CONTRACTS §4: `viewer().activeOrganizationId`), read at the moment it is
|
|
267
|
+
* needed: where `create` saves, and the first live topic joined. The host's own answer, never guessed;
|
|
268
|
+
* null/undefined means none is chosen and `create` is refused `organization_required`.
|
|
269
|
+
*/
|
|
270
|
+
activeOrganizationId?: () => Uuid | null | undefined;
|
|
271
|
+
/** A fixed active organization, for a host whose port lives no longer than its choice. `activeOrganizationId` wins. */
|
|
272
|
+
organization?: Uuid | null;
|
|
273
|
+
/** The host's live-notice layer (`createEntityRealtime`). Left out, lists are as fresh as their last read. */
|
|
274
|
+
realtime?: EntityRealtime;
|
|
275
|
+
}
|
|
276
|
+
/** A value as rows carry it → as the write doors take it: a link (`EntityRef[]` or one ref) becomes its id. */
|
|
277
|
+
declare function toWireValue(value: unknown): unknown;
|
|
278
|
+
/** `Values` → the doors' `{column: value, _custom: {key: value}}`: links back to ids at both levels. */
|
|
279
|
+
declare function toWireValues(values: Values): Record<string, unknown>;
|
|
280
|
+
/** A type as the person may use it: its name and whether she may add or change rows (`entity_columns`' own answer). */
|
|
281
|
+
interface EntityTypeFacts {
|
|
282
|
+
token: string;
|
|
283
|
+
label: string;
|
|
284
|
+
canCreate: boolean;
|
|
285
|
+
canUpdate: boolean;
|
|
286
|
+
}
|
|
287
|
+
/** The host's entity port: the DataPort, plus `describe` for a token-first screen that has no `sources()` entry. */
|
|
288
|
+
interface EntityDataPort extends HostDataPort {
|
|
289
|
+
/** The type behind an alias, from the same one `entity_columns` read `columns()` uses. */
|
|
290
|
+
describe(alias: string): Promise<RecordsResult<EntityTypeFacts>>;
|
|
291
|
+
}
|
|
292
|
+
declare function createEntityDataPort(options: CreateEntityDataPortOptions): EntityDataPort;
|
|
293
|
+
/**
|
|
294
|
+
* THE PORT A SERVER ASKS THROUGH, AND THE PAGE READS THROUGH WHILE IT HYDRATES (lane SEED-ENTITY).
|
|
295
|
+
* One construction for both, so the doors' arguments are the same on either side: a token is its own
|
|
296
|
+
* alias, nothing is bound to an organization, and nothing is live. `dataSource` is the person's own
|
|
297
|
+
* (server), a recording one, or one that answers from a page seed.
|
|
298
|
+
*/
|
|
299
|
+
declare function createSeedPort(dataSource: unknown): EntityDataPort;
|
|
300
|
+
|
|
301
|
+
export { createEntityDataPort as A, createEntityRealtime as B, type CreateEntityDataPortOptions as C, DEFAULT_BATCH_MS as D, type EntityDataPort as E, createSeedPort as F, entityNoticeKey as G, entityOrgChannel as H, entityOrgChannelSpec as I, entityOrgTopic as J, orderOrganizationTopics as K, readEntityRealtimeKnobs as L, toWireValue as M, toWireValues as N, OP_ID_HEADER as O, type EntityWireQuery as a, type EntityColumnWire as b, type EntityWireRow as c, type CreateEntityClientOptions as d, type CreateEntityRealtimeOptions as e, DEFAULT_MAX_ORG_TOPICS as f, DEFAULT_MAX_WAIT_MS as g, ENTITY_DOOR_SCHEMA as h, ENTITY_NOTICE_EVENT as i, type EntityAlias as j, type EntityClient as k, type EntityColumnsAnswer as l, type EntityGetAnswer as m, type EntityListAnswer as n, type EntityListRequest as o, type EntityNotice as p, type EntityNoticeSink as q, type EntityRealtime as r, type EntitySortApplied as s, type EntityTypeFacts as t, type EntityWirePredicate as u, type EntityWireRef as v, type EntityWireSort as w, type EntityWriteAnswer as x, type EntityWriteOptions as y, createEntityClient as z };
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { L as Lane, H as HostDataPort, V as Values } from './types-Dji5SpFS.js';
|
|
2
|
+
import { U as Uuid, R as RecordsResult } from './record-BQi92d4-.js';
|
|
3
|
+
import * as _ai_matrx_realtime from '@ai-matrx/realtime';
|
|
4
|
+
import { RealtimeManager, ChannelSpec } from '@ai-matrx/realtime';
|
|
5
|
+
|
|
6
|
+
/** A link as the door words it: `{token, id, label}`. */
|
|
7
|
+
interface EntityWireRef {
|
|
8
|
+
token: string;
|
|
9
|
+
id: Uuid;
|
|
10
|
+
label: string | null;
|
|
11
|
+
}
|
|
12
|
+
/** One row exactly as `platform.entity_list_scoped` / `entity_get` answer it. */
|
|
13
|
+
interface EntityWireRow {
|
|
14
|
+
id: Uuid;
|
|
15
|
+
version: number;
|
|
16
|
+
organization_id: Uuid;
|
|
17
|
+
/** The row's own organization's custom fields, already masked by the store (a hidden field is null). */
|
|
18
|
+
_custom?: Record<string, unknown>;
|
|
19
|
+
/** The token's own columns; link columns are `EntityWireRef[]`. */
|
|
20
|
+
[column: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
interface EntitySortApplied {
|
|
23
|
+
column: string;
|
|
24
|
+
dir: "asc" | "desc";
|
|
25
|
+
nulls: "first" | "last";
|
|
26
|
+
}
|
|
27
|
+
interface EntityListAnswer {
|
|
28
|
+
rows: EntityWireRow[];
|
|
29
|
+
/** null when not asked for. */
|
|
30
|
+
total: number | null;
|
|
31
|
+
/** The total stopped at the store's count cap; `total` is then a floor, not a count. */
|
|
32
|
+
total_is_capped: boolean;
|
|
33
|
+
page_size: number;
|
|
34
|
+
/** The keyset cursor of the next page; opaque. */
|
|
35
|
+
next_after: string | null;
|
|
36
|
+
has_more: boolean;
|
|
37
|
+
sort_applied: EntitySortApplied[];
|
|
38
|
+
/** Sort columns the door could not use (it keeps one key today). Said back, never hidden. */
|
|
39
|
+
sort_ignored: string[];
|
|
40
|
+
feed_cursor: null;
|
|
41
|
+
}
|
|
42
|
+
interface EntityGetAnswer {
|
|
43
|
+
rows: EntityWireRow[];
|
|
44
|
+
/** Ids that are not there or that this person cannot open. */
|
|
45
|
+
missing: Uuid[];
|
|
46
|
+
feed_cursor: null;
|
|
47
|
+
}
|
|
48
|
+
interface EntityColumnWire {
|
|
49
|
+
key: string;
|
|
50
|
+
label: string;
|
|
51
|
+
type: string;
|
|
52
|
+
origin: "platform" | "custom";
|
|
53
|
+
required: boolean;
|
|
54
|
+
readOnly: boolean;
|
|
55
|
+
linksTo?: string[];
|
|
56
|
+
choices?: string[];
|
|
57
|
+
/** Custom columns only. */
|
|
58
|
+
field_id?: Uuid;
|
|
59
|
+
organization?: string;
|
|
60
|
+
organization_id?: Uuid;
|
|
61
|
+
}
|
|
62
|
+
interface EntityColumnsAnswer {
|
|
63
|
+
label: string;
|
|
64
|
+
token: string;
|
|
65
|
+
columns: EntityColumnWire[];
|
|
66
|
+
can_create: boolean;
|
|
67
|
+
can_update: boolean;
|
|
68
|
+
/** The type's landing lane (`platform.entity_default_list_scope`). */
|
|
69
|
+
default_scope: Lane;
|
|
70
|
+
}
|
|
71
|
+
/** One filter predicate as the door reads it (CONTRACT §3.2). */
|
|
72
|
+
interface EntityWirePredicate {
|
|
73
|
+
column: string;
|
|
74
|
+
op: string;
|
|
75
|
+
value?: unknown;
|
|
76
|
+
values?: unknown[];
|
|
77
|
+
negated?: boolean;
|
|
78
|
+
}
|
|
79
|
+
interface EntityWireSort {
|
|
80
|
+
column: string;
|
|
81
|
+
dir: "asc" | "desc";
|
|
82
|
+
nulls: "last";
|
|
83
|
+
}
|
|
84
|
+
interface EntityWireQuery {
|
|
85
|
+
/** Absent = the type's own landing lane. `organization_id` narrows any lane and never locks it. */
|
|
86
|
+
scope?: {
|
|
87
|
+
kind?: Lane;
|
|
88
|
+
organization_id?: Uuid;
|
|
89
|
+
};
|
|
90
|
+
filter?: {
|
|
91
|
+
all: EntityWirePredicate[];
|
|
92
|
+
};
|
|
93
|
+
search?: string;
|
|
94
|
+
sort?: EntityWireSort[];
|
|
95
|
+
pageSize?: number;
|
|
96
|
+
}
|
|
97
|
+
/** What every write door answers (`entity_insert` / `entity_update` / `entity_archive` / `entity_unarchive`). */
|
|
98
|
+
interface EntityWriteAnswer {
|
|
99
|
+
status: string;
|
|
100
|
+
/** The rows as the read door now reads them, each with its NEW `version`. */
|
|
101
|
+
rows: EntityWireRow[];
|
|
102
|
+
validation: unknown[];
|
|
103
|
+
feed_cursor: null;
|
|
104
|
+
/** Archive and restore say what they did, in the store's words (trash words on these types). */
|
|
105
|
+
message?: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* THE ECHO HEADER (U6). The entity doors take no `_op_id` argument: the writer's op id rides the request
|
|
110
|
+
* as this header, PostgREST hands it to `request.headers`, and `platform._entity_org_notice` puts it on
|
|
111
|
+
* the notice as `op_id`, so the browser that wrote drops its own echo (`@ai-matrx/records` `isOwnOp`).
|
|
112
|
+
*/
|
|
113
|
+
declare const OP_ID_HEADER = "x-matrx-op-id";
|
|
114
|
+
/** What a write takes beyond its arguments: the op id minted for it (`mintOpId`). */
|
|
115
|
+
interface EntityWriteOptions {
|
|
116
|
+
opId?: string;
|
|
117
|
+
}
|
|
118
|
+
/** The schema every entity door lives in. */
|
|
119
|
+
declare const ENTITY_DOOR_SCHEMA = "platform";
|
|
120
|
+
interface CreateEntityClientOptions {
|
|
121
|
+
/** A supabase-js v2 client for the signed-in person, or anything with `rpc(fn, args, {schema})`. */
|
|
122
|
+
dataSource?: unknown;
|
|
123
|
+
/** Same thing, spelled the way the plan names it. Give one of the two. */
|
|
124
|
+
supabase?: unknown;
|
|
125
|
+
}
|
|
126
|
+
interface EntityListRequest extends EntityWireQuery {
|
|
127
|
+
token: string;
|
|
128
|
+
/** Keyset cursor from the previous answer's `next_after`. */
|
|
129
|
+
after?: string | null;
|
|
130
|
+
/** Ask the door to skip the count. Default: counted. */
|
|
131
|
+
withTotal?: boolean;
|
|
132
|
+
archived?: "active" | "archived" | "all";
|
|
133
|
+
}
|
|
134
|
+
interface EntityClient {
|
|
135
|
+
list(request: EntityListRequest): Promise<RecordsResult<EntityListAnswer>>;
|
|
136
|
+
get(request: {
|
|
137
|
+
token: string;
|
|
138
|
+
ids: readonly Uuid[];
|
|
139
|
+
}): Promise<RecordsResult<EntityGetAnswer>>;
|
|
140
|
+
/** `organizationId` null reads the custom fields of every organization the person belongs to. */
|
|
141
|
+
columns(request: {
|
|
142
|
+
token: string;
|
|
143
|
+
organizationId?: Uuid | null;
|
|
144
|
+
}): Promise<RecordsResult<EntityColumnsAnswer>>;
|
|
145
|
+
/** One `entity_data` knob as `platform.knob_resolve` answers it for an organization (live updates read three). */
|
|
146
|
+
knob(request: {
|
|
147
|
+
key: string;
|
|
148
|
+
organizationId?: Uuid | null;
|
|
149
|
+
}): Promise<RecordsResult<unknown>>;
|
|
150
|
+
/** `platform.entity_insert`: rows into the organization the host names (never guessed). */
|
|
151
|
+
insert(request: {
|
|
152
|
+
token: string;
|
|
153
|
+
organizationId: Uuid;
|
|
154
|
+
rows: readonly Record<string, unknown>[];
|
|
155
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
156
|
+
/** `platform.entity_update`: one row, refused as stale (`MX001`) unless `baseVersion` is still current. */
|
|
157
|
+
update(request: {
|
|
158
|
+
token: string;
|
|
159
|
+
id: Uuid;
|
|
160
|
+
baseVersion: number;
|
|
161
|
+
patch: Record<string, unknown>;
|
|
162
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
163
|
+
/** `platform.entity_archive` (on these types, the trash). */
|
|
164
|
+
archive(request: {
|
|
165
|
+
token: string;
|
|
166
|
+
ids: readonly Uuid[];
|
|
167
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
168
|
+
/** `platform.entity_unarchive`. */
|
|
169
|
+
unarchive(request: {
|
|
170
|
+
token: string;
|
|
171
|
+
ids: readonly Uuid[];
|
|
172
|
+
} & EntityWriteOptions): Promise<RecordsResult<EntityWriteAnswer>>;
|
|
173
|
+
/** The organizations the person belongs to, as row security counts them (`iam.my_orgs()`: archived ones closed). */
|
|
174
|
+
memberOrganizations(): Promise<RecordsResult<Uuid[]>>;
|
|
175
|
+
}
|
|
176
|
+
declare function createEntityClient(options: CreateEntityClientOptions): EntityClient;
|
|
177
|
+
|
|
178
|
+
/** The topic is a CONTRACT WITH THE DATABASE (a trigger writes it, an RLS policy parses it): built once, here. */
|
|
179
|
+
declare const entityOrgChannel: _ai_matrx_realtime.ChannelNamespace;
|
|
180
|
+
/** The broadcast event the database sends on an organization topic. */
|
|
181
|
+
declare const ENTITY_NOTICE_EVENT = "entity_bump";
|
|
182
|
+
/** Starting values of the knobs the runtime coalesces with (entity_data.realtime_batch_ms / _max_wait_ms). */
|
|
183
|
+
declare const DEFAULT_BATCH_MS = 150;
|
|
184
|
+
declare const DEFAULT_MAX_WAIT_MS = 1000;
|
|
185
|
+
/** Starting value of knob entity_data.realtime_max_org_topics. */
|
|
186
|
+
declare const DEFAULT_MAX_ORG_TOPICS = 20;
|
|
187
|
+
interface EntityNotice {
|
|
188
|
+
id?: string;
|
|
189
|
+
entity_type?: string;
|
|
190
|
+
organization_id?: string;
|
|
191
|
+
op?: "created" | "updated" | "deleted";
|
|
192
|
+
/** The client operation that caused it (header `x-matrx-op-id`), or null for any other writer. */
|
|
193
|
+
op_id?: string | null;
|
|
194
|
+
/** `null` MEANS "more changed than the database lists: re-read". */
|
|
195
|
+
ids?: string[] | null;
|
|
196
|
+
at?: string;
|
|
197
|
+
}
|
|
198
|
+
/** A redelivered notice is the same notice: the database mints one id per send. */
|
|
199
|
+
declare function entityNoticeKey(notice: EntityNotice): string | undefined;
|
|
200
|
+
declare function entityOrgTopic(organizationId: string, token: string): string;
|
|
201
|
+
/** The channel spec for one (organization, token): private, echo-guarded, deduped, backfilled. */
|
|
202
|
+
declare function entityOrgChannelSpec(organizationId: string, token: string, onNotice: (notice: EntityNotice) => void, onBackfill: () => void): ChannelSpec;
|
|
203
|
+
/**
|
|
204
|
+
* Which organization topics to join, in order, until `max`: the active organization, the alias's `org`
|
|
205
|
+
* filter, then the organizations of held rows by number of held rows (descending; organization id
|
|
206
|
+
* ascending on ties), then the person's remaining memberships by id. Only memberships are kept when they
|
|
207
|
+
* are known — any other topic is refused by the database anyway. Deterministic for the same input.
|
|
208
|
+
*/
|
|
209
|
+
declare function orderOrganizationTopics(input: {
|
|
210
|
+
active?: string | null;
|
|
211
|
+
filter?: string | null;
|
|
212
|
+
held?: ReadonlyMap<string, number>;
|
|
213
|
+
members?: readonly string[] | null;
|
|
214
|
+
max: number;
|
|
215
|
+
}): string[];
|
|
216
|
+
interface EntityNoticeSink {
|
|
217
|
+
/** `ids` to re-read, or `null` to re-read everything this reader shows. */
|
|
218
|
+
rows(ids: string[] | null): void;
|
|
219
|
+
}
|
|
220
|
+
interface EntityRealtime {
|
|
221
|
+
/** Hear `token` across `organizationIds`; the sink gets one coalesced call per burst. Returns the stop. */
|
|
222
|
+
subscribe(target: {
|
|
223
|
+
token: string;
|
|
224
|
+
organizationIds: readonly string[];
|
|
225
|
+
}, sink: EntityNoticeSink): () => void;
|
|
226
|
+
}
|
|
227
|
+
interface CreateEntityRealtimeOptions {
|
|
228
|
+
/** The host's realtime manager. Left out, the AMBIENT manager the app mounted — never a socket of our own. */
|
|
229
|
+
manager?: RealtimeManager;
|
|
230
|
+
/** Knob entity_data.realtime_batch_ms (starting value 150). */
|
|
231
|
+
batchMs?: number;
|
|
232
|
+
/** Knob entity_data.realtime_max_wait_ms (starting value 1000). */
|
|
233
|
+
maxWaitMs?: number;
|
|
234
|
+
}
|
|
235
|
+
/** The live-notice layer for platform lists, bound to a realtime manager. One per host is enough. */
|
|
236
|
+
declare function createEntityRealtime(options?: CreateEntityRealtimeOptions): EntityRealtime;
|
|
237
|
+
/** The three live-update knobs as the store answers them for an organization (starting values when unset). */
|
|
238
|
+
declare function readEntityRealtimeKnobs(client: Pick<EntityClient, "knob">, organizationId?: string | null): Promise<{
|
|
239
|
+
batchMs: number;
|
|
240
|
+
maxWaitMs: number;
|
|
241
|
+
maxOrgTopics: number;
|
|
242
|
+
}>;
|
|
243
|
+
|
|
244
|
+
/** An alias as the Applet record declares it for an entity: one token (a `platform.entity_types` word). */
|
|
245
|
+
interface EntityAlias {
|
|
246
|
+
kind: "entity";
|
|
247
|
+
token: string;
|
|
248
|
+
/** Whose custom fields `columns()` reads. Left out: every organization the person belongs to. */
|
|
249
|
+
organizationId?: Uuid;
|
|
250
|
+
/** Shown in `sources()`; the type's own name when left out. */
|
|
251
|
+
label?: string;
|
|
252
|
+
}
|
|
253
|
+
interface CreateEntityDataPortOptions {
|
|
254
|
+
/** A client from `createEntityClient` … */
|
|
255
|
+
client?: EntityClient;
|
|
256
|
+
/** … or the supabase-js client (or `rpc` source) to build one from. Give one of the two. */
|
|
257
|
+
dataSource?: unknown;
|
|
258
|
+
aliases: Readonly<Record<string, EntityAlias>>;
|
|
259
|
+
/**
|
|
260
|
+
* TOKEN-FIRST (the `/react` layer): an alias nobody declared is read as a type token —
|
|
261
|
+
* `list("party")` is `{kind:"entity", token:"party"}`. `sources()` still lists only the declared
|
|
262
|
+
* aliases. Off by default: an Applet's port answers only what its record declares.
|
|
263
|
+
*/
|
|
264
|
+
tokensAreAliases?: boolean;
|
|
265
|
+
/**
|
|
266
|
+
* The active organization (CONTRACTS §4: `viewer().activeOrganizationId`), read at the moment it is
|
|
267
|
+
* needed: where `create` saves, and the first live topic joined. The host's own answer, never guessed;
|
|
268
|
+
* null/undefined means none is chosen and `create` is refused `organization_required`.
|
|
269
|
+
*/
|
|
270
|
+
activeOrganizationId?: () => Uuid | null | undefined;
|
|
271
|
+
/** A fixed active organization, for a host whose port lives no longer than its choice. `activeOrganizationId` wins. */
|
|
272
|
+
organization?: Uuid | null;
|
|
273
|
+
/** The host's live-notice layer (`createEntityRealtime`). Left out, lists are as fresh as their last read. */
|
|
274
|
+
realtime?: EntityRealtime;
|
|
275
|
+
}
|
|
276
|
+
/** A value as rows carry it → as the write doors take it: a link (`EntityRef[]` or one ref) becomes its id. */
|
|
277
|
+
declare function toWireValue(value: unknown): unknown;
|
|
278
|
+
/** `Values` → the doors' `{column: value, _custom: {key: value}}`: links back to ids at both levels. */
|
|
279
|
+
declare function toWireValues(values: Values): Record<string, unknown>;
|
|
280
|
+
/** A type as the person may use it: its name and whether she may add or change rows (`entity_columns`' own answer). */
|
|
281
|
+
interface EntityTypeFacts {
|
|
282
|
+
token: string;
|
|
283
|
+
label: string;
|
|
284
|
+
canCreate: boolean;
|
|
285
|
+
canUpdate: boolean;
|
|
286
|
+
}
|
|
287
|
+
/** The host's entity port: the DataPort, plus `describe` for a token-first screen that has no `sources()` entry. */
|
|
288
|
+
interface EntityDataPort extends HostDataPort {
|
|
289
|
+
/** The type behind an alias, from the same one `entity_columns` read `columns()` uses. */
|
|
290
|
+
describe(alias: string): Promise<RecordsResult<EntityTypeFacts>>;
|
|
291
|
+
}
|
|
292
|
+
declare function createEntityDataPort(options: CreateEntityDataPortOptions): EntityDataPort;
|
|
293
|
+
/**
|
|
294
|
+
* THE PORT A SERVER ASKS THROUGH, AND THE PAGE READS THROUGH WHILE IT HYDRATES (lane SEED-ENTITY).
|
|
295
|
+
* One construction for both, so the doors' arguments are the same on either side: a token is its own
|
|
296
|
+
* alias, nothing is bound to an organization, and nothing is live. `dataSource` is the person's own
|
|
297
|
+
* (server), a recording one, or one that answers from a page seed.
|
|
298
|
+
*/
|
|
299
|
+
declare function createSeedPort(dataSource: unknown): EntityDataPort;
|
|
300
|
+
|
|
301
|
+
export { createEntityDataPort as A, createEntityRealtime as B, type CreateEntityDataPortOptions as C, DEFAULT_BATCH_MS as D, type EntityDataPort as E, createSeedPort as F, entityNoticeKey as G, entityOrgChannel as H, entityOrgChannelSpec as I, entityOrgTopic as J, orderOrganizationTopics as K, readEntityRealtimeKnobs as L, toWireValue as M, toWireValues as N, OP_ID_HEADER as O, type EntityWireQuery as a, type EntityColumnWire as b, type EntityWireRow as c, type CreateEntityClientOptions as d, type CreateEntityRealtimeOptions as e, DEFAULT_MAX_ORG_TOPICS as f, DEFAULT_MAX_WAIT_MS as g, ENTITY_DOOR_SCHEMA as h, ENTITY_NOTICE_EVENT as i, type EntityAlias as j, type EntityClient as k, type EntityColumnsAnswer as l, type EntityGetAnswer as m, type EntityListAnswer as n, type EntityListRequest as o, type EntityNotice as p, type EntityNoticeSink as q, type EntityRealtime as r, type EntitySortApplied as s, type EntityTypeFacts as t, type EntityWirePredicate as u, type EntityWireRef as v, type EntityWireSort as w, type EntityWriteAnswer as x, type EntityWriteOptions as y, createEntityClient as z };
|