@lotics/app-sdk 0.124.12 → 0.125.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/dist/{chunk-BNJZBF6D.js → chunk-2KJSE73G.js} +19 -4
- package/dist/index.js +3 -10
- package/dist/router.js +1 -1
- package/dist/shared_types.d.ts +26 -10
- package/docs/runtime.md +1 -1
- package/package.json +1 -1
|
@@ -250,6 +250,9 @@ function isFieldKey(value) {
|
|
|
250
250
|
return value.startsWith(FIELD_KEY_PREFIX);
|
|
251
251
|
}
|
|
252
252
|
|
|
253
|
+
// ../shared/src/schemas/read_row.ts
|
|
254
|
+
var RECORD_ID_COLUMN = "__source_record_id";
|
|
255
|
+
|
|
253
256
|
// ../shared/src/compare_bounds.ts
|
|
254
257
|
var COMPARE_KEYS = ["gt", "gte", "lt", "lte"];
|
|
255
258
|
function isRecordBound(bound) {
|
|
@@ -258,10 +261,19 @@ function isRecordBound(bound) {
|
|
|
258
261
|
function boundsOf(compared) {
|
|
259
262
|
return COMPARE_KEYS.flatMap((key) => {
|
|
260
263
|
const bound = compared[key];
|
|
261
|
-
return bound === void 0 ? [] : [{ key, bound }];
|
|
264
|
+
return bound === void 0 || bound === null ? [] : [{ key, bound }];
|
|
262
265
|
});
|
|
263
266
|
}
|
|
264
267
|
|
|
268
|
+
// ../shared/src/utils.ts
|
|
269
|
+
function sample(arr) {
|
|
270
|
+
if (arr.length === 0) return void 0;
|
|
271
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
272
|
+
}
|
|
273
|
+
function assertNever(value) {
|
|
274
|
+
throw new Error(`Unhandled union member: ${JSON.stringify(value)}`);
|
|
275
|
+
}
|
|
276
|
+
|
|
265
277
|
// ../shared/src/schemas/app_spec_rules.ts
|
|
266
278
|
var bandKey = (band) => `${band.min ?? ""}..${band.max ?? ""}`;
|
|
267
279
|
function bandOf(tiers, figure) {
|
|
@@ -271,6 +283,10 @@ function bandOf(tiers, figure) {
|
|
|
271
283
|
}
|
|
272
284
|
var AGENT_SCAN_READS = ["text", "iso6346"];
|
|
273
285
|
var SCAN_READS = [...AGENT_SCAN_READS, "code"];
|
|
286
|
+
var REGISTER_PERIODS = ["today", "week", "month", "quarter", "year"];
|
|
287
|
+
var PERIOD_SPANS = { today: "day", week: "week", month: "month", quarter: "quarter", year: "year" };
|
|
288
|
+
var isViewSize = (span) => span === "day" || span === "week" || span === "month";
|
|
289
|
+
var TIME_LAYOUT_PERIODS = REGISTER_PERIODS.filter((period) => isViewSize(PERIOD_SPANS[period]));
|
|
274
290
|
|
|
275
291
|
// ../../node_modules/big.js/big.mjs
|
|
276
292
|
var DP = 20;
|
|
@@ -919,9 +935,6 @@ function coefficientOf(decimal) {
|
|
|
919
935
|
return { digits, exponent: Number(exponent) };
|
|
920
936
|
}
|
|
921
937
|
|
|
922
|
-
// ../shared/src/schemas/read_row.ts
|
|
923
|
-
var RECORD_ID_COLUMN = "__source_record_id";
|
|
924
|
-
|
|
925
938
|
// ../shared/src/schemas/app_query_aggregate.ts
|
|
926
939
|
var APP_QUERY_BATCH_MAX = 16;
|
|
927
940
|
var AGGREGATE_COUNT_COLUMN = "__count";
|
|
@@ -2029,6 +2042,8 @@ export {
|
|
|
2029
2042
|
COMPARE_KEYS,
|
|
2030
2043
|
isRecordBound,
|
|
2031
2044
|
boundsOf,
|
|
2045
|
+
sample,
|
|
2046
|
+
assertNever,
|
|
2032
2047
|
bandKey,
|
|
2033
2048
|
bandOf,
|
|
2034
2049
|
addDecimal,
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
aggregateRows,
|
|
9
9
|
anyRecordingLive,
|
|
10
10
|
applyPatch,
|
|
11
|
+
assertNever,
|
|
11
12
|
bandKey,
|
|
12
13
|
bandOf,
|
|
13
14
|
boundsOf,
|
|
@@ -41,6 +42,7 @@ import {
|
|
|
41
42
|
rpc,
|
|
42
43
|
rpcAgentRun,
|
|
43
44
|
rpcAgentRunContinue,
|
|
45
|
+
sample,
|
|
44
46
|
searchWords,
|
|
45
47
|
setUrlParams,
|
|
46
48
|
subscribeQueriesChanged,
|
|
@@ -49,7 +51,7 @@ import {
|
|
|
49
51
|
subtractDecimal,
|
|
50
52
|
sumDecimal,
|
|
51
53
|
urlParam
|
|
52
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-2KJSE73G.js";
|
|
53
55
|
|
|
54
56
|
// src/mount.tsx
|
|
55
57
|
import { createRoot } from "react-dom/client";
|
|
@@ -1841,15 +1843,6 @@ var EvalAstFactory = class {
|
|
|
1841
1843
|
}
|
|
1842
1844
|
};
|
|
1843
1845
|
|
|
1844
|
-
// ../shared/src/utils.ts
|
|
1845
|
-
function sample(arr) {
|
|
1846
|
-
if (arr.length === 0) return void 0;
|
|
1847
|
-
return arr[Math.floor(Math.random() * arr.length)];
|
|
1848
|
-
}
|
|
1849
|
-
function assertNever(value) {
|
|
1850
|
-
throw new Error(`Unhandled union member: ${JSON.stringify(value)}`);
|
|
1851
|
-
}
|
|
1852
|
-
|
|
1853
1846
|
// ../shared/src/expression_array.ts
|
|
1854
1847
|
var expression_array_exports = {};
|
|
1855
1848
|
__export(expression_array_exports, {
|
package/dist/router.js
CHANGED
package/dist/shared_types.d.ts
CHANGED
|
@@ -26,16 +26,22 @@ export interface AppFile {
|
|
|
26
26
|
export type AppLoadTiming = { boot_ms?: number | undefined; page_bytes?: number | undefined; page_connect_ms?: number | undefined; page_decoded_bytes?: number | undefined; page_download_ms?: number | undefined; page_ttfb_ms?: number | undefined; };
|
|
27
27
|
/** What a body read needs of a table: its id, its name for a refusal, and its fields. */
|
|
28
28
|
export type BodyTable = { id: string; name: string; fields: (TableField)[]; title_field_key: string | null; };
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
export type
|
|
29
|
+
/**
|
|
30
|
+
* One bound: a number, an ISO date (`2026-03-01`, `2026-03-01T09:30`), `{ "now": true }` — the day or the moment of
|
|
31
|
+
* reading — or, where a place takes it (`R`, by default), `{ "record": "<alias>" }`. A place that takes no record bound
|
|
32
|
+
* states `Bound<never>`.
|
|
33
|
+
*/
|
|
34
|
+
export type Bound<R = { record: string; }> = string | number | R | { now: true; };
|
|
35
|
+
/** The cards as the spec's register states them: they state no facts. */
|
|
36
|
+
export interface CardsSpec {
|
|
37
|
+
kind: "cards";
|
|
38
|
+
}
|
|
39
|
+
/** One node of the page as the model and the spec state it. */
|
|
40
|
+
export type ComposeNode = { use: "Column"; children: ComposeOf<StatedComposeRows>[]; } | { use: "Bar"; children: ComposeOf<StatedComposeRows>[]; } | { use: "Group"; title: string; children: ComposeOf<StatedComposeRows>[]; } | { use: "Panel"; title: string; children: ComposeOf<StatedComposeRows>[]; } | { use: "Title"; } | { use: "Status"; } | { use: "Field"; field: string; } | { use: "Document"; field: string; } | { use: "Act"; act: string; } | { use: "Copy"; field: string; as: "plain" | "raw"; } | StatedComposeRows;
|
|
35
41
|
/** One node of a page over what its `Rows` pieces are: the piece it mounts (`use`), that piece's props, and what it holds. */
|
|
36
|
-
export type ComposeOf<Rows extends { use: "Rows"; child: string;
|
|
37
|
-
/**
|
|
38
|
-
export type
|
|
42
|
+
export type ComposeOf<Rows extends { use: "Rows"; child: string; }> = Rows | { use: "Column"; children: ComposeOf<Rows>[]; } | { use: "Bar"; children: ComposeOf<Rows>[]; } | { use: "Group"; title: string; children: ComposeOf<Rows>[]; } | { use: "Panel"; title: string; children: ComposeOf<Rows>[]; } | { use: "Title"; } | { use: "Status"; } | { use: "Field"; field: string; } | { use: "Document"; field: string; } | { use: "Act"; act: string; } | { use: "Copy"; field: string; as: "plain" | "raw"; };
|
|
43
|
+
/** What every `Rows` piece names: the child whose rows it lists. */
|
|
44
|
+
export type ComposeRowsPiece = { use: "Rows"; child: string; };
|
|
39
45
|
export interface ExportCall {
|
|
40
46
|
params?: { [x: string]: unknown; };
|
|
41
47
|
filter?: QueryFilterGroup<string> | QueryFilterCondition<string>;
|
|
@@ -272,7 +278,13 @@ export interface ResolvedOption {
|
|
|
272
278
|
/** A brand or icon mark, from `useFieldOptions` only. */
|
|
273
279
|
mark?: { kind: "brand"; name: string; } | { kind: "icon"; name: string; };
|
|
274
280
|
}
|
|
275
|
-
export type SpecFile = { version: 29; app: { alias: string; label: string; description?: string | undefined; locale: ReportLanguage; }; entities: Record<string, { alias: string; label: string; singular?: string | undefined; table: string; fields: Record<string, { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result?: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | undefined; label: string; description?: string | undefined; format?: "datetime" | "link" | "markdown" | "text" | undefined; multi?: true | undefined; required?: true | undefined; readonly?: true | undefined; notation?: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | undefined; limit?: { field: string; } | { value: number; } | undefined; gate?: { field: string; } | { value: number; } | undefined; tolerance?: number | undefined; due?: true | undefined; frees?: true | undefined; summed?: true | undefined; accumulates?: true | undefined; whole?: true | undefined; restates?: string | undefined; starts?: "me" | "today" | undefined; default?: string | number | boolean | string[] | undefined; options?: { alias: string; label: string; color?: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | undefined; mark?: { kind: string; name: string; } | undefined; id: string; }[] | undefined; link?: string | undefined; accept?: string | undefined; image?: string | undefined; party?: "organization" | "person" | undefined; pictures?: { query: string; param: string; } | undefined; face?: Record<string, string> | undefined; default_from?: { link: string; field: string; } | undefined; reads?: string[] | undefined; through?: { link: string; field: string; } | undefined; pick?: { query: string; param?: string | undefined; same?: { field: string; param: string; }[] | undefined; } | undefined; picks_only?: true | undefined; suggest?: { query: string; param: string; column: string; } | undefined; applies?: ({ field: string; options: string[]; } | { field: string; value: boolean; })[] | undefined; }>; title: string; subtitle?: string[] | undefined; image?: string | undefined; mark?: string | undefined; description?: string | undefined; party?: "organization" | "person" | undefined; mine?: string | undefined; status?: { field: string; closed?: string[] | undefined; history?: string | undefined; dates?: Record<string, string> | undefined; stages?: Record<string, { owner: { kind: "member"; column: string; label: string; } | { kind: "group"; group: string; label: string; }; within?: number | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; }> | undefined; maker?: string | undefined; moves?: { query: string; param: string; link: string; status: string; at: string; by?: string | undefined; went: Record<string, string>; } | undefined; } | undefined; settled?: string | undefined; task?: { close?: { to: string; act?: string | undefined; } | undefined; reopen?: { to: string; act?: string | undefined; } | undefined; member?: string | undefined; } | undefined; progress?: { entity: string; via: string; passed?: string | undefined; read: { query: string; param: string; }; }[] | undefined; figure?: string | undefined; scan?: { read: "iso6346" | "text"; agent: string; } | { read: "code"; } | undefined; place?: { address: string; latitude: string; longitude: string; accuracy?: string | undefined; } | undefined; on_site?: { photos: string[]; place?: string | undefined; latitude: string; longitude: string; radius: number; } | undefined; pin?: { on: string; x: string; y: string; } | undefined; size?: { across: string; along: string; up: string; } | undefined; list: { query: string; param?: string | undefined; }; listed?: string[] | undefined; one?: { query: string; param?: string | undefined; } | undefined; create?: { workflow: string; fields: string[]; picker?: string[] | undefined; } | undefined; update?: { workflow: string; fields?: string[] | undefined; } | undefined; remove?: { workflow: string; with?: string[] | undefined; } | undefined; }>; lists: { key?: string | undefined; label?: string | undefined; entity: string; scope?: { field: string; entity: string; param: string; counts: { query: string; param?: string | undefined; }; } | undefined; register: { columns: string[]; filters: (string | { field: string; tiers: number[]; })[]; book?: true | undefined; search?: string[] | undefined; sort?: { field: string; desc?: true | undefined; }[] | undefined; group?: string | undefined; tabs?: { tab: string; label: string; term?: { kind: "in"; field: string; } | { kind: "open"; from: string; to: string; } | undefined; totals?: { via: string; read: { query: string; }; columns: { alias: string; label: string; notation?: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | undefined; }[]; } | undefined; where?: ({ field: string; options: string[]; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; sort?: { field: string; desc?: true | undefined; }[] | undefined; }[] | undefined; period?: "month" | "quarter" | "today" | "week" | "year" | { days: number; } | undefined; layout: "calendar" | "cards" | "gantt" | "lanes" | "plan" | "roster" | "table"; roster?: { entity: string; via: string; day?: string | undefined; end?: string | undefined; expect?: string | undefined; of?: string | undefined; cadence?: { on: ("fri" | "mon" | "sat" | "sun" | "thu" | "tue" | "wed")[]; from?: string | undefined; until?: string | undefined; } | undefined; read: { query: string; param: string; }; create?: string[] | undefined; } | undefined; lanes?: { field: string; start: string; end?: string | undefined; loads?: { value: string; against: string; }[] | undefined; read?: { query: string; param: string; } | undefined; } | undefined; gantt?: { start: string; end: string; milestones?: string[] | undefined; planned?: { start?: string | undefined; end?: string | undefined; } | undefined; progress?: string | undefined; after?: string | undefined; } | undefined; plan?: { at: string; across: string; up: string; fill?: string | undefined; mark?: { field: string; option: string; } | undefined; size?: { field: string; options: Record<string, { across: number; along: number; up: number; }>; } | undefined; place: { entity: string; kind: string; kinds: { bay: string; area: string; landmark: string; }; sheet?: string | undefined; scale?: string | undefined; x: string; y: string; width?: string | undefined; depth?: string | undefined; across: string; up: string; reach_from?: string | undefined; stacked?: string | undefined; reaches?: { first: string; last: string; both: string; } | undefined; size?: { across: string; along: string; up: string; } | undefined; }; load?: { query: string; param?: string | undefined; } | undefined; } | undefined; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; opens?: ({ field: string; options: string[]; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; remove?: false | undefined; create?: string[] | undefined; add_label?: string | undefined; heading?: string | undefined; export?: { label?: string | undefined; description?: string | undefined; query: string; template?: string | undefined; filename?: string | undefined; where?: ({ field: string; options: string[]; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; per?: string | undefined; per_row?: string[] | undefined; books?: string[] | undefined; key: string; }[] | undefined; readings?: ({ entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "metric"; value?: string | undefined; average?: true | undefined; over?: string | undefined; target?: number | undefined; better?: "down" | "up" | undefined; bound?: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; } | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "breakdown"; by: string | { field: string; tiers: number[]; }; value?: string | undefined; over?: string | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "trend"; over: string; value?: string | undefined; ahead?: true | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "pivot"; rows: string | { field: string; tiers: number[]; }; columns: string | { field: string; tiers: number[]; }; value?: string | undefined; over?: string | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "shortfall"; by: string; across?: string | undefined; value?: string | undefined; on_hand: { entity: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; by: string; across?: string | undefined; value?: string | undefined; }; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "progress"; planned: { start: string; end: string; }; done: string; finished?: string | undefined; weight?: string | undefined; measured?: { via: string; read: { query: string; param: string; }; } | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "list"; columns: string[]; app?: { id: string; } | undefined; })[] | undefined; attention?: false | undefined; }; books?: { entity: string; fields?: Record<string, string> | undefined; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; create?: string[] | undefined; }[] | undefined; owns?: { queries: string[]; workflows: string[]; } | undefined; }[]; pages: Record<string, { door?: "beside" | "drawer" | "page" | undefined; sections: { title?: string | undefined; description?: string | undefined; at?: string[] | undefined; fields: string[]; reads?: string[] | undefined; blocks: ({ kind: "timeline"; entity: string; via: string; read: { query: string; param?: string | undefined; }; title: string; at: string; by?: string | undefined; create?: string[] | undefined; add_label?: string | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "list"; reading: { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "list"; columns: string[]; app?: { id: string; } | undefined; }; via: string; same?: { field: string; param: string; } | undefined; bounds?: { field: string; param: string; of: "date" | "number"; lookup?: true | undefined; }[] | undefined; open?: "in_place" | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "rows"; entity: string; via: string; read: { query: string; param?: string | undefined; }; title: string; columns: string[]; create?: string[] | undefined; add_label?: string | undefined; totals?: Record<string, string> | undefined; narrower?: string[] | undefined; soonest?: string[] | undefined; expect?: string | undefined; of?: string | undefined; where?: { field: string; options: string[]; }[] | undefined; filters?: (string | { field: string; tiers: number[]; })[] | undefined; search?: string[] | undefined; group?: string | undefined; sort?: { field: string; desc?: true | undefined; }[] | undefined; edits?: string[] | undefined; remove?: false | undefined; pick?: { read: { query: string; param?: string | undefined; }; back: string; same?: { field: string; param: string; }[] | undefined; admits?: { query: string; param?: string | undefined; } | undefined; } | undefined; checklist?: { photo?: string | undefined; clause?: string | undefined; words?: string[] | undefined; failed?: string[] | undefined; passed?: string | undefined; } | undefined; compare?: { before: string; after: string; } | undefined; current?: string | undefined; post?: { bodies?: string[] | undefined; text: string; compute?: { expression: string; reads: Record<string, { from: "row"; field: string; } | { from: "record"; field: string; } | { from: "place"; field: string; } | { from: "formula"; expression: string; }>; } | undefined; media: string; link?: string | undefined; network: string; group?: string | undefined; networks: Record<string, "facebook" | "instagram" | "linkedin" | "threads" | "x">; } | undefined; under?: { field: string; entity: string; via: string; back: string; read: { query: string; param?: string | undefined; }; where?: { field: string; options: string[]; }[] | undefined; } | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "agenda"; entity: string; via: string; read: { query: string; param?: string | undefined; }; title: string; columns: string[]; day: string; time?: string | undefined; part?: string | undefined; start?: string | undefined; create?: string[] | undefined; add_label?: string | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "files"; fields: string[]; title: string; add_label?: string | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "text"; field: string; title: string; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "figures"; fields: string[]; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "statement"; title: string; lines: { field: string; op?: "equals" | "minus" | "plus" | "times" | undefined; rate?: string | undefined; parts?: { entity: string; read: { query: string; param: string; }; same: string; before?: { field: string; param: string; } | undefined; columns: string[]; figure: string; } | undefined; }[]; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "reading"; reading: { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "metric"; value?: string | undefined; average?: true | undefined; over?: string | undefined; target?: number | undefined; better?: "down" | "up" | undefined; bound?: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; } | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "breakdown"; by: string | { field: string; tiers: number[]; }; value?: string | undefined; over?: string | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "trend"; over: string; value?: string | undefined; ahead?: true | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "pivot"; rows: string | { field: string; tiers: number[]; }; columns: string | { field: string; tiers: number[]; }; value?: string | undefined; over?: string | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "shortfall"; by: string; across?: string | undefined; value?: string | undefined; on_hand: { entity: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; by: string; across?: string | undefined; value?: string | undefined; }; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "progress"; planned: { start: string; end: string; }; done: string; finished?: string | undefined; weight?: string | undefined; measured?: { via: string; read: { query: string; param: string; }; } | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "list"; columns: string[]; app?: { id: string; } | undefined; }; via: string; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | { kind: "funnel"; entity: string; read: { query: string; param?: string | undefined; }; label: string; steps: string[]; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; })[]; acts: string[]; entry?: string[] | undefined; acts_last?: true | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; page?: string | undefined; side?: true | undefined; }[]; outside?: { key: string; entity: string; title: string; description?: string | undefined; at: string[]; fields: string[]; one: { query: string; param: string; }; blocks: { kind: "list"; reading: { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "list"; columns: string[]; app?: { id: string; } | undefined; }; via: string; same?: { field: string; param: string; } | undefined; bounds?: { field: string; param: string; of: "date" | "number"; lookup?: true | undefined; }[] | undefined; open?: "in_place" | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; }[]; acts: string[]; }[] | undefined; comments?: true | undefined; moves?: { kind: "timeline"; entity: string; via: string; read: { query: string; param?: string | undefined; }; title: string; at: string; by?: string | undefined; create?: string[] | undefined; add_label?: string | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; } | undefined; compose?: { use: "Title"; } | { use: "Status"; } | { use: "Field"; field: string; } | { use: "Document"; field: string; } | { use: "Act"; act: string; } | ComposeRows | { use: "Copy"; field: string; as: "plain" | "raw"; } | { use: "Column"; children: ComposeNode[]; } | { use: "Bar"; children: ComposeNode[]; } | { use: "Group"; title: string; children: ComposeNode[]; } | { use: "Panel"; title: string; children: ComposeNode[]; } | undefined; }>; acts: { alias: string; label: string; on: "record" | "rows" | "view"; of: string; workflow?: string | undefined; open?: { app: string; } | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; to?: string | undefined; writes?: true | undefined; into?: string | undefined; paper?: { entity: string; option: string; } | undefined; marks?: Record<string, boolean> | undefined; requires?: string[] | undefined; recommends?: string[] | undefined; asks?: (string | { input: string; label: string; type: "date" | "file" | "link" | "long_text" | "member" | "number" | "select" | "text"; options?: { alias: string; label: string; color?: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | undefined; mark?: { kind: string; name: string; } | undefined; }[] | undefined; entity?: string | undefined; required?: true | undefined; default?: string | undefined; accept?: string | undefined; })[] | undefined; starts?: Record<string, "me" | "today"> | undefined; makes?: string | undefined; papers?: { template: string; label: string; when?: ({ field: string; options: string[]; } | { field: string; value: boolean; })[] | undefined; }[] | undefined; archive?: string | undefined; intake?: { agent: string; papers: { entity: string; kind: string; files: string; }; fields: string[]; parties?: { link: string; fields: string[]; }[] | undefined; rows?: { entity: string; fields: string[]; key?: string[] | undefined; }[] | undefined; } | undefined; recording?: { into: string; via: string; audio: string; transcript: string; video?: string | undefined; agent?: string | undefined; } | undefined; sign?: { into: string; by: string; at: string; witness?: string | undefined; } | undefined; review?: true | undefined; confirm?: string | true | undefined; danger?: true | undefined; }[]; checks: { field: string; of: string; blocks?: "all" | string[] | undefined; resolve?: string | undefined; reads?: string[] | undefined; }[]; } | { version: 29; app: { alias: string; label: string; description?: string | undefined; locale: ReportLanguage; }; dashboard: ({ entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "metric"; value?: string | undefined; average?: true | undefined; over?: string | undefined; target?: number | undefined; better?: "down" | "up" | undefined; bound?: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; } | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "breakdown"; by: string | { field: string; tiers: number[]; }; value?: string | undefined; over?: string | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "trend"; over: string; value?: string | undefined; ahead?: true | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "pivot"; rows: string | { field: string; tiers: number[]; }; columns: string | { field: string; tiers: number[]; }; value?: string | undefined; over?: string | undefined; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "shortfall"; by: string; across?: string | undefined; value?: string | undefined; on_hand: { entity: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; by: string; across?: string | undefined; value?: string | undefined; }; } | { entity: string; label: string; read: { query: string; param?: string | undefined; aggregate?: { by?: string[] | undefined; bands?: Record<string, number[]> | undefined; day?: string | undefined; sum?: string | undefined; } | undefined; }; where?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[] | undefined; tab?: string | undefined; kind: "list"; columns: string[]; app?: { id: string; } | undefined; })[]; tabs?: { tab: string; label: string; }[] | undefined; period?: "month" | "quarter" | "year" | { days: 30; } | undefined; entities: Record<string, { alias: string; label: string; singular?: string | undefined; table: string; fields: Record<string, { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result?: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | undefined; label: string; description?: string | undefined; format?: "datetime" | "link" | "markdown" | "text" | undefined; multi?: true | undefined; required?: true | undefined; readonly?: true | undefined; notation?: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | undefined; limit?: { field: string; } | { value: number; } | undefined; gate?: { field: string; } | { value: number; } | undefined; tolerance?: number | undefined; due?: true | undefined; frees?: true | undefined; summed?: true | undefined; accumulates?: true | undefined; whole?: true | undefined; restates?: string | undefined; starts?: "me" | "today" | undefined; default?: string | number | boolean | string[] | undefined; options?: { alias: string; label: string; color?: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | undefined; mark?: { kind: string; name: string; } | undefined; id: string; }[] | undefined; link?: string | undefined; accept?: string | undefined; image?: string | undefined; party?: "organization" | "person" | undefined; pictures?: { query: string; param: string; } | undefined; face?: Record<string, string> | undefined; default_from?: { link: string; field: string; } | undefined; reads?: string[] | undefined; through?: { link: string; field: string; } | undefined; pick?: { query: string; param?: string | undefined; same?: { field: string; param: string; }[] | undefined; } | undefined; picks_only?: true | undefined; suggest?: { query: string; param: string; column: string; } | undefined; applies?: ({ field: string; options: string[]; } | { field: string; value: boolean; })[] | undefined; }>; title: string; subtitle?: string[] | undefined; image?: string | undefined; mark?: string | undefined; description?: string | undefined; party?: "organization" | "person" | undefined; mine?: string | undefined; status?: { field: string; closed?: string[] | undefined; history?: string | undefined; dates?: Record<string, string> | undefined; stages?: Record<string, { owner: { kind: "member"; column: string; label: string; } | { kind: "group"; group: string; label: string; }; within?: number | undefined; when?: ({ field: string; options: string[]; } | { field: string; compare: Compared; of: "date" | "datetime" | "number"; zone?: string | undefined; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[] | undefined; }> | undefined; maker?: string | undefined; moves?: { query: string; param: string; link: string; status: string; at: string; by?: string | undefined; went: Record<string, string>; } | undefined; } | undefined; settled?: string | undefined; task?: { close?: { to: string; act?: string | undefined; } | undefined; reopen?: { to: string; act?: string | undefined; } | undefined; member?: string | undefined; } | undefined; progress?: { entity: string; via: string; passed?: string | undefined; read: { query: string; param: string; }; }[] | undefined; figure?: string | undefined; scan?: { read: "iso6346" | "text"; agent: string; } | { read: "code"; } | undefined; place?: { address: string; latitude: string; longitude: string; accuracy?: string | undefined; } | undefined; on_site?: { photos: string[]; place?: string | undefined; latitude: string; longitude: string; radius: number; } | undefined; pin?: { on: string; x: string; y: string; } | undefined; size?: { across: string; along: string; up: string; } | undefined; list: { query: string; param?: string | undefined; }; listed?: string[] | undefined; one?: { query: string; param?: string | undefined; } | undefined; create?: { workflow: string; fields: string[]; picker?: string[] | undefined; } | undefined; update?: { workflow: string; fields?: string[] | undefined; } | undefined; remove?: { workflow: string; with?: string[] | undefined; } | undefined; }>; };
|
|
281
|
+
export type SpecFile = { version: 30; app: { alias: string; label: string; description: string | null; locale: ReportLanguage; }; entities: Record<string, { alias: string; label: string; singular: string | null; table: string; fields: Record<string, { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | null; label: string; description: string | null; format: "datetime" | "link" | "markdown" | "text" | null; multi: boolean; required: boolean; readonly: boolean; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; limit: { field: string; } | { value: number; } | null; gate: { field: string; } | { value: number; } | null; tolerance: number | null; due: boolean; frees: boolean; summed: boolean; accumulates: boolean; whole: boolean; restates: string | null; starts: "me" | "today" | null; default: string | number | boolean | string[] | null; options: { id: string; alias: string; label: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | null; mark: { kind: string; name: string; } | null; }[] | null; link: string | null; accept: string | null; image: string | null; party: "organization" | "person" | null; pictures: { query: string; param: string; } | null; face: Record<string, string>; default_from: { link: string; field: string; } | null; reads: string[]; through: { link: string; field: string; } | null; pick: { query: string; param: string; same: { field: string; param: string; }[]; } | null; picks_only: boolean; suggest: { query: string; param: string; column: string; } | null; applies: ({ field: string; options: string[]; } | { field: string; value: boolean; })[]; }>; title: string; subtitle: string[]; image: string | null; mark: string | null; description: string | null; party: "organization" | "person" | null; mine: string | null; status: { field: string; closed: string[]; history: string | null; dates: Record<string, string>; stages: { option: string; label: string; owner: { kind: "member"; column: string; label: string; } | { kind: "group"; group: string; label: string; }; within: number | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; }[]; maker: string | null; moves: { query: string; param: string; link: string; status: string; at: string; by: string | null; went: Record<string, string>; } | null; } | null; settled: string | null; task: { close: { to: string; act: string | null; } | null; reopen: { to: string; act: string | null; } | null; member: string | null; } | null; progress: { entity: string; via: string; passed: string | null; read: { query: string; param: string; }; }[]; figure: string | null; scan: { read: "iso6346" | "text"; agent: string; } | { read: "code"; } | null; place: { address: string; latitude: string; longitude: string; accuracy: string | null; } | null; on_site: { photos: string[]; place: string | null; latitude: string; longitude: string; radius: number; } | null; pin: { on: string; x: string; y: string; } | null; size: { across: string; along: string; up: string; } | null; nests: { parent: string; children: string; closed: string | null; } | null; filed: Record<string, string>; list: { query: string; param: string | null; }; listed: string[] | null; one: { query: string; param: string; }; create: { workflow: string; fields: string[]; picker: string[] | null; } | null; update: { workflow: string; fields: string[]; } | null; remove: { workflow: string; with: string[]; } | null; }>; lists: { key: string | null; label: string | null; entity: string; scope: { field: string; entity: string; param: string; counts: { query: string; param: string | null; }; } | null; register: { columns: string[]; filters: (string | { field: string; tiers: number[]; })[]; book: boolean; search: string[] | null; sort: { field: string; desc: boolean; }[] | null; group: string | null; tabs: { tab: string; label: string; term: { kind: "in"; field: string; } | { kind: "open"; from: string; to: string; } | null; totals: { via: string; read: { query: string; }; columns: { alias: string; label: string; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; }[]; } | null; where: ({ field: string; options: string[]; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; sort: { field: string; desc: boolean; }[] | null; }[] | null; opens_on: { days: number; } | { span: "day" | "month" | "quarter" | "week" | "year"; view: "day" | "month" | "week" | null; }; layout: SpecLayout; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; opens: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; remove: boolean; create: string[] | null; add_label: string | null; heading: string | null; export: { label: string | null; description: string | null; query: string; template: string | null; filename: string | null; where: ({ field: string; options: string[]; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; per: string | null; per_row: string[]; books: string[] | null; held: Record<string, string[]> | null; per_field: { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | null; label: string; description: string | null; format: "datetime" | "link" | "markdown" | "text" | null; multi: boolean; required: boolean; readonly: boolean; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; limit: { field: string; } | { value: number; } | null; gate: { field: string; } | { value: number; } | null; tolerance: number | null; due: boolean; frees: boolean; summed: boolean; accumulates: boolean; whole: boolean; restates: string | null; starts: "me" | "today" | null; default: string | number | boolean | string[] | null; options: { id: string; alias: string; label: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | null; mark: { kind: string; name: string; } | null; }[] | null; link: string | null; accept: string | null; image: string | null; party: "organization" | "person" | null; pictures: { query: string; param: string; } | null; face: Record<string, string>; default_from: { link: string; field: string; } | null; reads: string[]; through: { link: string; field: string; } | null; pick: { query: string; param: string; same: { field: string; param: string; }[]; } | null; picks_only: boolean; suggest: { query: string; param: string; column: string; } | null; applies: ({ field: string; options: string[]; } | { field: string; value: boolean; })[]; } | null; key: string; }[]; readings: ({ entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "breakdown"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "list"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number | RecordBound>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | RecordBound | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; columns: string[]; open: { kind: "app"; app: { id: string; }; } | { kind: "drawer"; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "progress"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; planned: { start: string; end: string; }; done: string; finished: string | null; weight: string | null; measured: { via: string; read: { query: string; param: string; }; } | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "metric"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; value: string | null; average: boolean; over: string | null; target: number | null; better: "down" | "up" | null; bound: { value: number; } | { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; } | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "pivot"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; rows: string | { field: string; tiers: number[]; }; columns: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "shortfall"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string; across: string | null; value: string | null; on_hand: { entity: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; by: string | null; across: string | null; value: string | null; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "trend"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; over: string; value: string | null; ahead: boolean; })[]; attention: boolean; }; entities: string[]; books: { entity: string; fields: Record<string, string>; scope: string | null; register: { columns: string[]; filters: (string | { field: string; tiers: number[]; })[]; book: boolean; search: string[] | null; sort: { field: string; desc: boolean; }[] | null; group: string | null; tabs: { tab: string; label: string; term: { kind: "in"; field: string; } | { kind: "open"; from: string; to: string; } | null; totals: { via: string; read: { query: string; }; columns: { alias: string; label: string; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; }[]; } | null; where: ({ field: string; options: string[]; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; sort: { field: string; desc: boolean; }[] | null; }[] | null; opens_on: { days: number; } | { span: "day" | "month" | "quarter" | "week" | "year"; view: "day" | "month" | "week" | null; }; layout: SpecLayout; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; opens: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; remove: boolean; create: string[] | null; add_label: string | null; heading: string | null; export: { label: string | null; description: string | null; query: string; template: string | null; filename: string | null; where: ({ field: string; options: string[]; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; per: string | null; per_row: string[]; books: string[] | null; held: Record<string, string[]> | null; per_field: { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | null; label: string; description: string | null; format: "datetime" | "link" | "markdown" | "text" | null; multi: boolean; required: boolean; readonly: boolean; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; limit: { field: string; } | { value: number; } | null; gate: { field: string; } | { value: number; } | null; tolerance: number | null; due: boolean; frees: boolean; summed: boolean; accumulates: boolean; whole: boolean; restates: string | null; starts: "me" | "today" | null; default: string | number | boolean | string[] | null; options: { id: string; alias: string; label: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | null; mark: { kind: string; name: string; } | null; }[] | null; link: string | null; accept: string | null; image: string | null; party: "organization" | "person" | null; pictures: { query: string; param: string; } | null; face: Record<string, string>; default_from: { link: string; field: string; } | null; reads: string[]; through: { link: string; field: string; } | null; pick: { query: string; param: string; same: { field: string; param: string; }[]; } | null; picks_only: boolean; suggest: { query: string; param: string; column: string; } | null; applies: ({ field: string; options: string[]; } | { field: string; value: boolean; })[]; } | null; key: string; }[]; readings: ({ entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "breakdown"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "list"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number | RecordBound>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | RecordBound | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; columns: string[]; open: { kind: "app"; app: { id: string; }; } | { kind: "drawer"; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "progress"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; planned: { start: string; end: string; }; done: string; finished: string | null; weight: string | null; measured: { via: string; read: { query: string; param: string; }; } | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "metric"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; value: string | null; average: boolean; over: string | null; target: number | null; better: "down" | "up" | null; bound: { value: number; } | { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; } | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "pivot"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; rows: string | { field: string; tiers: number[]; }; columns: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "shortfall"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string; across: string | null; value: string | null; on_hand: { entity: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; by: string | null; across: string | null; value: string | null; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "trend"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; over: string; value: string | null; ahead: boolean; })[]; attention: boolean; }; }[]; place: { alias: string; label: string; singular: string | null; table: string; fields: Record<string, { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | null; label: string; description: string | null; format: "datetime" | "link" | "markdown" | "text" | null; multi: boolean; required: boolean; readonly: boolean; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; limit: { field: string; } | { value: number; } | null; gate: { field: string; } | { value: number; } | null; tolerance: number | null; due: boolean; frees: boolean; summed: boolean; accumulates: boolean; whole: boolean; restates: string | null; starts: "me" | "today" | null; default: string | number | boolean | string[] | null; options: { id: string; alias: string; label: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | null; mark: { kind: string; name: string; } | null; }[] | null; link: string | null; accept: string | null; image: string | null; party: "organization" | "person" | null; pictures: { query: string; param: string; } | null; face: Record<string, string>; default_from: { link: string; field: string; } | null; reads: string[]; through: { link: string; field: string; } | null; pick: { query: string; param: string; same: { field: string; param: string; }[]; } | null; picks_only: boolean; suggest: { query: string; param: string; column: string; } | null; applies: ({ field: string; options: string[]; } | { field: string; value: boolean; })[]; }>; title: string; subtitle: string[]; image: string | null; mark: string | null; description: string | null; party: "organization" | "person" | null; mine: string | null; status: { field: string; closed: string[]; history: string | null; dates: Record<string, string>; stages: { option: string; label: string; owner: { kind: "member"; column: string; label: string; } | { kind: "group"; group: string; label: string; }; within: number | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; }[]; maker: string | null; moves: { query: string; param: string; link: string; status: string; at: string; by: string | null; went: Record<string, string>; } | null; } | null; settled: string | null; task: { close: { to: string; act: string | null; } | null; reopen: { to: string; act: string | null; } | null; member: string | null; } | null; progress: { entity: string; via: string; passed: string | null; read: { query: string; param: string; }; }[]; figure: string | null; scan: { read: "iso6346" | "text"; agent: string; } | { read: "code"; } | null; place: { address: string; latitude: string; longitude: string; accuracy: string | null; } | null; on_site: { photos: string[]; place: string | null; latitude: string; longitude: string; radius: number; } | null; pin: { on: string; x: string; y: string; } | null; size: { across: string; along: string; up: string; } | null; nests: { parent: string; children: string; closed: string | null; } | null; filed: Record<string, string>; list: { query: string; param: string | null; }; listed: string[] | null; one: { query: string; param: string; }; create: { workflow: string; fields: string[]; picker: string[] | null; } | null; update: { workflow: string; fields: string[]; } | null; remove: { workflow: string; with: string[]; } | null; } | null; owns: { queries: string[]; workflows: string[]; entities: string[]; } | null; }[]; pages: Record<string, { door: "beside" | "drawer" | "page" | null; sections: { title: string | null; description: string | null; at: string[] | null; fields: string[]; reads: string[]; blocks: ({ kind: "funnel"; entity: string; read: { query: string; param: string; }; label: string; steps: string[]; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { kind: "agenda"; entity: string; via: string; read: { query: string; param: string; }; title: string; columns: string[]; day: string; time: string | null; part: string | null; start: string | null; create: string[] | null; add_label: string | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { kind: "figures"; fields: string[]; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { kind: "files"; fields: string[]; title: string; add_label: string | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { kind: "list"; reading: { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "list"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number | RecordBound>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | RecordBound | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; columns: string[]; open: { kind: "app"; app: { id: string; }; } | { kind: "drawer"; }; }; via: string; same: { field: string; param: string; } | null; bounds: { field: string; param: string; of: "date" | "number"; lookup: boolean; }[]; open: "in_place" | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { entity: string; via: string; read: { query: string; param: string; }; title: string; columns: string[]; create: string[] | null; add_label: string | null; totals: Record<string, string>; narrower: string[]; soonest: string[]; expect: string | null; of: string | null; where: { field: string; options: string[]; }[]; add_form: { preset: Record<string, { id: string; label: string; }>; among: Record<string, string[]>; } | null; filters: (string | { field: string; tiers: number[]; })[]; search: string[]; group: string | null; sort: { field: string; desc: boolean; }[] | null; edits: string[]; remove: boolean; pick: { read: { query: string; param: string | null; }; back: string; same: { field: string; param: string; }[]; admits: { query: string; param: string | null; } | null; } | null; checklist: { photo: string | null; clause: string | null; words: string[]; failed: string[]; passed: string | null; } | null; gantt: { start: string; end: string; milestones: string[]; planned: { start: string | null; end: string | null; } | null; progress: string | null; after: string | null; } | null; compare: { before: string; after: string; } | null; current: string | null; post: { bodies: string[]; text: string; compute: { expression: string; reads: Record<string, { from: "row"; field: string; } | { from: "record"; field: string; } | { from: "place"; field: string; } | { from: "formula"; expression: string; }>; } | null; media: string; link: string | null; network: string; group: string | null; networks: Record<string, "facebook" | "instagram" | "linkedin" | "threads" | "x">; } | null; under: { field: string; entity: string; via: string; back: string; read: { query: string; param: string; }; where: { field: string; options: string[]; }[]; add_form: { preset: Record<string, { id: string; label: string; }>; among: Record<string, string[]>; } | null; } | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; kind: "rows"; } | { entity: string; via: string; read: { query: string; param: string; }; title: string; columns: string[]; create: string[] | null; add_label: string | null; totals: Record<string, string>; narrower: string[]; soonest: string[]; expect: string | null; of: string | null; where: { field: string; options: string[]; }[]; add_form: { preset: Record<string, { id: string; label: string; }>; among: Record<string, string[]>; } | null; filters: (string | { field: string; tiers: number[]; })[]; search: string[]; group: string | null; sort: { field: string; desc: boolean; }[] | null; edits: string[]; remove: boolean; pick: { read: { query: string; param: string | null; }; back: string; same: { field: string; param: string; }[]; admits: { query: string; param: string | null; } | null; } | null; checklist: { photo: string | null; clause: string | null; words: string[]; failed: string[]; passed: string | null; } | null; gantt: { start: string; end: string; milestones: string[]; planned: { start: string | null; end: string | null; } | null; progress: string | null; after: string | null; } | null; compare: { before: string; after: string; } | null; current: string | null; post: { bodies: string[]; text: string; compute: { expression: string; reads: Record<string, { from: "row"; field: string; } | { from: "record"; field: string; } | { from: "place"; field: string; } | { from: "formula"; expression: string; }>; } | null; media: string; link: string | null; network: string; group: string | null; networks: Record<string, "facebook" | "instagram" | "linkedin" | "threads" | "x">; } | null; under: { field: string; entity: string; via: string; back: string; read: { query: string; param: string; }; where: { field: string; options: string[]; }[]; add_form: { preset: Record<string, { id: string; label: string; }>; among: Record<string, string[]>; } | null; } | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; kind: "outline"; counts: { query: string; param: string; }; } | { kind: "reading"; reading: { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "breakdown"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "list"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number | RecordBound>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | RecordBound | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; columns: string[]; open: { kind: "app"; app: { id: string; }; } | { kind: "drawer"; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "progress"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; planned: { start: string; end: string; }; done: string; finished: string | null; weight: string | null; measured: { via: string; read: { query: string; param: string; }; } | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "metric"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; value: string | null; average: boolean; over: string | null; target: number | null; better: "down" | "up" | null; bound: { value: number; } | { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; } | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "pivot"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; rows: string | { field: string; tiers: number[]; }; columns: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "shortfall"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string; across: string | null; value: string | null; on_hand: { entity: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; by: string | null; across: string | null; value: string | null; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "trend"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; over: string; value: string | null; ahead: boolean; }; via: string; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { kind: "statement"; title: string; lines: { field: string; op: "equals" | "minus" | "plus" | "times" | null; rate: string | null; parts: { entity: string; read: { query: string; param: string; }; same: string; before: { field: string; param: string; } | null; columns: string[]; figure: string; } | null; }[]; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { kind: "text"; field: string; title: string; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | { kind: "timeline"; entity: string; via: string; read: { query: string; param: string; }; title: string; at: string; by: string | null; create: string[] | null; add_label: string | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; })[]; acts: string[]; entry: string[]; acts_last: boolean; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; page: string | null; side: boolean; }[]; draws: string[]; outside: { key: string; entity: string; at: string[]; one: { query: string; param: string; }; page: { door: "page"; draws: string[]; sections: [{ title: string; description: string | null; fields: string[]; blocks: { kind: "list"; via: string; same: { field: string; param: string; } | null; bounds: { field: string; param: string; of: "date" | "number"; lookup: boolean; }[]; open: "in_place" | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; reading: { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "list"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number | RecordBound>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | RecordBound | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; columns: string[]; }; }[]; acts: string[]; }]; }; opens_on: { days: number; } | { span: "day" | "month" | "quarter" | "week" | "year"; view: "day" | "month" | "week" | null; }; }[]; comments: boolean; moves: { kind: "timeline"; entity: string; via: string; read: { query: string; param: string; }; title: string; at: string; by: string | null; create: string[] | null; add_label: string | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; } | null; compose: { use: "Title"; } | { use: "Status"; } | { use: "Field"; field: string; } | { use: "Document"; field: string; } | { use: "Act"; act: string; } | { use: "Rows"; child: string; create: boolean; remove: boolean; } | { use: "Copy"; field: string; as: "plain" | "raw"; } | { use: "Column"; children: ComposeNode[]; } | { use: "Bar"; children: ComposeNode[]; } | { use: "Group"; title: string; children: ComposeNode[]; } | { use: "Panel"; title: string; children: ComposeNode[]; } | null; }>; acts: { alias: string; label: string; on: "record" | "rows" | "view"; of: string; workflow: string | null; open: { app: string; } | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; to: string | null; writes: boolean; into: string | null; paper: { entity: string; option: string; } | null; marks: Record<string, boolean>; requires: string[]; recommends: string[]; asks: (string | { input: string; label: string; type: "date" | "file" | "link" | "long_text" | "member" | "number" | "select" | "text"; options: { alias: string; label: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | null; mark: { kind: string; name: string; } | null; }[] | null; entity: string | null; required: boolean; default: string | null; accept: string | null; })[]; asking: Record<string, { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | null; label: string; description: string | null; format: "datetime" | "link" | "markdown" | "text" | null; multi: boolean; required: boolean; readonly: boolean; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; limit: { field: string; } | { value: number; } | null; gate: { field: string; } | { value: number; } | null; tolerance: number | null; due: boolean; frees: boolean; summed: boolean; accumulates: boolean; whole: boolean; restates: string | null; starts: "me" | "today" | null; default: string | number | boolean | string[] | null; options: { id: string; alias: string; label: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | null; mark: { kind: string; name: string; } | null; }[] | null; link: string | null; accept: string | null; image: string | null; party: "organization" | "person" | null; pictures: { query: string; param: string; } | null; face: Record<string, string>; default_from: { link: string; field: string; } | null; reads: string[]; through: { link: string; field: string; } | null; pick: { query: string; param: string; same: { field: string; param: string; }[]; } | null; picks_only: boolean; suggest: { query: string; param: string; column: string; } | null; applies: ({ field: string; options: string[]; } | { field: string; value: boolean; })[]; }>; starts: Record<string, "me" | "today">; makes: string | null; papers: { template: string; label: string; when: ({ field: string; options: string[]; } | { field: string; value: boolean; })[]; }[] | null; archive: string | null; intake: { agent: string; papers: { entity: string; kind: string; files: string; }; fields: string[]; parties: { link: string; fields: string[]; }[]; rows: { entity: string; fields: string[]; key: string[]; }[]; links: { entity: string; table: string; }[]; } | null; recording: { into: string; via: string; audio: string; transcript: string; video: string | null; agent: string | null; } | null; sign: { into: string; by: string; at: string; witness: string | null; } | null; review: boolean; confirm: string | true | null; danger: boolean; corrects: boolean; stands: string[]; }[]; checks: { field: string; of: string; blocks: "all" | string[] | null; resolve: string[]; reads: string[]; stands: string[]; }[]; } | { version: 30; app: { alias: string; label: string; description: string | null; locale: ReportLanguage; }; dashboard: ({ entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "breakdown"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "list"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number | RecordBound>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | RecordBound | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; columns: string[]; open: { kind: "app"; app: { id: string; }; } | { kind: "drawer"; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "metric"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; value: string | null; average: boolean; over: string | null; target: number | null; better: "down" | "up" | null; bound: { value: number; } | { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; } | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "pivot"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; rows: string | { field: string; tiers: number[]; }; columns: string | { field: string; tiers: number[]; }; value: string | null; over: string | null; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "shortfall"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; by: string; across: string | null; value: string | null; on_hand: { entity: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; by: string | null; across: string | null; value: string | null; }; } | { entity: string; label: string; read: { query: string; param: string | null; aggregate: { by: string[] | null; bands: Record<string, number[]> | null; day: string | null; sum: string | null; } | null; }; kind: "trend"; where: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<number>; of: "number"; zone: string | null; } | { field: string; compare: StatedBounds<string | { now: true; }>; of: "date" | "datetime"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; } | { field: string; member: "me"; })[]; tab: string | null; over: string; value: string | null; ahead: boolean; })[]; tabs: { tab: string; label: string; }[] | null; opens_on: { days: 30; } | { span: "month" | "quarter" | "year"; }; entities: Record<string, { alias: string; label: string; singular: string | null; table: string; fields: Record<string, { alias: string; id: string; type: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text"; result: "autonumber" | "boolean" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | null; label: string; description: string | null; format: "datetime" | "link" | "markdown" | "text" | null; multi: boolean; required: boolean; readonly: boolean; notation: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | null; limit: { field: string; } | { value: number; } | null; gate: { field: string; } | { value: number; } | null; tolerance: number | null; due: boolean; frees: boolean; summed: boolean; accumulates: boolean; whole: boolean; restates: string | null; starts: "me" | "today" | null; default: string | number | boolean | string[] | null; options: { id: string; alias: string; label: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc" | null; mark: { kind: string; name: string; } | null; }[] | null; link: string | null; accept: string | null; image: string | null; party: "organization" | "person" | null; pictures: { query: string; param: string; } | null; face: Record<string, string>; default_from: { link: string; field: string; } | null; reads: string[]; through: { link: string; field: string; } | null; pick: { query: string; param: string; same: { field: string; param: string; }[]; } | null; picks_only: boolean; suggest: { query: string; param: string; column: string; } | null; applies: ({ field: string; options: string[]; } | { field: string; value: boolean; })[]; }>; title: string; subtitle: string[]; image: string | null; mark: string | null; description: string | null; party: "organization" | "person" | null; mine: string | null; status: { field: string; closed: string[]; history: string | null; dates: Record<string, string>; stages: { option: string; label: string; owner: { kind: "member"; column: string; label: string; } | { kind: "group"; group: string; label: string; }; within: number | null; when: ({ field: string; options: string[]; } | { field: string; compare: StatedBounds<Bound>; of: "date" | "datetime" | "number"; zone: string | null; } | { field: string; empty: boolean; } | { field: string; value: boolean; })[]; }[]; maker: string | null; moves: { query: string; param: string; link: string; status: string; at: string; by: string | null; went: Record<string, string>; } | null; } | null; settled: string | null; task: { close: { to: string; act: string | null; } | null; reopen: { to: string; act: string | null; } | null; member: string | null; } | null; progress: { entity: string; via: string; passed: string | null; read: { query: string; param: string; }; }[]; figure: string | null; scan: { read: "iso6346" | "text"; agent: string; } | { read: "code"; } | null; place: { address: string; latitude: string; longitude: string; accuracy: string | null; } | null; on_site: { photos: string[]; place: string | null; latitude: string; longitude: string; radius: number; } | null; pin: { on: string; x: string; y: string; } | null; size: { across: string; along: string; up: string; } | null; nests: { parent: string; children: string; closed: string | null; } | null; filed: Record<string, string>; list: { query: string; param: string | null; }; listed: string[] | null; one: { query: string; param: string; }; create: { workflow: string; fields: string[]; picker: string[] | null; } | null; update: { workflow: string; fields: string[]; } | null; remove: { workflow: string; with: string[]; } | null; }>; };
|
|
282
|
+
/** The register's layout as the spec states it: `kind` and the facts the runtime draws it from. */
|
|
283
|
+
export type SpecLayout = CardsSpec | TableSpec | { kind: "calendar"; date: string; end: string | null; } | { kind: "lanes"; field: string; group: string | null; start: string; end: string | null; loads: { value: string; against: string; }[]; read: { query: string; param: string; } | null; } | { kind: "plan"; at: string; across: string; up: string; fill: string | null; mark: { field: string; option: string; } | null; size: { field: string; options: Record<string, { across: number; along: number; up: number; }>; } | null; place: { entity: string; read: { query: string; param: string | null; }; kind: string; kinds: { bay: string; area: string; landmark: string; }; sheet: string | null; scale: string | null; x: string; y: string; width: string | null; depth: string | null; across: string; up: string; reach_from: string | null; stacked: string | null; reaches: { first: string; last: string; both: string; } | null; size: { across: string; along: string; up: string; } | null; }; load: { query: string; param: string | null; } | null; } | { kind: "roster"; entity: string; via: string; day: string | null; end: string | null; expect: string | null; of: string | null; cadence: { on: ("fri" | "mon" | "sat" | "sun" | "thu" | "tue" | "wed")[]; from: string | null; until: string | null; } | null; read: { query: string; param: string; }; create: string[] | null; } | { start: string; end: string; milestones: string[]; planned: { start: string | null; end: string | null; } | null; progress: string | null; after: string | null; kind: "gantt"; };
|
|
284
|
+
/** A comparison as a compiled app states it: every key, `null` where it bounds nothing. */
|
|
285
|
+
export type StatedBounds<V> = { gt: V | null; gte: V | null; lt: V | null; lte: V | null; };
|
|
286
|
+
/** A `Rows` piece as the model and the spec state it: whether rows are added here and whether they offer a Delete. The acts of its rows are the app's, each `of` the child. */
|
|
287
|
+
export type StatedComposeRows = ComposeRowsPiece & { create: boolean; remove: boolean; };
|
|
276
288
|
export type TableField = { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "number"; notation?: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | undefined; format: "currency" | "number" | "percentage"; currency?: string | null | undefined; unit?: string | null | undefined; unit_field?: string | null | undefined; currency_field?: string | null | undefined; default_value?: number | null | undefined; default_from?: { link_field_key: string; through?: string[] | undefined; field_key: string; options?: Record<string, string> | undefined; } | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "text"; unique?: boolean | undefined; format?: "link" | "markdown" | "text" | undefined; default_value?: string | null | undefined; default_from?: { link_field_key: string; through?: string[] | undefined; field_key: string; options?: Record<string, string> | undefined; } | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "date"; format?: "date" | "date_range" | "datetime" | "datetime_range" | undefined; timezone?: string | undefined; derive_from?: "created_at" | "updated_at" | undefined; default_value?: string | null | undefined; default_from?: { link_field_key: string; through?: string[] | undefined; field_key: string; options?: Record<string, string> | undefined; } | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "boolean"; default_value?: boolean | null | undefined; default_from?: { link_field_key: string; through?: string[] | undefined; field_key: string; options?: Record<string, string> | undefined; } | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "select"; options: { key: string; alias?: string | undefined; name: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc"; mark?: { kind: string; name: string; } | undefined; }[]; multi?: boolean | undefined; default_value?: string[] | null | undefined; default_from?: { link_field_key: string; through?: string[] | undefined; field_key: string; options?: Record<string, string> | undefined; } | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "select_member"; multi?: boolean | undefined; default_value?: string[] | null | undefined; default_from?: { link_field_key: string; through?: string[] | undefined; field_key: string; options?: Record<string, string> | undefined; } | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "select_record_link"; table_id: string; paired_field_key?: string | undefined; cardinality?: "many" | "one" | undefined; default_from?: { link_field_key: string; through?: string[] | undefined; field_key: string; options?: Record<string, string> | undefined; } | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "rollup"; source_field_key: string; aggregate_option: { operation: "checked" | "percent_checked" | "percent_unchecked" | "unchecked"; field_key: string; } | { operation: "empty" | "filled" | "percent_empty" | "percent_filled" | "selected"; field_key: string; } | { operation: "empty" | "filled" | "percent_empty" | "percent_filled" | "percent_unique" | "unique"; field_key: string; } | { operation: "empty" | "filled" | "percent_empty" | "percent_filled" | "percent_unique" | "selected" | "unique"; field_key: string; } | { operation: "date_range" | "earliest" | "empty" | "filled" | "latest" | "percent_empty" | "percent_filled" | "percent_unique" | "unique"; field_key: string; } | { operation: "avg" | "empty" | "filled" | "max" | "median" | "min" | "percent_empty" | "percent_filled" | "percent_unique" | "range" | "sum" | "unique"; field_key: string; } | { operation: "avg" | "date_range" | "earliest" | "empty" | "filled" | "latest" | "max" | "median" | "min" | "percent_empty" | "percent_filled" | "percent_unique" | "range" | "sum" | "unique"; field_key: string; } | { operation: "avg" | "checked" | "date_range" | "earliest" | "empty" | "filled" | "latest" | "max" | "median" | "min" | "percent_checked" | "percent_empty" | "percent_filled" | "percent_unchecked" | "percent_unique" | "range" | "sum" | "unchecked" | "unique"; field_key: string; } | { operation: "count"; field_key?: string | undefined; }; filter?: TableRecordFiltersGroupNode | undefined; aggregate_field_type?: "autonumber" | "boolean" | "button" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | undefined; aggregate_field_notation?: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | undefined; aggregate_field_format?: string | undefined; aggregate_field_currency?: string | undefined; aggregate_field_unit?: string | undefined; aggregate_field_unit_field?: string | undefined; aggregate_field_currency_field?: string | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "lookup"; source_field_key: string; lookup_field_key: string; lookup_field_type?: "autonumber" | "boolean" | "button" | "date" | "files" | "formula" | "lookup" | "number" | "rollup" | "select" | "select_member" | "select_record_link" | "text" | undefined; lookup_field_notation?: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | undefined; lookup_field_format?: string | undefined; lookup_field_currency?: string | undefined; lookup_field_unit?: string | undefined; lookup_field_options?: { key: string; name: string; color?: string | undefined; mark?: { kind: string; name: string; } | undefined; }[] | undefined; lookup_field_autonumber?: boolean | undefined; order_by?: { field_key: string; direction: "asc" | "desc"; } | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "files"; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "formula"; formula: { expression: string; notation?: { style: "decimal"; } | { style: "currency"; currency: string | { per_row: string; }; } | { style: "unit"; unit: string | { per_row: string; }; } | undefined; link?: true | undefined; format?: "currency" | "link" | "number" | "percentage" | undefined; currency?: string | undefined; unit?: string | undefined; unit_field?: string | undefined; currency_field?: string | undefined; options?: { key: string; alias?: string | undefined; name: string; color: "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "gray" | "green" | "indigo" | "lime" | "neutral" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "slate" | "stone" | "teal" | "violet" | "yellow" | "zinc"; mark?: { kind: string; name: string; } | undefined; }[] | undefined; output_type?: "boolean" | "date" | "datetime" | "number" | "select" | "text" | undefined; volatile?: boolean | undefined; }; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "button"; text: string; workflow_id?: string | null | undefined; } | { key: string; alias?: string | undefined; name: string; description: string; confirm_before_update?: boolean | undefined; required?: boolean | undefined; type: "autonumber"; prefix?: string | undefined; padding?: number | undefined; template?: string | undefined; };
|
|
277
289
|
export type TableRecordFilters = TableRecordFiltersConditionNode | TableRecordFiltersGroupNode | TableRecordFiltersTraversalNode;
|
|
278
290
|
export type TableRecordFiltersConditionNode = { node_type: "condition"; field_key?: string; type?: string; operator: string; value?: unknown; unit_option?: string; };
|
|
@@ -290,6 +302,10 @@ export type TableRecordFiltersGroupNode = { node_type: "group"; logic: "and" | "
|
|
|
290
302
|
* Max path depth and inner-condition syntax are validated by `validateFilters`.
|
|
291
303
|
*/
|
|
292
304
|
export type TableRecordFiltersTraversalNode = { node_type: "traversal"; path: string[]; condition: TableRecordFiltersConditionNode; };
|
|
305
|
+
/** The table as the spec's register states it: it states no facts. */
|
|
306
|
+
export interface TableSpec {
|
|
307
|
+
kind: "table";
|
|
308
|
+
}
|
|
293
309
|
/**
|
|
294
310
|
* The presigned files, skipping any without a `url`. A lookup arrives one
|
|
295
311
|
* level deeper, flattened as in readLinks.
|
package/docs/runtime.md
CHANGED
|
@@ -259,7 +259,7 @@ semantics are documented:
|
|
|
259
259
|
|---|---|---|---|
|
|
260
260
|
| `query` | `{ alias, params?, limit?, offset?, … }` | `{ rows }` | [queries](./queries.md), [data fetching](./data_fetching.md) |
|
|
261
261
|
| `export` | `{ alias, params?, filter?, sort?, report, file }` (`exportQuery`) or `{ export: { key, … } }` (`exportApp`) | `{ file }` | [data fetching](./data_fetching.md) |
|
|
262
|
-
| `spec` | `{}` | `HostSpec`: the app's compiled `app.json` itself (format
|
|
262
|
+
| `spec` | `{}` | `HostSpec`: the app's compiled `app.json` itself (format 30: `lists`, `pages` by entity, `entities`, flat `acts` and `checks`; a dashboard's readings), never the route's wrapper | this doc |
|
|
263
263
|
| `field_options` | `{ alias }` | `{ fields }` | [members & options](./members_and_options.md) |
|
|
264
264
|
| `workflow` | `{ alias, inputs }` | `WorkflowResult` | [mutations](./mutations.md) |
|
|
265
265
|
| `upload` | `{ file: File }` (the `File` crosses the bridge by structured clone) | uploaded-file object | [files](./files.md) |
|
package/package.json
CHANGED