pgkiln 0.69.0 → 0.71.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/db/migrations/136_vector_search.sql +252 -0
- package/db/migrations/137_create_page_types.sql +904 -0
- package/db/migrations/138_app_utilities.sql +153 -0
- package/docs/apex-feature-parity.md +10 -8
- package/docs/guide/03-builder.md +176 -4
- package/docs/guide/04-pages-and-regions.md +45 -3
- package/docs/guide/05-items.md +1 -1
- package/docs/guide/06-processing.md +18 -0
- package/docs/guide/09-reference.md +34 -1
- package/docs/guide/12-development.md +53 -3
- package/docs/guide/15-extensions.md +1 -1
- package/docs/guide/16-files.md +1 -1
- package/examples/hr/README.md +1 -0
- package/examples/hr/hr_72_vector_search.sql +158 -0
- package/examples/hr/hr_73_configuration_options.sql +17 -0
- package/examples/hr/hr_74_app_utilities.sql +22 -0
- package/package.json +1 -1
- package/public/app.css +9 -0
- package/public/builder.css +48 -0
- package/src/ai/embeddings.ts +197 -0
- package/src/ai/service.ts +13 -9
- package/src/app.ts +13 -0
- package/src/builder/advisor.ts +43 -3
- package/src/builder/ai-agents.ts +13 -5
- package/src/builder/app-updates.ts +3 -0
- package/src/builder/components.ts +24 -4
- package/src/builder/create-page.ts +259 -0
- package/src/builder/dependencies.ts +311 -0
- package/src/builder/features.ts +313 -0
- package/src/builder/home.ts +3 -0
- package/src/builder/i18n/de.ts +38 -0
- package/src/builder/i18n/en.ts +38 -0
- package/src/builder/i18n/es.ts +38 -0
- package/src/builder/i18n/fr.ts +38 -0
- package/src/builder/i18n/it.ts +38 -0
- package/src/builder/i18n/ja.ts +38 -0
- package/src/builder/i18n/ko.ts +38 -0
- package/src/builder/i18n/nl.ts +38 -0
- package/src/builder/i18n/pt.ts +38 -0
- package/src/builder/i18n/zh-cn.ts +38 -0
- package/src/builder/i18n/zh-tw.ts +38 -0
- package/src/builder/login-page.ts +17 -14
- package/src/builder/newapp.ts +41 -23
- package/src/builder/object-actions.ts +1 -0
- package/src/builder/routes.ts +13 -2
- package/src/builder/shared.ts +1 -1
- package/src/builder/sql.ts +3 -0
- package/src/builder/table-editor.ts +1 -0
- package/src/builder/ui-defaults.ts +161 -0
- package/src/builder/ui.ts +2 -1
- package/src/builder/upgrade.ts +154 -0
- package/src/builder/utilities.ts +181 -0
- package/src/builder/vector-column.ts +229 -0
- package/src/builder/vector-providers.ts +286 -0
- package/src/builder/wizards.ts +211 -26
- package/src/cli/replace.ts +11 -1
- package/src/history.ts +155 -0
- package/src/runtime/ai-agents.ts +53 -2
- package/src/runtime/builtin-components.ts +23 -2
- package/src/runtime/items.ts +4 -2
- package/src/runtime/search.ts +116 -12
- package/src/server.ts +3 -0
- package/src/vector.ts +288 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
-- =====================================================================
|
|
2
|
+
-- 138: an application's Utilities (sprint 138, AP-5; APEX: Application
|
|
3
|
+
-- Utilities: Change History, Attribute Dictionary / UI defaults)
|
|
4
|
+
--
|
|
5
|
+
-- meta.app_snapshot: the application's export (meta.export_app) after the
|
|
6
|
+
-- last recorded change. The builder compares it with a new export after
|
|
7
|
+
-- each change (src/history.ts, the working copies' component split) and
|
|
8
|
+
-- keeps what changed per component in meta.component_change.
|
|
9
|
+
-- meta.component_change: one row per component that a change added,
|
|
10
|
+
-- changed or deleted: its id in the one-file-per-component layout
|
|
11
|
+
-- (src/appfiles.ts, e.g. pages/0003/items/p3_sal), a label, the page,
|
|
12
|
+
-- the component's files before and after ({"path": "text"}), who (a
|
|
13
|
+
-- developer, or null for the command line / MCP server) and when.
|
|
14
|
+
-- Installation data: not exported, kept by import --replace.
|
|
15
|
+
-- meta.ui_default: UI defaults per table column (APEX: Attribute
|
|
16
|
+
-- Dictionary / Table UI Defaults): label, format mask, help, alignment
|
|
17
|
+
-- and list of values. The page wizards and the Create Application wizard
|
|
18
|
+
-- take the label from meta.wizard_column_label (redefined below: a UI
|
|
19
|
+
-- default wins); a form item made by a wizard also gets the column's
|
|
20
|
+
-- format mask, help and list of values (meta.ui_default_item, a trigger
|
|
21
|
+
-- on meta.item that only acts right after meta.wizard_column_label named
|
|
22
|
+
-- a column with a UI default in the same transaction).
|
|
23
|
+
-- Installation data, keyed by schema, table and column names (not oids:
|
|
24
|
+
-- they survive a dump and restore). Not exported with an application.
|
|
25
|
+
-- =====================================================================
|
|
26
|
+
|
|
27
|
+
create table meta.app_snapshot (
|
|
28
|
+
app_id int primary key references meta.app (id) on delete cascade,
|
|
29
|
+
doc jsonb not null,
|
|
30
|
+
taken_at timestamptz not null default now()
|
|
31
|
+
);
|
|
32
|
+
comment on table meta.app_snapshot is
|
|
33
|
+
'The application''s export after its last recorded change: what the next change is compared with (change history, 138)';
|
|
34
|
+
|
|
35
|
+
create table meta.component_change (
|
|
36
|
+
id bigint generated always as identity primary key,
|
|
37
|
+
app_id int not null references meta.app (id) on delete cascade,
|
|
38
|
+
component text not null check (length(component) <= 500),
|
|
39
|
+
label text not null,
|
|
40
|
+
page_no int,
|
|
41
|
+
op text not null check (op in ('added', 'changed', 'deleted')),
|
|
42
|
+
before jsonb,
|
|
43
|
+
after jsonb,
|
|
44
|
+
changed_by text,
|
|
45
|
+
source text not null default 'builder' check (source in ('builder', 'import', 'upgrade')),
|
|
46
|
+
changed_at timestamptz not null default now()
|
|
47
|
+
);
|
|
48
|
+
create index component_change_app_idx on meta.component_change (app_id, changed_at desc);
|
|
49
|
+
create index component_change_component_idx on meta.component_change (app_id, component, changed_at desc);
|
|
50
|
+
comment on table meta.component_change is
|
|
51
|
+
'Change history per component (138): the component''s files before and after a change, who and when';
|
|
52
|
+
|
|
53
|
+
create table meta.ui_default (
|
|
54
|
+
id int generated always as identity primary key,
|
|
55
|
+
schema_name text not null check (schema_name ~ '^[^\s]{1,63}$'),
|
|
56
|
+
table_name text not null check (table_name ~ '^[^\s]{1,63}$'),
|
|
57
|
+
column_name text not null check (length(column_name) between 1 and 63),
|
|
58
|
+
label text check (length(label) <= 200),
|
|
59
|
+
format_mask text check (format_mask ~ '^[A-Za-z0-9GDLSCFM.,:/ \-]{1,60}$'),
|
|
60
|
+
help text check (length(help) <= 4000),
|
|
61
|
+
alignment text check (alignment in ('start', 'center', 'end')),
|
|
62
|
+
lov text check (length(lov) <= 4000),
|
|
63
|
+
updated_by text,
|
|
64
|
+
updated_at timestamptz not null default now(),
|
|
65
|
+
unique (schema_name, table_name, column_name)
|
|
66
|
+
);
|
|
67
|
+
comment on table meta.ui_default is
|
|
68
|
+
'UI defaults per table column (APEX: Attribute Dictionary, 138): label, format mask, help, alignment, list of values; used by the page wizards';
|
|
69
|
+
|
|
70
|
+
-- the UI default of a table's column, or null
|
|
71
|
+
create function meta.ui_default_of(p_table regclass, p_col text) returns meta.ui_default
|
|
72
|
+
language sql stable as $$
|
|
73
|
+
select d.* from meta.ui_default d
|
|
74
|
+
join pg_class c on c.oid = p_table join pg_namespace n on n.oid = c.relnamespace
|
|
75
|
+
where d.schema_name = n.nspname and d.table_name = c.relname and d.column_name = p_col
|
|
76
|
+
$$;
|
|
77
|
+
|
|
78
|
+
-- (097) a column's label for the generators: (138) its UI default's label wins; a UI default also
|
|
79
|
+
-- tells meta.ui_default_item which column the next wizard item is for (a transaction-local setting)
|
|
80
|
+
create or replace function meta.wizard_column_label(p_table regclass, p_col text) returns text
|
|
81
|
+
language plpgsql stable as $$
|
|
82
|
+
declare
|
|
83
|
+
v_ui meta.ui_default := meta.ui_default_of(p_table, p_col);
|
|
84
|
+
v_comment text;
|
|
85
|
+
v_rel text := lower((select relname from pg_class where oid = p_table));
|
|
86
|
+
v_fk boolean;
|
|
87
|
+
v_pk boolean;
|
|
88
|
+
v_base text := p_col;
|
|
89
|
+
v_rest text;
|
|
90
|
+
l text := lower(p_col);
|
|
91
|
+
begin
|
|
92
|
+
if v_ui.id is not null then
|
|
93
|
+
perform set_config('pgkiln.ui_default_col', p_table::oid::text || '.' || p_col, true);
|
|
94
|
+
if nullif(btrim(v_ui.label), '') is not null then
|
|
95
|
+
return btrim(v_ui.label);
|
|
96
|
+
end if;
|
|
97
|
+
end if;
|
|
98
|
+
select meta.wizard_short(col_description(p_table, a.attnum), 60) into v_comment
|
|
99
|
+
from pg_attribute a where a.attrelid = p_table and a.attname = p_col and not a.attisdropped;
|
|
100
|
+
if v_comment is not null then
|
|
101
|
+
return v_comment;
|
|
102
|
+
end if;
|
|
103
|
+
select c.fk_table is not null, c.is_pk into v_fk, v_pk from meta.wizard_catalog(p_table) c where c.column_name = p_col;
|
|
104
|
+
if v_fk and not v_pk then
|
|
105
|
+
v_rest := regexp_replace(p_col, '_?(id|no|num|nr|code|key|fk)$', '', 'i');
|
|
106
|
+
if length(v_rest) >= 2 then
|
|
107
|
+
v_base := v_rest;
|
|
108
|
+
end if;
|
|
109
|
+
elsif length(l) >= 4 and left(l, 1) = left(v_rel, 1) and not (meta.wizard_abbreviations() ? l) and not meta.wizard_is_word(l)
|
|
110
|
+
and meta.wizard_is_word(substr(l, 2)) then
|
|
111
|
+
-- a column named after the table's first letter: ename, dname
|
|
112
|
+
v_base := substr(p_col, 2);
|
|
113
|
+
end if;
|
|
114
|
+
return meta.wizard_label(v_base);
|
|
115
|
+
end
|
|
116
|
+
$$;
|
|
117
|
+
|
|
118
|
+
-- a form item a wizard is inserting: the column's format mask, help text and list of values
|
|
119
|
+
create function meta.ui_default_item() returns trigger
|
|
120
|
+
language plpgsql as $$
|
|
121
|
+
declare
|
|
122
|
+
v_mark text := current_setting('pgkiln.ui_default_col', true);
|
|
123
|
+
v_table regclass;
|
|
124
|
+
v_ui meta.ui_default;
|
|
125
|
+
begin
|
|
126
|
+
if coalesce(v_mark, '') = '' or new.source_column is null or new.region_id is null then
|
|
127
|
+
return new;
|
|
128
|
+
end if;
|
|
129
|
+
select to_regclass(r.table_name) into v_table from meta.region r where r.id = new.region_id and r.type = 'form';
|
|
130
|
+
if v_table is null or v_mark <> v_table::oid::text || '.' || new.source_column then
|
|
131
|
+
return new;
|
|
132
|
+
end if;
|
|
133
|
+
perform set_config('pgkiln.ui_default_col', '', true);
|
|
134
|
+
v_ui := meta.ui_default_of(v_table, new.source_column);
|
|
135
|
+
if v_ui.id is null or new.type in ('hidden', 'file') then
|
|
136
|
+
return new;
|
|
137
|
+
end if;
|
|
138
|
+
if v_ui.format_mask is not null and new.type in ('number', 'date', 'datetime', 'display', 'text') then
|
|
139
|
+
new.config := coalesce(new.config, '{}') || jsonb_build_object('format_mask', v_ui.format_mask);
|
|
140
|
+
end if;
|
|
141
|
+
if nullif(btrim(v_ui.help), '') is not null then
|
|
142
|
+
new.help := btrim(v_ui.help);
|
|
143
|
+
end if;
|
|
144
|
+
if nullif(btrim(v_ui.lov), '') is not null and new.type in ('text', 'number', 'select') then
|
|
145
|
+
new.type := 'select';
|
|
146
|
+
new.lov := btrim(v_ui.lov);
|
|
147
|
+
end if;
|
|
148
|
+
return new;
|
|
149
|
+
end
|
|
150
|
+
$$;
|
|
151
|
+
create trigger item_ui_default before insert on meta.item for each row execute function meta.ui_default_item();
|
|
152
|
+
|
|
153
|
+
revoke all on function meta.ui_default_of(regclass, text), meta.ui_default_item() from public;
|
|
@@ -7,13 +7,13 @@ open item and open an issue or pull request; see [CONTRIBUTING.md](../CONTRIBUTI
|
|
|
7
7
|
Legend: ✅ available · 🟡 partial (see notes) · ❌ not yet · ➖ not planned (a deliberate choice,
|
|
8
8
|
or better served by the PostgreSQL ecosystem; see the notes and [extensions](guide/15-extensions.md))
|
|
9
9
|
|
|
10
|
-
Last reviewed: 2026-10-27 against **APEX 26.2** (sprint 135: full-text search configurations, APEX's Oracle Text search type on PostgreSQL full-text search with stemming, ranking, highlights, *Did you mean* and *Add full-text search* in Table Properties (AP-2); sprint 134: the builder also in Italiano, 中文 (简体), 中文 (繁體), 日本語 and 한국어, APEX's ten builder languages plus Nederlands (SEC-5); sprints 121, 123–125: the builder in Deutsch, English, Español, Français, Nederlands and Português, step by step: the frame, sign-in, Workspace home, App Builder, Page Designer menus, the SQL Workshop's home, SQL Worksheet, Object Browser and Table Properties, Shared Components, application settings, users, identity providers, developers and workspaces (WS-7); sprint 122: *Ask in your own words* sets faceted search and smart filter facets, smart filters read a typed phrase (WS-5), and Sample Maps, Sample Approvals, Sample Data Loading and Sample Files in the App Gallery (WS-8); sprint 120: the App Gallery's single-topic sample apps (charts, cards, calendar, interactive grids, dynamic actions, reporting), the UX Pattern Catalog and a Utility Apps tab with Lookup Lists, Release Notes and Announcements (WS-8); sprint 119: data security per table, a roles × columns matrix and masked values per application role in a masking view, the same identity for pages, AI tools, REST, AutoREST and MCP (WS-13); sprint 118: Administration → Mail queue with delivery per hour and per workspace, the slowest provider calls and failures with Retry and Purge, a workspace's own mail service, and workspace network access lists that narrow the installation's allow-list (WS-9); sprint 117: Pillar Light and Pillar Dark navigation appearances with a header strip, clearer navigation tree states, subtle colour utilities, RTL; sprint 116: the comparison moved from 26.1 to 26.2, with a section for the 26.2 workspace items WS-1 … WS-13 and OCI managed identities; the App Builder list with Updated by, working copies and the lock; `pgkiln import --only`, a file-level import; stale rows on facet menus and blueprints fixed; sprint 115: popup LOVs that load on scroll, Wait Popup dynamic actions and dynamic actions on menu entries; sprint 114: Workflow 26.2 with custom task outcomes, task events and notifications, Send E-Mail and draft steps, migrating running instances and the diagram as SVG / PNG; sprint 113: Team Development with issues, labels, milestones, templates, a board and a set-up wizard; sprint 112: AI interactive reports with chips, Undo, computed columns and a phrase parser that needs no AI service; sprint 111: AI Agents with tools as a shared component, a Navigate tool with checksummed URLs, Gemini and OpenAI-compatible services; sprint 110: Data Reporter as a workspace tool with datasets, reporting applications, editors and viewers, published reports with stable URLs and pins; sprint 109: the Workspace home above the App Builder and SQL Workshop, with a summary, top applications, users and developers, and an optional release check; sprint 108: the code editor's syntax colours in the builder's light and dark themes, read-only SQL highlighted, the Data Modeler in dark mode; sprint 107: a transaction mode in the SQL Worksheet with Commit and Rollback; DA-18: JavaScript (MLE) not planned, plv8 where installed; sprint 106: the change log of DDL change sets with Flyway, Liquibase and SQL downloads; sprint 104: RESTful Services modules, templates and handlers with PL/pgSQL and media handlers, privileges, OpenAPI and Try it; sprint 103: Schema Export / Import with pg_dump and pg_restore; sprint 102: the SQL Monitor with live sessions, Top SQL and a statement's plan; sprint 101: Scheduling of pg_cron jobs with a schedule builder, run now and run history; sprint 100: RESTful Services, tables and views published as REST endpoints with paging, filters, keys and OpenAPI; sprint 99: Administration → Database Users for PostgreSQL roles; sprint 98: the Data Modeler with relational diagrams, DDL and a data dictionary; sprint 97: charts of a query in the worksheet, saved charts and their dashboard; sprint 96: the SQL Workshop's Launchpad with pins and tool groups, the builder's search with Ctrl+K; sprint 95: Table Properties: create, edit or copy a table in a form with a DDL preview and Apply in one transaction; sprint 94: an object's menu with Open in a panel, Quick DDL, Add index / trigger / policy and Drop with dependents; sprint 93: worksheets saved as SQL Scripts with tabs and a Files list, Format, Convert case, find and replace, bind and substitution variables; sprint 92: the worksheet's Query Result with sort, value dialog, copy and downloads, plans as a tree with the slowest step and misestimates, SQL History with status, search and run again; sprint 91: the SQL Worksheet like Database Actions' SQL: navigator, Run Statement at the cursor and Run Script with a log per statement, Explain Plan, Autotrace, notices, history, Run as an application role; sprint 90: Comment Out in the page designer, gallery labels in title case; sprint 89: the Object Browser's schema, one row of tabs, blank NULLs, Modify column; sprint 88: home cards with colour bands and round icons, the hero on the page background, a page footer with the version and Back to top; sprint 87: the Create Application wizard reloads the page list for a schema, RLS badges, the alias from the name; sprint 86: the page designer by page number, HTML error pages in the builder; sprint 85: the Form Designer, beyond APEX; sprint 84: the date picker, facet menus; sprint 83: Component Settings and Component Groups; sprint 82: Report Queries; sprint 81: Application Computations and Shortcuts in Shared Components; sprint 80: the master grid's first row selected when the page opens and after a search; grid cells as text with their format mask until edited, with cell navigation by arrow keys, Enter, F2 and Escape; sprint 79: generated dashboards with sums, donuts and lines, leaving out charts that say nothing; applications open in their own light or dark mode until the user chooses, per application; a user menu with Appearance and Sign in when signed out; the developer toolbar's App and Page texts and debug state; the report search's column scope in the magnifier; sprint 78: generated faceted search reports with one column per foreign key, the faceted search's total row count, Show all and Yes/No values, one search field, friendly headings and number formats in generated grids and master-detail pages, friendly names in the Create Application wizard's page list; sprint 77: the Page Designer's layout and tree by display position, button positions, the tree's context menu with Duplicate and Copy to other page, Show Common / Show All, Go to group and the Template Options dialog; display positions, button positions and side-column page templates at runtime; sprint 76: the interactive report's menus and pagination, date items in the date format; sprint 75: the SQL Workshop's Object Browser and tabs; sprint 74: the builder's information architecture: Shared Components grid, Settings tabs, application home search and tasks; sprint 73: the Create Application wizard on one page with page types and features; sprint 72: the runtime chrome compared with APEX 26.2's: the developer toolbar, the Iris look, the navigation bar's Help menu and Install button; sprint 71: generated applications compared with APEX 26.2's: labels, foreign key names in reports, file columns, format masks, the Home page and the dashboard; sprint 70: treemap, sunburst and timeline charts; sprint 69: dragging tasks on a Gantt chart; sprint 68: the Data Reporter's welcome page, Find my workspace; sprint 67: REST source catalogs from OpenAPI documents, a workspace's export and import (two rows added); sprint 66: a blueprint from an existing application; sprint 65: facet charts; sprint 64: approval vacation rules and expiration policies; sprint 63: range, box plot and stock charts; sprint 62: workspace preferences (SQL Workshop and RESTful services per workspace), extension links, Manage backups across applications, SQL Workshop utilities with object reports, About Database and a database monitor; sprint 61: the builder's screens compared with APEX 26.1: the workspace sign-in page, the Administration menu with workspace message, environment banner and utilization, the SQL Workshop home, the App Gallery, application groups and cross application reports (four rows added); sprint 60: isolated workspaces with their own database logins, row-level security on pgkiln's tables and workspace database roles, workspace administrators; sprint 59: the Page Designer's help pane, Quick edit from the developer toolbar; sprint 58: page groups; sprint 57: region templates hero, title bar, buttons container, inline dialog and drawer, wizard with wizard progress, the carousel; sprint 56: Generate DDL and Schema Comparison in the SQL Workshop, `pgkiln ddl` and `pgkiln compare`; sprint 55: an editable login page with a Login region and the Minimal page template, Forgot password through the application's mail service; sprint 54: interactive grid views, the single row view, group by and chart; sprint 53: application settings, user preferences and items kept per user, dynamic translations, `meta.data_export` and data export downloads, display image and geocoded address items; sprint 52: every dynamic action event and action, Ajax callbacks, an error handling function, the session timeout warning; sprint 51: checked imports, application backups, availability and Run only, feedback, type-specific attribute help; sprint 50: lost update detection, warn on unsaved changes, the URL and search regions with search configurations, the developer toolbar with a session state viewer, and e-mail through SMTP with OAuth2, Microsoft Graph, Amazon SES and HTTP APIs; import checks, application availability, property help and e-mail compared again; 2026-10-06: pgkiln 0.31.0, in progress: static application files and the Execute JavaScript dynamic action; region, item, dynamic action and process plug-ins; conditional and dynamic theme styles; XML and Excel in `meta.parse_data`, zips in SQL, `meta.v_boolean`; file items in S3-compatible object storage; map layers by the visible area and as vector tiles; a graphical query builder; tenants for workflows and tasks; application files as YAML and region static IDs; Lucide icons and icon modifiers; PWA push notifications; 0.30.0: 136 icons and an icon picker; an axe-core accessibility audit; cropping pictures; session sharing between applications; twenty-two built-in languages; 0.29.0: workspaces; the Iris base style; drawers; built-in template components including the metric card; Theme Roller dark-mode colours, live preview and template options on items and report columns; report selection across pages; instance settings; fourteen built-in languages; 0.28.0: AI with Claude and OpenAI; 0.27.0: Data Reporter; sample data generator; create application from several sheets, pasted data or existing tables; 0.26.0: working copies with a three-way merge; theme, library and boilerplate applications with subscriptions; 0.25.0: Gantt, pyramid and polar charts; map layers, clustering and server-side spatial filters; REST data sources that write back from forms and grids and synchronise into tables, OAuth2 password and refresh-token grants; debug messages per request and an install/upgrade log; `meta.web_request()` and `meta.parse_data()`; Theme Roller style variants and template options; 0.24.0: automations with several actions, error handling per row and runs from SQL; invoke-API workflow steps; Unload Data in the Data Workshop; create page wizards for cards, calendar, chart, map, faceted search, form and master-detail; create an application from a file; 0.23.0: interactive grid aggregates, frozen/moved/resized columns, layouts and saved grid reports, master-detail, row actions and copy/paste; download processes, execution chains in the background, workflow processes, branches to a function's URL or another app, the Dialog Closed event; number format masks, automatic time zone, runtime messages in German, French and Spanish; SQL scripts, Quick SQL, a query builder, XML loading and data load definitions; custom authentication, lists, page and application locks with developer comments, supporting objects; 0.22.0: keyset paging, report PDFs and REST collections streamed from a cursor, database-account authentication; 0.21.0: HTTP-header authentication behind a reverse proxy; 0.20.0: a popup list of values with server-side search; 0.19.0: row-range pagination, maximum row counts and row limits, lazy loading and caching of regions, streamed CSV/Excel downloads; 0.18.0: calendar week/day/list views with drag and drop, bubble/gauge/funnel/radar charts and drill-down, smart filters, a region display selector and more facet types, computations, conditional branches, build options, menu buttons, REST data sources and web credentials, rich text/Markdown, rating, combobox, date range and QR code items; 0.17.0: an App Builder home, workspace dashboard and utilities like APEX's; 0.16.0: a Page Designer with drag-and-drop layout, a code editor with autocomplete, template components and plug-ins, parallel branches and versions of workflows, the `pgkiln` command line with one file per component; 0.15.0: drop and paste files, heat maps, filtering a report by the map area; 0.14.0: stacked, combo, scatter and pie charts, several files per upload item; 0.13.0: map and tree regions; 0.12.0: REST modules in the builder; 0.11.0: workflows and Progressive Web Apps; 0.10.0: LDAP, SAML, "Keep me signed in", document templates, JSON loading, approvals and the task list; pgkiln installs no application, HR is an example).
|
|
10
|
+
Last reviewed: 2026-11-03 against **APEX 26.2** (sprint 138: an application's Utilities tab with a dashboard, database object dependencies, change history per component, Upgrade application, UI defaults (APEX's Attribute Dictionary), application and page checksums and an icon browser (AP-5); sprint 137: Create page as a grid of page types with previews, the page types interactive report, smart filters, search page, data loading, tree, timeline, media list, content row, comments, dashboard, wizard, unified task list and workflow console, a Feature tab with nine features that install once, and Create page as copy with shared components mapped or copied (AP-3); sprint 136: vector providers (an AI service with an embedding model or a SQL function), `meta.embed`, *Add vector column* in Table Properties with an HNSW index and a queue that keeps embeddings current, search types vector and hybrid (reciprocal rank fusion with full-text) and a Retrieve (RAG) tool for AI agents, all as the app's role through RLS, on pgvector (AP-1); sprint 135: full-text search configurations, APEX's Oracle Text search type on PostgreSQL full-text search with stemming, ranking, highlights, *Did you mean* and *Add full-text search* in Table Properties (AP-2); sprint 134: the builder also in Italiano, 中文 (简体), 中文 (繁體), 日本語 and 한국어, APEX's ten builder languages plus Nederlands (SEC-5); sprints 121, 123–125: the builder in Deutsch, English, Español, Français, Nederlands and Português, step by step: the frame, sign-in, Workspace home, App Builder, Page Designer menus, the SQL Workshop's home, SQL Worksheet, Object Browser and Table Properties, Shared Components, application settings, users, identity providers, developers and workspaces (WS-7); sprint 122: *Ask in your own words* sets faceted search and smart filter facets, smart filters read a typed phrase (WS-5), and Sample Maps, Sample Approvals, Sample Data Loading and Sample Files in the App Gallery (WS-8); sprint 120: the App Gallery's single-topic sample apps (charts, cards, calendar, interactive grids, dynamic actions, reporting), the UX Pattern Catalog and a Utility Apps tab with Lookup Lists, Release Notes and Announcements (WS-8); sprint 119: data security per table, a roles × columns matrix and masked values per application role in a masking view, the same identity for pages, AI tools, REST, AutoREST and MCP (WS-13); sprint 118: Administration → Mail queue with delivery per hour and per workspace, the slowest provider calls and failures with Retry and Purge, a workspace's own mail service, and workspace network access lists that narrow the installation's allow-list (WS-9); sprint 117: Pillar Light and Pillar Dark navigation appearances with a header strip, clearer navigation tree states, subtle colour utilities, RTL; sprint 116: the comparison moved from 26.1 to 26.2, with a section for the 26.2 workspace items WS-1 … WS-13 and OCI managed identities; the App Builder list with Updated by, working copies and the lock; `pgkiln import --only`, a file-level import; stale rows on facet menus and blueprints fixed; sprint 115: popup LOVs that load on scroll, Wait Popup dynamic actions and dynamic actions on menu entries; sprint 114: Workflow 26.2 with custom task outcomes, task events and notifications, Send E-Mail and draft steps, migrating running instances and the diagram as SVG / PNG; sprint 113: Team Development with issues, labels, milestones, templates, a board and a set-up wizard; sprint 112: AI interactive reports with chips, Undo, computed columns and a phrase parser that needs no AI service; sprint 111: AI Agents with tools as a shared component, a Navigate tool with checksummed URLs, Gemini and OpenAI-compatible services; sprint 110: Data Reporter as a workspace tool with datasets, reporting applications, editors and viewers, published reports with stable URLs and pins; sprint 109: the Workspace home above the App Builder and SQL Workshop, with a summary, top applications, users and developers, and an optional release check; sprint 108: the code editor's syntax colours in the builder's light and dark themes, read-only SQL highlighted, the Data Modeler in dark mode; sprint 107: a transaction mode in the SQL Worksheet with Commit and Rollback; DA-18: JavaScript (MLE) not planned, plv8 where installed; sprint 106: the change log of DDL change sets with Flyway, Liquibase and SQL downloads; sprint 104: RESTful Services modules, templates and handlers with PL/pgSQL and media handlers, privileges, OpenAPI and Try it; sprint 103: Schema Export / Import with pg_dump and pg_restore; sprint 102: the SQL Monitor with live sessions, Top SQL and a statement's plan; sprint 101: Scheduling of pg_cron jobs with a schedule builder, run now and run history; sprint 100: RESTful Services, tables and views published as REST endpoints with paging, filters, keys and OpenAPI; sprint 99: Administration → Database Users for PostgreSQL roles; sprint 98: the Data Modeler with relational diagrams, DDL and a data dictionary; sprint 97: charts of a query in the worksheet, saved charts and their dashboard; sprint 96: the SQL Workshop's Launchpad with pins and tool groups, the builder's search with Ctrl+K; sprint 95: Table Properties: create, edit or copy a table in a form with a DDL preview and Apply in one transaction; sprint 94: an object's menu with Open in a panel, Quick DDL, Add index / trigger / policy and Drop with dependents; sprint 93: worksheets saved as SQL Scripts with tabs and a Files list, Format, Convert case, find and replace, bind and substitution variables; sprint 92: the worksheet's Query Result with sort, value dialog, copy and downloads, plans as a tree with the slowest step and misestimates, SQL History with status, search and run again; sprint 91: the SQL Worksheet like Database Actions' SQL: navigator, Run Statement at the cursor and Run Script with a log per statement, Explain Plan, Autotrace, notices, history, Run as an application role; sprint 90: Comment Out in the page designer, gallery labels in title case; sprint 89: the Object Browser's schema, one row of tabs, blank NULLs, Modify column; sprint 88: home cards with colour bands and round icons, the hero on the page background, a page footer with the version and Back to top; sprint 87: the Create Application wizard reloads the page list for a schema, RLS badges, the alias from the name; sprint 86: the page designer by page number, HTML error pages in the builder; sprint 85: the Form Designer, beyond APEX; sprint 84: the date picker, facet menus; sprint 83: Component Settings and Component Groups; sprint 82: Report Queries; sprint 81: Application Computations and Shortcuts in Shared Components; sprint 80: the master grid's first row selected when the page opens and after a search; grid cells as text with their format mask until edited, with cell navigation by arrow keys, Enter, F2 and Escape; sprint 79: generated dashboards with sums, donuts and lines, leaving out charts that say nothing; applications open in their own light or dark mode until the user chooses, per application; a user menu with Appearance and Sign in when signed out; the developer toolbar's App and Page texts and debug state; the report search's column scope in the magnifier; sprint 78: generated faceted search reports with one column per foreign key, the faceted search's total row count, Show all and Yes/No values, one search field, friendly headings and number formats in generated grids and master-detail pages, friendly names in the Create Application wizard's page list; sprint 77: the Page Designer's layout and tree by display position, button positions, the tree's context menu with Duplicate and Copy to other page, Show Common / Show All, Go to group and the Template Options dialog; display positions, button positions and side-column page templates at runtime; sprint 76: the interactive report's menus and pagination, date items in the date format; sprint 75: the SQL Workshop's Object Browser and tabs; sprint 74: the builder's information architecture: Shared Components grid, Settings tabs, application home search and tasks; sprint 73: the Create Application wizard on one page with page types and features; sprint 72: the runtime chrome compared with APEX 26.2's: the developer toolbar, the Iris look, the navigation bar's Help menu and Install button; sprint 71: generated applications compared with APEX 26.2's: labels, foreign key names in reports, file columns, format masks, the Home page and the dashboard; sprint 70: treemap, sunburst and timeline charts; sprint 69: dragging tasks on a Gantt chart; sprint 68: the Data Reporter's welcome page, Find my workspace; sprint 67: REST source catalogs from OpenAPI documents, a workspace's export and import (two rows added); sprint 66: a blueprint from an existing application; sprint 65: facet charts; sprint 64: approval vacation rules and expiration policies; sprint 63: range, box plot and stock charts; sprint 62: workspace preferences (SQL Workshop and RESTful services per workspace), extension links, Manage backups across applications, SQL Workshop utilities with object reports, About Database and a database monitor; sprint 61: the builder's screens compared with APEX 26.1: the workspace sign-in page, the Administration menu with workspace message, environment banner and utilization, the SQL Workshop home, the App Gallery, application groups and cross application reports (four rows added); sprint 60: isolated workspaces with their own database logins, row-level security on pgkiln's tables and workspace database roles, workspace administrators; sprint 59: the Page Designer's help pane, Quick edit from the developer toolbar; sprint 58: page groups; sprint 57: region templates hero, title bar, buttons container, inline dialog and drawer, wizard with wizard progress, the carousel; sprint 56: Generate DDL and Schema Comparison in the SQL Workshop, `pgkiln ddl` and `pgkiln compare`; sprint 55: an editable login page with a Login region and the Minimal page template, Forgot password through the application's mail service; sprint 54: interactive grid views, the single row view, group by and chart; sprint 53: application settings, user preferences and items kept per user, dynamic translations, `meta.data_export` and data export downloads, display image and geocoded address items; sprint 52: every dynamic action event and action, Ajax callbacks, an error handling function, the session timeout warning; sprint 51: checked imports, application backups, availability and Run only, feedback, type-specific attribute help; sprint 50: lost update detection, warn on unsaved changes, the URL and search regions with search configurations, the developer toolbar with a session state viewer, and e-mail through SMTP with OAuth2, Microsoft Graph, Amazon SES and HTTP APIs; import checks, application availability, property help and e-mail compared again; 2026-10-06: pgkiln 0.31.0, in progress: static application files and the Execute JavaScript dynamic action; region, item, dynamic action and process plug-ins; conditional and dynamic theme styles; XML and Excel in `meta.parse_data`, zips in SQL, `meta.v_boolean`; file items in S3-compatible object storage; map layers by the visible area and as vector tiles; a graphical query builder; tenants for workflows and tasks; application files as YAML and region static IDs; Lucide icons and icon modifiers; PWA push notifications; 0.30.0: 136 icons and an icon picker; an axe-core accessibility audit; cropping pictures; session sharing between applications; twenty-two built-in languages; 0.29.0: workspaces; the Iris base style; drawers; built-in template components including the metric card; Theme Roller dark-mode colours, live preview and template options on items and report columns; report selection across pages; instance settings; fourteen built-in languages; 0.28.0: AI with Claude and OpenAI; 0.27.0: Data Reporter; sample data generator; create application from several sheets, pasted data or existing tables; 0.26.0: working copies with a three-way merge; theme, library and boilerplate applications with subscriptions; 0.25.0: Gantt, pyramid and polar charts; map layers, clustering and server-side spatial filters; REST data sources that write back from forms and grids and synchronise into tables, OAuth2 password and refresh-token grants; debug messages per request and an install/upgrade log; `meta.web_request()` and `meta.parse_data()`; Theme Roller style variants and template options; 0.24.0: automations with several actions, error handling per row and runs from SQL; invoke-API workflow steps; Unload Data in the Data Workshop; create page wizards for cards, calendar, chart, map, faceted search, form and master-detail; create an application from a file; 0.23.0: interactive grid aggregates, frozen/moved/resized columns, layouts and saved grid reports, master-detail, row actions and copy/paste; download processes, execution chains in the background, workflow processes, branches to a function's URL or another app, the Dialog Closed event; number format masks, automatic time zone, runtime messages in German, French and Spanish; SQL scripts, Quick SQL, a query builder, XML loading and data load definitions; custom authentication, lists, page and application locks with developer comments, supporting objects; 0.22.0: keyset paging, report PDFs and REST collections streamed from a cursor, database-account authentication; 0.21.0: HTTP-header authentication behind a reverse proxy; 0.20.0: a popup list of values with server-side search; 0.19.0: row-range pagination, maximum row counts and row limits, lazy loading and caching of regions, streamed CSV/Excel downloads; 0.18.0: calendar week/day/list views with drag and drop, bubble/gauge/funnel/radar charts and drill-down, smart filters, a region display selector and more facet types, computations, conditional branches, build options, menu buttons, REST data sources and web credentials, rich text/Markdown, rating, combobox, date range and QR code items; 0.17.0: an App Builder home, workspace dashboard and utilities like APEX's; 0.16.0: a Page Designer with drag-and-drop layout, a code editor with autocomplete, template components and plug-ins, parallel branches and versions of workflows, the `pgkiln` command line with one file per component; 0.15.0: drop and paste files, heat maps, filtering a report by the map area; 0.14.0: stacked, combo, scatter and pie charts, several files per upload item; 0.13.0: map and tree regions; 0.12.0: REST modules in the builder; 0.11.0: workflows and Progressive Web Apps; 0.10.0: LDAP, SAML, "Keep me signed in", document templates, JSON loading, approvals and the task list; pgkiln installs no application, HR is an example).
|
|
11
11
|
|
|
12
12
|
## At a glance
|
|
13
13
|
|
|
14
14
|
| Area | ✅ | 🟡 | ❌ | ➖ | In short |
|
|
15
15
|
|---|---:|---:|---:|---:|---|
|
|
16
|
-
| App Builder and development |
|
|
16
|
+
| App Builder and development | 22 | 0 | 0 | 0 | Page Designer with drag-and-drop and a code editor, wizards, search, where used, an Advisor, a CLI with one file per component, page locks and comments, supporting objects, working copies with a three-way merge, theme/library/boilerplate apps with subscriptions; App Builder AI (pages, SQL and table descriptions) |
|
|
17
17
|
| Regions | 23 | 0 | 0 | 0 | All everyday regions, a search region over search configurations and a URL region; twenty-two chart types with drill-down; calendars with week/day/list views and drag and drop; faceted search, smart filters and a region display selector; interactive reports with breaks, aggregates, highlights, compute, group by, pivot, chart view and saved reports; interactive grids with single row, group by and chart views; maps (with vector tiles) and trees; template components; row ranges, lazy loading and region caching for large tables |
|
|
18
18
|
| Items | 13 | 0 | 0 | 0 | All common items, file upload (several files per item), rich text and Markdown editors, star rating, combobox, date range, QR code, password reveal, display image and geocoded address |
|
|
19
19
|
| Logic and processing | 18 | 0 | 0 | 1 | User preferences and application settings; all dynamic action events and actions, Ajax callbacks and an error handling function; Core APEX model complete with computations, conditional branches, build options and menu buttons, download, chain and workflow processes; JavaScript from static application files in dynamic actions; region, item, dynamic action and process plug-ins |
|
|
@@ -24,7 +24,7 @@ Last reviewed: 2026-10-27 against **APEX 26.2** (sprint 135: full-text search co
|
|
|
24
24
|
| Workflow, automation and AI | 6 | 0 | 0 | 0 | Scheduled automations with several actions and runs from SQL, approvals, a task list and workflows with parallel branches, versions and invoke-API steps; AI with Claude or OpenAI: *Generate text with AI*, an assistant region with tools, natural-language report filters and blueprints |
|
|
25
25
|
| Administration | 14 | 0 | 0 | 0 | An APEX-like sign-in with a workspace and a Workspace home; a mail queue dashboard, a workspace's own mail service and network access list (26.1 / 26.2); a workspace's components exported and imported as one file; workspace message, environment banner and utilization; isolated workspaces with their own database logins and roles, and workspace administrators; application availability and Run only, automatic backups, user feedback; a developer toolbar with a session state viewer and debug per session; Top SQL per app; debug messages per request; an install/upgrade log |
|
|
26
26
|
| APEX 26.2 workspace (WS-1 … WS-13) | 13 | 0 | 0 | 1 | Workspace home, Data Reporter as a workspace tool, Team Development, AI Agents, AI interactive reports, Workflow 26.2, the mail queue, workspace mail and network access, the 26.1 component details, the App Builder list's details, the Pillar navigation appearances and data security per table (rows, columns and masked values), the App Gallery's single-topic sample apps, UX Pattern Catalog and Utility Apps; the builder in eleven languages (APEX's ten and Nederlands) |
|
|
27
|
-
| **Total** | **
|
|
27
|
+
| **Total** | **162** | **0** | **0** | **4** | 166 APEX features compared: 98% available, none missing, 4 deliberately not planned |
|
|
28
28
|
|
|
29
29
|
(Counts are of the rows in the tables below. A review on 2026-10-06 added 18 rows for APEX features that were
|
|
30
30
|
not compared before, one on 2026-10-12 added two more (property help, application availability), and one on
|
|
@@ -41,7 +41,7 @@ the 26.2 comparison.)
|
|
|
41
41
|
|---|---|---|
|
|
42
42
|
| App Builder: create, edit, delete, run apps | ✅ | Builder at `/builder` |
|
|
43
43
|
| Create application wizard | ✅ | Blank app with its own database role and schema, started from a **boilerplate application** if wanted; **from a file**: CSV/TSV/XLSX/JSON/XML, where an Excel workbook with several sheets (or JSON with several arrays) becomes several tables, with a preview to include or leave out each sheet, edit table/column names, types and primary keys, and **foreign keys proposed** from matching columns; **from pasted data** (CSV/TSV text); **from existing tables** (pick the tables and views of a schema). Each gives a report and form per table, navigation and an optional dashboard (a chart per table), plus an optional faceted search for a single table, all created in one transaction. (sprint 73) **One page like APEX's**: name, icon and description, appearance (theme style, side or top menu, accent), a **page type per table** (interactive report with form, faceted search, cards, calendar, master detail, interactive grid, report, none; large tables proposed as a grid), **features** (About page, access control roles, activity reporting, feedback, theme style selection, PWA, push), settings (alias, authentication, first user, language) and a boilerplate under Advanced; a progress message, then straight to the new application. (sprint 71) The generated pages read like APEX's: human labels (abbreviations, run-together words, column and table comments), plural page and menu names with singular form titles, foreign keys shown by the parent's name in reports, `bytea` columns as one file item with their name/mime/size/updated columns, number format masks, a pencil per report row, the Dashboard after Home with *(none)* and top-N charts, and a Home page with a hero and a card per page. (sprint 66) **From a blueprint** (26.1 blueprints): a reviewed JSON spec of tables, pages and sample data, or a blueprint made from an existing application (see [Blueprints](#workflow-automation-and-ai)) |
|
|
44
|
-
| Create page wizards | ✅ | Report and form,
|
|
44
|
+
| Create page wizards, Create a Page (Component, Feature), Create Page as Copy | ✅ | (sprint 137, AP-3) **Create page** is a grid of page types with small previews like APEX's: Blank page, Calendar, Cards, Chart, Comments, Content row, Dashboard, Data loading, Faceted search, Form, Interactive grid, Interactive report, Map, Master detail, Media list, Report and form, Search page, Smart filters, Timeline, Tree, Unified task list, Wizard, Workflow console and Create pages with AI; the table step only for the types on a table, with defaults from the catalog (columns, key, dates, positions, foreign keys; a tree's parent from a self-referencing foreign key; a wizard's steps with a progress list; a data load definition and its page), an optional modal form page and a navigation entry; also from SQL (`meta.generate_page`). **Feature** (also App home → Add feature page): Access control, Activity reporting, Configuration options (configurable build options as switches for administrators), E-mail reporting (a weekly activity report by mail), Feedback, About, Login page, Theme style selection, Push notifications; each lists what it adds, installs once and greys out ([chapter 3](guide/03-builder.md#add-feature)). **Copy**: a page of this or another application of the workspace under a new number and name, `P<n>_` items renamed, the shared components it uses mapped to the target's or copied ([chapter 3](guide/03-builder.md#create-page-as-copy)). No Classic Report type (the interactive report covers it), no side-by-side or drill-down master-detail
|
|
45
45
|
| Page Designer | ✅ | IDE-style window (dark or light): component tree, a layout canvas with drag and drop (with keyboard and button alternatives) and a gallery of regions, items and buttons, a filterable property editor; undo/redo; panes become tabs on phones. Settings forms for report, grid, chart, cards, calendar, faceted search, smart filters, display selector, map, tree and template component regions. A code editor for SQL, PL/pgSQL, JSON and HTML with highlighting and autocomplete of tables, columns and `:ITEM` binds (no extra libraries). Drag and drop needs a mouse; on touch screens the Arrange buttons move components. (sprint 77) The layout draws the page template's display positions (banner, breadcrumb bar, left/right column, body, footer) as drop zones and a region's button positions; the rendering tree groups by position and has a context menu (create in or below, Duplicate, Copy to other page, expand/collapse all, (sprint 90) Comment out with a COMMENTED_OUT build option, delete; no Create Sub Region: no nested regions); the property editor has Common / All, Go to group and a Template Options dialog; a page number in the toolbar. No nested regions (APEX's sub regions) |
|
|
46
46
|
| Shared components | ✅ | (sprint 74) A grid of ten groups with counts like APEX's, a searchable, sortable list per type with Create, and Settings-backed types linking to their Settings tab ([mapping below](#shared-components-apex-links-and-pgkiln)). Navigation menu, **lists** (static entries with nesting, badges, conditions, authorization and build options, or a query; for list regions, the navigation menu and the navigation bar), authorization schemes, build options, lists of values, application items and processes, access control, globalization, template components and plug-ins, web credentials, REST data sources, data load definitions, supporting objects |
|
|
47
47
|
| Export / import | ✅ | `meta.export_app()` / `meta.import_app()`: portable JSON, also in the builder (new applications; `pgkiln import --replace` and the MCP `import_app` update one in place, live for every user at the commit). (sprint 51) **Checked imports**: `pgkiln import --check` (`--dry-run`, `--force`), the MCP import (by default) and the builder's import run the Advisor inside the import's transaction (SQL planned as the application's role: missing tables, columns, functions, types, grants; references) and refuse on errors, so nothing changes; APEX doesn't check. The version an import replaces is [backed up](guide/03-builder.md#backups) first ([chapter 18](guide/18-cli.md#checking-before-an-import)) |
|
|
@@ -54,6 +54,7 @@ the 26.2 comparison.)
|
|
|
54
54
|
| Theme, library and boilerplate application types (26.1) | ✅ | An application type in Settings ([chapter 3](guide/03-builder.md#application-types-and-subscriptions)): a **theme** app offers its theme (colours, navigation, Theme Roller styles) and template components, a **library** app its lists of values, authorization schemes, build options, template components and lists; other apps **subscribe** (the component is copied), see whether they are in sync, **refresh** one or all, and the master **publishes** to its subscribers (locked apps skipped). A **boilerplate** app is a *Start from* choice in Create application. Subscriptions are not exported; no subscriptions to pages or plug-ins other than template components |
|
|
55
55
|
| Property help in the Page Designer, component reference | ✅ | Help text under most properties in the Page Designer (175 of 266 fields; the obvious ones such as *Title* and *Sequence* have none), and a guide section per region type, item type and button with the columns its SQL must return ([chapter 4](guide/04-pages-and-regions.md#region-types), [5](guide/05-items.md), [6](guide/06-processing.md#buttons)). (sprint 51) A region's *Attributes (JSON)* help shows its own type's keys with a link to its section of the guide. (sprint 59) The **Help pane** under the properties shows the focused property's help, the name it is stored under and the guide section of the component's type |
|
|
56
56
|
| Advisor | ✅ | Per app: every SQL fragment planned (EXPLAIN, as the app's role, rolled back) for syntax, unknown objects, types and grants; PL/pgSQL blocks compiled; references to missing pages, items, lists of values, schemes and layouts; PL/pgSQL functions with `plpgsql_check` when installed. Plus the security checklist |
|
|
57
|
+
| Application Utilities: dashboard, database object dependencies, change history, Upgrade Application, Attribute Dictionary, application and page checksums, icons | ✅ | (sprint 138, AP-5) An application's **Utilities** tab gathers the Advisor, Search, Debug, Activity, Backups, Working copies and Export with an application dashboard and recently updated pages; **Database object dependencies** (every SQL the Advisor plans, parsed as the app's role, with the components that use each object; missing objects and missing grants in red); **Change history** per component with who, when and a diff, for builder changes and every import `--replace` (`CHANGE_HISTORY_DAYS`); **Upgrade application** (date pickers for date columns, popup LOVs for large tables, a navigation appearance) with a preview; **UI defaults** per column (label, format mask, help, alignment, LOV) used by the page and application wizards, seeded from column comments; a SHA-256 **application checksum** with one per page, also in Export's `X-Pgkiln-Checksum` header; an **icon browser** ([chapter 3](guide/03-builder.md#utilities)) |
|
|
57
58
|
| Builder search, "where used" | ✅ | Search over every page and component (names, SQL, settings, help); "Used in" under items, pages, lists of values, schemes and report layouts. No search and replace |
|
|
58
59
|
| AI assistant, pages from natural language, describe tables for LLMs (26.1) | ✅ | **App Builder AI** (administrators choose the builder's AI service): SQL Workshop → AI writes SQL from a question (shown in an editor, never run automatically), explains a query or an error, and describes tables and columns for LLMs (notes, optionally `COMMENT ON`, with AI drafts from names, types and keys only); **Create pages with AI** turns a description into proposed pages that the developer edits and confirms ([chapter 3](guide/03-builder.md)). The model never sees table rows |
|
|
59
60
|
| Sample data source for development (26.1) | ✅ | SQL Workshop → **Sample Data** ([chapter 16](guide/16-files.md#sql-workshop--sample-data)): generators proposed per column from the catalog and column names (names, e-mail addresses, phones, companies, addresses, words and sentences, codes, number/date/time ranges, booleans, value lists from enums and CHECKs, sequences, foreign keys picking existing or newly inserted parent rows, values relative to another column, % nulls; identity/serial/generated columns skipped; unique and simple CHECK constraints respected), rows per table, a seed for repeatable data, preview (inserted and rolled back), insert in one transaction with parents first, download as SQL INSERTs or CSV, saved generator definitions |
|
|
@@ -81,11 +82,11 @@ the 26.2 comparison.)
|
|
|
81
82
|
| Region display selector, tabs | ✅ | Tabs or a select list; regions can share a tab, *Show all*, the choice remembered in the session, `#R<id>` links. Accessible tabs with JavaScript; without it every region shows with links to each |
|
|
82
83
|
| Tree | ✅ | `tree` region from id / parent id / label rows, with icons, links and the first levels open; works without JavaScript |
|
|
83
84
|
| Map region (26.1: vector tiles, bounding box) | ✅ | `map` region: several layers per map, each with its own query (markers, lines and areas from GeoJSON or a PostGIS geometry, heat maps), a legend that switches layers on and off and a colour per layer; marker clustering; popups with links. A report can be filtered by the visible area or by the distance from the map's centre on the server: with PostGIS (`ST_Intersects`/`ST_DWithin`, detected automatically) when installed, otherwise on latitude/longitude (bounding box, haversine). Configurable tile server. (0.31) **Large data sets**: a layer loads only the places in the visible area, again as the map moves (`visible_area`), or is served as **Mapbox Vector Tiles** (`tiles`, MVT 2.1, drawn on canvases with popups; readable by MapLibre, OpenLayers or QGIS), both filtered on the server like the report filter ([chapter 4](guide/04-pages-and-regions.md#map)) |
|
|
84
|
-
| Timeline, comments, media list, avatar template components (26.1: groups, Metric Card) | ✅ | Built in for every application: avatar (groups), badge, comments, media list, metric card and timeline, as regions (one or all rows, the group) and report column templates; an application's own copy replaces a built-in one ([chapter 4](guide/04-pages-and-regions.md#built-in-template-components)) |
|
|
85
|
+
| Timeline, comments, media list, avatar template components (26.1: groups, Metric Card) | ✅ | Built in for every application: avatar (groups), badge, comments, (sprint 137) content row, media list, metric card and timeline, as regions (one or all rows, the group) and report column templates; an application's own copy replaces a built-in one ([chapter 4](guide/04-pages-and-regions.md#built-in-template-components)) |
|
|
85
86
|
| Pagination of large tables (row ranges, maximum row count) | ✅ | Reports and grids page in the database; `"pagination": "range"` shows APEX's "row ranges X to Y" without a total (it reads one row more for *Next*); `max_rows` is a maximum row count (the total is counted over at most max+1 rows: "of more than N"; downloads are capped too); page numbers and sizes are clamped on the server. Cards (500), charts (1000), dynamic content (1000) and lists of values (5000) have configurable row limits. Keyset ("seek") paging on an indexed sort (`"keyset"`), with signed positions |
|
|
86
87
|
| Lazy loading of regions | ✅ | `"lazy": true` on report, chart, cards, dynamic, tree and template component regions: a placeholder, fetched after the page shows (page, condition and authorization re-checked); without JavaScript a link shows the region ([chapter 4](guide/04-pages-and-regions.md#large-tables)) |
|
|
87
88
|
| Region caching (per user, per session, for a duration) | ✅ | `"cache": {"scope": "user" \| "session" \| "all", "seconds": N}` keeps rendered regions in server memory, keyed by app, region, roles, language, the query string and the item values the region uses; a page submit empties it. CSRF tokens and per-user links are never shared. Per server process |
|
|
88
|
-
| Search configurations and the search region (22.2) | ✅ | (sprint 50) Shared Components → **Search configurations**: a table, a query (binds allowed) or a list, the searchable columns, and each result's title, subtitle, description, badge, icon and link. A **search** region searches the ones it names with one field (or a page item): every word in one of the columns, as the app's role with the text as a parameter; results grouped per configuration with the words marked; searches as you type, works without JavaScript; exported; checked by the Advisor ([chapter 4](guide/04-pages-and-regions.md#search-search-region)). (sprint 135) Search type **fulltext** for APEX's *Oracle Text*: a tsvector column or expression (or built from the searchable columns), a text search configuration per application language (`simple` as fallback), `websearch_to_tsquery` for the user's text (phrases, or, -word), the best match first (`ts_rank_cd`) and matched words highlighted (`ts_headline`, escaped); *Did you mean* with `pg_trgm`; SQL Workshop › Table Properties › *Add full-text search* (generated tsvector column and GIN index, previewed, recorded in the Change Log); report search boxes use a tsvector column too; the Advisor warns about a missing GIN index ([full-text search](guide/04-pages-and-regions.md#full-text-search)).
|
|
89
|
+
| Search configurations and the search region (22.2) | ✅ | (sprint 50) Shared Components → **Search configurations**: a table, a query (binds allowed) or a list, the searchable columns, and each result's title, subtitle, description, badge, icon and link. A **search** region searches the ones it names with one field (or a page item): every word in one of the columns, as the app's role with the text as a parameter; results grouped per configuration with the words marked; searches as you type, works without JavaScript; exported; checked by the Advisor ([chapter 4](guide/04-pages-and-regions.md#search-search-region)). (sprint 135) Search type **fulltext** for APEX's *Oracle Text*: a tsvector column or expression (or built from the searchable columns), a text search configuration per application language (`simple` as fallback), `websearch_to_tsquery` for the user's text (phrases, or, -word), the best match first (`ts_rank_cd`) and matched words highlighted (`ts_headline`, escaped); *Did you mean* with `pg_trgm`; SQL Workshop › Table Properties › *Add full-text search* (generated tsvector column and GIN index, previewed, recorded in the Change Log); report search boxes use a tsvector column too; the Advisor warns about a missing GIN index ([full-text search](guide/04-pages-and-regions.md#full-text-search)). (sprint 136) Search type **vector** for APEX's *Oracle Vector Search*: a vector provider embeds the search text, the nearest rows by a `vector(n)` column (cosine, L2 or inner product, a minimum similarity), and **hybrid**: full-text and vector rankings merged by reciprocal rank fusion; as the app's role, so RLS decides what is found; needs pgvector and says so without it; the Advisor checks the provider, the dimensions and the HNSW index ([vector search](guide/04-pages-and-regions.md#vector-search)). No REST data sources or APEX-application search as sources, no custom result templates |
|
|
89
90
|
| URL region | ✅ | (sprint 50) A **url** region frames another site's page (or one of this server) in a sandboxed iframe: the origin is written out (an item can never choose the host), `&ITEM.` values after it are URL-encoded, and the page's CSP gets `frame-src` for exactly the origins of its visible URL regions; height, sandbox flags and full screen in the attributes; an *Open in a new tab* link ([chapter 4](guide/04-pages-and-regions.md#url-url-region)) |
|
|
90
91
|
| Template components and template directives | ✅ | Shared Components → Template components: `#PLACEHOLDERS#` (always escaped), `{if}`, `{case}` and `{loop}` directives, custom attributes, a wrapper; as a region type and as report column templates, with a preview. Templates are checked against an allow-list (no scripts, styles, event handlers or `javascript:` links) ([chapter 4](guide/04-pages-and-regions.md#template-components)) |
|
|
91
92
|
|
|
@@ -213,7 +214,8 @@ the 26.2 comparison.)
|
|
|
213
214
|
| Approvals and task list | ✅ | Task definitions (approval / action, owner roles and users, business administrators, priority, due date, details page), `meta.create_task` from application SQL, a task list region (claim, approve/reject/complete with comment, release, delegate, cancel, history), completion SQL in the same transaction. (sprint 64) **Vacation rules** (a stand-in acts on a user's tasks while the rule is active, checked on every request) and **expiration policies** (expire, renew up to N times, escalate to a role once; a waiting workflow goes on with the outcome `expired`). (sprint 114) **custom outcomes** with labels and colours (Yes / No / Undecided), **task events** on complete, expire and a failed completion SQL (SQL, e-mail or start a workflow; reopen or keep the task) and **notifications** from e-mail templates on create, complete and expire ([chapter 6](guide/06-processing.md#custom-outcomes)) |
|
|
214
215
|
| Workflow (26.1: parallel flows, multi-tenancy) | ✅ | Workflow definitions of task, SQL, switch, wait, **invoke API** (a REST data source or URL through the invoke-API code, response values and the HTTP status into variables, retryable faults, no transaction open during the call) and end steps with variables, started from application SQL, run by the server (NOTIFY + polling) as the app's role; console region (terminate, retry a faulted step); diagram in the builder. **Parallel branches** (split, then a join that waits for all or for the first branch) and **versions** (development, active, inactive; running instances keep theirs) ([chapter 6](guide/06-processing.md#workflows)). (0.31) **Tenants**: `meta.set_tenant()` (APEX: `APEX_SESSION.SET_TENANT_ID`); workflows, their tasks, background chains, the task list, the console and every action follow the session's tenant ([chapter 6](guide/06-processing.md#tenants)). (sprint 114, 26.1 / 26.2) **Send E-Mail** steps (a template or subject and body), **draft** steps allowed only in development versions, branching on custom task outcomes, **migrating running instances** to a newer version (step mapping, preview, one transaction, a log; not yet for instances inside open parallel branches: [chapter 6](guide/06-processing.md#migrating-instances)) and the diagram as **SVG / PNG** |
|
|
215
216
|
| Automations (scheduled) | ✅ | Shared Components → Automations: cron schedules with time zones, once or per row of a query, **several ordered actions** with their own conditions, **error handling** (stop, skip the row and continue, or disable; row errors in the run history), roles, run history and Run now, **on-demand runs from SQL** with `meta.run_automation()` (like `APEX_AUTOMATION.EXECUTE`, synchronous in the caller's transaction), safe with several servers ([chapter 6](guide/06-processing.md#automations)) |
|
|
216
|
-
| AI assistant, natural-language reports (NL2IR), AI agents and tools (26.1) | ✅ | Region type **AI assistant**: a conversation per session, context queries (RAG over developer queries, run as the app's role, read-only), and **tools** the model may call: SQL with bound arguments checked against declared parameters (read-only unless marked as writing, row limit, timeout) and REST data sources, each optionally behind an authorization scheme. **AI Interactive Reports** (sprint 112; 26.1 / 26.2): an "Ask in your own words" box turns a question into the report's own settings (filters, highlights, search, sort, control break, totals, group by, pivot, chart and computed columns such as "bonus is 10% of salary"), never SQL, limited to its shown columns; each setting is a chip with Edit and Remove, plus Undo. Without an AI service a built-in phrase parser (English, Dutch, German) answers ([chapter 4](guide/04-pages-and-regions.md#ask-in-your-own-words-ai-interactive-reports)). (sprint 122) Conditions a facet can hold set the page's **faceted search and smart filters** facets (values, excluded values, custom ranges, stars), shown as chips; smart filters with `"ask": true` read a typed phrase and offer it as one suggestion. (sprint 111) **AI Agents** as a shared component (26.1 / 26.2): an AI service, system prompt, reasoning effort (low / medium / high, mapped per provider), approved tools, max steps and tokens and an authorization scheme; an assistant region names one. **AI Tools**: SQL (read-only transaction, the app role through RLS, timeout), PL/pgSQL function, REST data source, JavaScript action (a registered action or custom-event dynamic action), and **Navigate**: pgkiln builds the checksummed URL, only to pages the user may open. Every tool call is logged with its arguments (debug and Activity → AI usage). Providers add Gemini and OpenAI-compatible endpoints (Ollama, vLLM, Azure OpenAI). Answers are not streamed; no OCI provider. `pgvector` covers semantic search on the data side |
|
|
217
|
+
| AI assistant, natural-language reports (NL2IR), AI agents and tools (26.1) | ✅ | Region type **AI assistant**: a conversation per session, context queries (RAG over developer queries, run as the app's role, read-only), and **tools** the model may call: SQL with bound arguments checked against declared parameters (read-only unless marked as writing, row limit, timeout) and REST data sources, each optionally behind an authorization scheme. **AI Interactive Reports** (sprint 112; 26.1 / 26.2): an "Ask in your own words" box turns a question into the report's own settings (filters, highlights, search, sort, control break, totals, group by, pivot, chart and computed columns such as "bonus is 10% of salary"), never SQL, limited to its shown columns; each setting is a chip with Edit and Remove, plus Undo. Without an AI service a built-in phrase parser (English, Dutch, German) answers ([chapter 4](guide/04-pages-and-regions.md#ask-in-your-own-words-ai-interactive-reports)). (sprint 122) Conditions a facet can hold set the page's **faceted search and smart filters** facets (values, excluded values, custom ranges, stars), shown as chips; smart filters with `"ask": true` read a typed phrase and offer it as one suggestion. (sprint 111) **AI Agents** as a shared component (26.1 / 26.2): an AI service, system prompt, reasoning effort (low / medium / high, mapped per provider), approved tools, max steps and tokens and an authorization scheme; an assistant region names one. **AI Tools**: SQL (read-only transaction, the app role through RLS, timeout), PL/pgSQL function, REST data source, JavaScript action (a registered action or custom-event dynamic action), and **Navigate**: pgkiln builds the checksummed URL, only to pages the user may open. Every tool call is logged with its arguments (debug and Activity → AI usage). Providers add Gemini and OpenAI-compatible endpoints (Ollama, vLLM, Azure OpenAI). Answers are not streamed; no OCI provider. `pgvector` covers semantic search on the data side (sprint 136) A **Retrieve (RAG)** tool type: the model gives a text, the agent gets the best rows of a search configuration (vector or hybrid) as the app's role in a read-only transaction, logged like other tools |
|
|
218
|
+
| Vector providers, `APEX_AI.GET_VECTOR_EMBEDDINGS`, vector search (24.2) | ✅ | (sprint 136, AP-1) Shared Components → **Vector providers** (exported with the application): an AI service with an embedding model (OpenAI `text-embedding-3-*`, Gemini, any OpenAI-compatible endpoint such as Ollama; the key stays with the service) or a SQL / PL/pgSQL function returning `vector`, with its dimensions, checked on every embedding and against vector columns; **Test**. `meta.embed(text, provider)` for function providers in SQL (as the caller; AI services are called by the server only). Workspace utilities → Vector providers: pgvector detected, *Create extension vector* for administrators, the workspace's providers and vector columns. SQL Workshop › Table Properties › **Add vector column**: `vector(n)`, an HNSW index and a trigger that re-embeds changed rows, at once (function) or through a queue the server works in batches within the provider's requests per minute and the app's daily AI limits, logged under AI usage; **Backfill** with progress ([chapter 3](guide/03-builder.md#vector-providers)). No ONNX models in the database (use a function provider, e.g. pgml or pgai) |
|
|
217
219
|
| *Generate Text with AI* process, structured outputs (26.1) | ✅ | **AI services** (Workspace utilities, administrators): Claude through `@anthropic-ai/sdk` or OpenAI through `openai`, encrypted write-only keys (or `ANTHROPIC_API_KEY` / `OPENAI_API_KEY`), per-app access with daily request and token limits, a usage log. Page process `ai_generate` (text into an item, or structured output into several items with a schema built from the items or your own) and a dynamic action that runs it without a page submit; `meta.ai_generate` / `ai_result` / `ai_available` from SQL ([chapter 6](guide/06-processing.md)). Prompts, item values included, go to the chosen provider |
|
|
218
220
|
| Blueprints, spec-driven development (26.1) | ✅ | Create → **From a blueprint**: a JSON spec of tables (types, required, unique, allowed values, references), pages, navigation and sample data; optionally drafted by AI from a description; always reviewed (problems, SQL, pages, menu) before the application is created in one transaction; saved blueprints; (sprint 66) **a blueprint from an existing application** (its tables, pages, menu and optionally sample rows, with notes on what didn't carry over) |
|
|
219
221
|
|
|
@@ -281,7 +283,7 @@ row above where there is one.
|
|
|
281
283
|
| Automations / scheduler | built in, or `pg_cron` | [chapter 6](guide/06-processing.md#automations), [chapter 15](guide/15-extensions.md#tier-2-third-party-widely-available) |
|
|
282
284
|
| Calling REST APIs synchronously from SQL (`APEX_WEB_SERVICE`; the built-in `meta.web_request()` is queued) | `http`, `pg_net` | [chapter 15](guide/15-extensions.md#tier-3-situational) |
|
|
283
285
|
| Map data | PostGIS | [chapter 15](guide/15-extensions.md#tier-2-third-party-widely-available) |
|
|
284
|
-
| Semantic search / RAG | `pgvector` | [chapter 15](guide/15-extensions.md#tier-2-third-party-widely-available) |
|
|
286
|
+
| Semantic search / RAG | `pgvector` (sprint 136: vector providers, vector and hybrid search and Retrieve tools are built in on it) | [chapter 4](guide/04-pages-and-regions.md#vector-search), [chapter 15](guide/15-extensions.md#tier-2-third-party-widely-available) |
|
|
285
287
|
| Statement auditing | `pgaudit` | [chapter 15](guide/15-extensions.md#tier-2-third-party-widely-available) |
|
|
286
288
|
| Code checks (Advisor for PL/pgSQL functions) | `plpgsql_check` (used by the Advisor when installed) | [chapter 15](guide/15-extensions.md#tier-2-third-party-widely-available) |
|
|
287
289
|
| Pivot reports | `tablefunc` | [chapter 15](guide/15-extensions.md#tier-1-included-with-postgresql) |
|
package/docs/guide/03-builder.md
CHANGED
|
@@ -855,8 +855,8 @@ they are **not** run until you choose to.
|
|
|
855
855
|
|
|
856
856
|
(sprint 74) Above the pages: a **search** by page name or number (the rows filter while you type),
|
|
857
857
|
**Report** and **Icons** views, and **Create page** (the page wizards below). **Tasks** on the right: run the
|
|
858
|
-
application, create pages (also with AI),
|
|
859
|
-
objects, lock or delete the application.
|
|
858
|
+
application, create pages (also with AI), (sprint 137) **Add feature page** and **Create page as copy**, Shared
|
|
859
|
+
Components, page groups, export, backups, supporting objects, lock or delete the application.
|
|
860
860
|
|
|
861
861
|
The **default-password** warning shows on the App Builder home (and Developers) only; dismiss it with × until the
|
|
862
862
|
next sign-in. The avatar keeps a red dot until the password is changed.
|
|
@@ -867,9 +867,19 @@ authorization and protection. The tabs under its name lead to **Shared Component
|
|
|
867
867
|
|
|
868
868
|
### Create pages from a table (wizards)
|
|
869
869
|
|
|
870
|
-
|
|
870
|
+
(sprint 137; APEX: Create a Page) **Create page** opens a page with three tabs:
|
|
871
|
+
|
|
872
|
+
- **Component**: the page types as a grid of tiles, each with a small picture of the page (Blank page,
|
|
873
|
+
Calendar, Cards, Chart, Comments, Content row, Dashboard, Data loading, Faceted search, Form, Interactive grid,
|
|
874
|
+
Interactive report, Map, Master detail, Media list, Report and form, Search page, Smart filters, Timeline, Tree,
|
|
875
|
+
Unified task list, Wizard, Workflow console) and **Create pages with AI**. A type that works on a table asks
|
|
876
|
+
for the table first; the others go to their options at once.
|
|
877
|
+
- **Feature**: [features](#add-feature) to add to the application.
|
|
878
|
+
- **Copy**: [a page of this or another application](#create-page-as-copy) under a new number.
|
|
879
|
+
|
|
880
|
+
The wizards are plain forms (they work without JavaScript). Choose a
|
|
871
881
|
**page type** and a **table or view** (tables the app's database role can't read are marked) and
|
|
872
|
-
press **Next
|
|
882
|
+
press **Next** (the App home's *Create pages from a table* form still does the same in one step). The second step proposes everything from the database catalog: the columns, the
|
|
873
883
|
primary key, date and number columns, positions and foreign keys. Change what you like, choose the
|
|
874
884
|
page number, name and menu icon, and press **Create page**: the builder opens the new page in the
|
|
875
885
|
page designer. An error (a page number in use, a column that doesn't fit) shows on the second
|
|
@@ -886,6 +896,15 @@ step, which keeps the table and type.
|
|
|
886
896
|
| **Map** | A [map](04-pages-and-regions.md#map) region with popups and, if ticked, an interactive report of the same rows that the map filters (*Show this area in the list*) | Position: a PostGIS geometry or geography (markers, and lines and areas as shapes), a `point`, `lat`/`lng`-like number columns, or a *location* text column with `latitude,longitude` |
|
|
887
897
|
| **Faceted search** | An interactive report (9 columns wide) and a [facets](04-pages-and-regions.md#facets-faceted-search) panel (3 columns, collapsible) with a search field | Up to six facets: foreign keys (values of the parent's name, which the report shows instead of the key), booleans, text columns with few values, dates and numbers as ranges with *from*/*to* |
|
|
888
898
|
| **Master detail** | One page with a grid of the table and an editable grid of the selected row's details below it (the grids' [master-detail](04-pages-and-regions.md#grid-interactive-grid)): a hidden item for the selection, both grids with a grid DML process; new detail rows get the master's key | The detail table: a table with a foreign key to this table's primary key |
|
|
899
|
+
| **Interactive report** | (137) An [interactive report](04-pages-and-regions.md#report-interactive-report) of the table on a page of its own (parents' names next to foreign keys, labels and number formats), optionally with a modal form page | |
|
|
900
|
+
| **Smart filters** | (137) An interactive report with a [smart filters](04-pages-and-regions.md#smart_filters) search field above it | The faceted search's facets |
|
|
901
|
+
| **Tree** | (137) A [tree](04-pages-and-regions.md#tree) region: one node per row | Id: the primary key; parent: a foreign key to the table itself (`mgr` → `empno`); label: the name column |
|
|
902
|
+
| **Timeline**, **Media list**, **Content row**, **Comments** | (137) A region of the [built-in template component](04-pages-and-regions.md#built-in-template-components) `ut_timeline`, `ut_media_list`, `ut_content_row` or `ut_comments`, all rows in one list | Title: the name column; when / date: a date or timestamp column (newest first); text: a comment-, body- or description-like column; who: a user- or author-like column, else the first foreign key |
|
|
903
|
+
| **Data loading** | (137) A [data load definition](16-files.md#data-load-definitions) for the table (unless one of that name exists) and a page with a file item, **Load** and a `data_load` process | Mode *merge* for a table with a primary key, else *append* |
|
|
904
|
+
| **Wizard** | (137) One page per step (APEX: Wizard), each with a [wizard progress](04-pages-and-regions.md#list-lists) list, the step's fields, Cancel, Previous and Next; **Finish** on the last step adds the row (an `INSERT` of every step's items as the app's role). The items keep their values in the session while the user goes back and forth | Every column but the key and generated ones, shared out over two to five steps |
|
|
905
|
+
| **Search page** | (137) A [search region](04-pages-and-regions.md#search-search-region) over the application's search configurations you tick, and/or a new configuration on a table (its text columns searched, its name column as the title) | |
|
|
906
|
+
| **Dashboard** | (137) A chart per table you tick (at most six), chosen from the data like a [new application's dashboard](#what-the-generated-pages-look-like) | |
|
|
907
|
+
| **Unified task list**, **Workflow console** | (137) A [`tasks`](06-processing.md#approvals-and-the-task-list) region (my tasks, the ones I requested, or the ones I administer) or a [`workflows`](06-processing.md#workflows) region | |
|
|
889
908
|
|
|
890
909
|
Cards, Calendar, Map and Faceted search take an optional **Form page** number: it adds a modal
|
|
891
910
|
form page for a row, a link from each card, event, popup or report row, and a **Create** button
|
|
@@ -908,6 +927,41 @@ and **Create the ticked pages**. They are made with `meta.generate_page` and the
|
|
|
908
927
|
in one transaction (all or none); only page types of the list and tables the application can read
|
|
909
928
|
are accepted, whatever the form says.
|
|
910
929
|
|
|
930
|
+
### Add feature
|
|
931
|
+
|
|
932
|
+
(sprint 137; APEX: Create a Page → Feature, and App home → Tasks → Add Feature Page) **Create page → Feature**
|
|
933
|
+
(or **Add feature page** under Tasks) lists features to add to an existing application. Each one first shows
|
|
934
|
+
what it adds, and adds it only when you press its button; once installed it is greyed out and can't be added
|
|
935
|
+
twice (also when two developers press at the same moment).
|
|
936
|
+
|
|
937
|
+
| Feature | What it adds |
|
|
938
|
+
|---|---|
|
|
939
|
+
| Access control | Authorization schemes `CONTRIBUTOR` and `READER` (and `ADMIN` when missing) for the roles admin, contributor and reader |
|
|
940
|
+
| Activity reporting | Page 9010 *Activity* for administrators (authorization `ADMIN`): page views per day and the latest activity, from `meta.app_activity()`, and its navigation entry |
|
|
941
|
+
| Configuration options | Page 9020 *Configuration* for administrators: the [configurable build options](06-processing.md#build-options) as switches, and Save; you tick which build options are configurable |
|
|
942
|
+
| E-mail reporting | The application setting `EMAIL_REPORT_TO` and the automation `EMAIL_REPORTING`: every Monday at 07:00 UTC the [activity report by mail](06-processing.md#the-activity-report-by-mail) |
|
|
943
|
+
| Feedback | [Feedback](#feedback) from the header |
|
|
944
|
+
| About page | Page 9000 *About* in a Help menu of the navigation bar |
|
|
945
|
+
| Login page | An editable [login page](08-security.md#the-login-page) (page 9999, or the next free number); not offered without sign-in |
|
|
946
|
+
| Theme style selection | Users choose light or dark (Appearance in the user menu) |
|
|
947
|
+
| Push notifications | Install as an app and push notifications, with the application's key pair; needs `PGKILN_SECRET_KEY` |
|
|
948
|
+
|
|
949
|
+
A page number in use by another page blocks the feature that needs it (it says so).
|
|
950
|
+
|
|
951
|
+
### Create page as copy
|
|
952
|
+
|
|
953
|
+
(sprint 137; APEX: Create Page as Copy) **Create page → Copy** copies a page of this application or of another
|
|
954
|
+
application of the same workspace: choose the application, then the page, then the new page number and name.
|
|
955
|
+
Everything on the page comes along (regions, items, buttons, dynamic actions, validations, processes,
|
|
956
|
+
computations and branches); items named `P20_…` are renamed to the new number, also where the page's SQL, links
|
|
957
|
+
and conditions refer to them, and links to the page itself point to the copy.
|
|
958
|
+
|
|
959
|
+
The page's **shared components** (lists of values, authorization schemes, build options, lists, template
|
|
960
|
+
components, search configurations, data load definitions) are listed: for each, use one of this application's
|
|
961
|
+
(the one with the same name is chosen when there is one), or, from another application, **copy it** along. The
|
|
962
|
+
page's SQL runs as this application's database role afterwards: grant it what the other application's role
|
|
963
|
+
could read. From SQL: `meta.copy_page(from_app, page, to_app, new_page, name, map)`.
|
|
964
|
+
|
|
911
965
|
### Create a blank page
|
|
912
966
|
|
|
913
967
|
Give a page number, name, mode (normal or modal dialog) and breadcrumb parent, then add
|
|
@@ -1526,6 +1580,55 @@ Database code (views, functions, RLS policies) isn't part of the application, so
|
|
|
1526
1580
|
|
|
1527
1581
|
Findings are errors, warnings or notes, each linking to the component.
|
|
1528
1582
|
|
|
1583
|
+
## Utilities
|
|
1584
|
+
|
|
1585
|
+
**Utilities** (the last tab of an application, APEX: Application Utilities) gathers what an
|
|
1586
|
+
application's upkeep needs: tiles for the Advisor, Search, Debug messages, Activity, Backups,
|
|
1587
|
+
Working copies and Export, and the tools below. It also shows an **application dashboard** (pages,
|
|
1588
|
+
regions, items, processes, lists of values, changes in the last 7 days), the **recently updated
|
|
1589
|
+
pages** (from the change history) and the checksums.
|
|
1590
|
+
|
|
1591
|
+
- **Database object dependencies** (`/builder/apps/:id/utilities/dependencies`): every piece of SQL
|
|
1592
|
+
the Advisor plans, plus the tables of form and grid regions, is parsed as the application's
|
|
1593
|
+
database role into a temporary SQL-standard function (`CREATE FUNCTION … BEGIN ATOMIC`, rolled
|
|
1594
|
+
back, nothing runs), and PostgreSQL's own dependency records name the tables, views, sequences
|
|
1595
|
+
and functions it uses, resolved with the role's search path. Each object links to the Object
|
|
1596
|
+
Browser and lists the components (and pages) that use it. An object that doesn't exist (a dropped
|
|
1597
|
+
view, say `sales.orders_v`) is marked **Missing** in red, and so is a privilege the role lacks
|
|
1598
|
+
(**No grant**: SELECT for queries, INSERT / UPDATE / DELETE on the target of a DML statement,
|
|
1599
|
+
USAGE on sequences, EXECUTE on functions, USAGE on the schema). PL/pgSQL blocks and statements
|
|
1600
|
+
other than SELECT, INSERT, UPDATE, DELETE and MERGE are listed as not scanned.
|
|
1601
|
+
- **Change history** (`/builder/apps/:id/utilities/history`): after every change made in the
|
|
1602
|
+
builder, and inside every import `--replace` (restoring a backup, merging a working copy, the
|
|
1603
|
+
command line and the MCP server), the application's export is compared with the one after its
|
|
1604
|
+
previous change, component by component as working copies compare (a page's settings, a region
|
|
1605
|
+
with its SQL, an item, a list of values, …). Each added, changed or deleted component is kept with
|
|
1606
|
+
who (the developer; none for the command line), when and its files before and after; **Show**
|
|
1607
|
+
gives the differences as a diff. Filter by developer, date range, page and component name.
|
|
1608
|
+
History is kept `CHANGE_HISTORY_DAYS` days (365 by default; 0 keeps everything) and starts with
|
|
1609
|
+
the first change after the upgrade to the version that introduced it.
|
|
1610
|
+
- **Upgrade application** (`/builder/apps/:id/utilities/upgrade`): components made before pgkiln
|
|
1611
|
+
gained a better default, each with the reason, a **Preview** of the change and **Upgrade** (or
|
|
1612
|
+
*Upgrade all* of a kind): an application without a navigation appearance (→ Pillar Light), a text
|
|
1613
|
+
item of a form on a `date` or `timestamp` column (→ a date or date-time item with the date
|
|
1614
|
+
picker), a select list whose list of values reads a table of more than 1,000 rows (→ a popup list
|
|
1615
|
+
of values, searched and paged on the server). Upgrades are recorded in the change history.
|
|
1616
|
+
- **UI defaults** (`/builder/ui-defaults`, also under Workspace utilities; APEX: Attribute
|
|
1617
|
+
Dictionary): per table column a label, format mask, help text, alignment and list of values
|
|
1618
|
+
(`LOV:NAME`, `STATIC:…` or a query). The page wizards and the Create Application wizard use the
|
|
1619
|
+
label for report headings and form items, and a form item a wizard makes also gets the column's
|
|
1620
|
+
format mask, help and list of values. **Seed from comments** fills the columns without a UI
|
|
1621
|
+
default from their `COMMENT ON`: a short comment (60 characters at most) becomes the label, a
|
|
1622
|
+
longer one the help. UI defaults belong to the installation (not exported with an application)
|
|
1623
|
+
and apply to pages generated after the change. The tables offered are those the workspace's SQL
|
|
1624
|
+
Workshop can see.
|
|
1625
|
+
- **Application checksum**: a SHA-256 of the application's definition (its export in the text
|
|
1626
|
+
layout, without the alias), with a checksum per page: the same definition gives the same checksum
|
|
1627
|
+
on any installation, so two installations, or an application and its working copy, compare at a
|
|
1628
|
+
glance. Export sends it too, in the `X-Pgkiln-Checksum` response header.
|
|
1629
|
+
- **Icons** (`/builder/icons`): the icon picker's set, pgkiln's own icons and the Lucide icons by
|
|
1630
|
+
search, with the names to use in icon fields.
|
|
1631
|
+
|
|
1529
1632
|
## Activity monitor
|
|
1530
1633
|
|
|
1531
1634
|
Per application: page views, distinct users and average page time over the last 24 hours;
|
|
@@ -1721,6 +1824,7 @@ scheme (only users who pass it are offered the tool) and one of these types:
|
|
|
1721
1824
|
| **REST data source** | a REST data source of the application; the parameters become its parameters | as in [assistant regions](04-pages-and-regions.md#ai_assistant-ai-assistant) |
|
|
1722
1825
|
| **JavaScript** | nothing on the server: after the answer the browser calls the function registered with `pgkiln.actions.register(action)` (with `{value: arguments}`) and the dynamic actions of the **custom event** of that name (the arguments as JSON) | once, right after the answer; the arguments are escaped data in the page |
|
|
1723
1826
|
| **Navigate** | the model picks one of the tool's **pages**, a link text and item values of that page; pgkiln builds the URL with the item values' **checksum** (bound to application, page and user) and shows the link under the answer | only pages the user may open are offered (the page's authorization scheme and sign-in); only items of that page; the model's values are never substituted (`&ITEM.`); nothing opens the link by itself |
|
|
1827
|
+
| **Retrieve (RAG)** | (sprint 136) the model gives a text (`QUERY`); pgkiln runs the tool's **search configuration** (best: [vector or hybrid](04-pages-and-regions.md#vector-search)) and returns the best rows' title, text (the description column) and score | as the application's role in a **read-only transaction** with the time limit, so row level security decides which rows the model sees; at most *maximum rows* rows (default 5); no parameters of its own |
|
|
1724
1828
|
|
|
1725
1829
|
The model's arguments are checked against the parameters before a tool runs; they are bind values
|
|
1726
1830
|
(escaped literals), never SQL text, and can't replace the server's own names (`:APP_USER`, `:APP_ID`, …).
|
|
@@ -1743,6 +1847,70 @@ earns most?* and it calls the SQL tool `top_earners` as the signed-in user's rol
|
|
|
1743
1847
|
*Open BLAKE's record*, a link to the employee form (page 3) with a valid checksum, only to users who
|
|
1744
1848
|
may open that page.
|
|
1745
1849
|
|
|
1850
|
+
## Vector providers
|
|
1851
|
+
|
|
1852
|
+
(sprint 136; APEX: Vector Providers) A **vector provider** turns a text into an **embedding**: a list of numbers
|
|
1853
|
+
(the *dimensions*) whose distance says how close two texts are in meaning. Vector columns, search configurations
|
|
1854
|
+
of type [vector or hybrid](04-pages-and-regions.md#vector-search) and the [Retrieve tools](#ai-agents) of AI
|
|
1855
|
+
agents use one. Providers are part of the application: Shared Components → Generative AI → **Vector providers**
|
|
1856
|
+
(kept in `meta.app.vector_providers`, exported with the application). A provider has:
|
|
1857
|
+
|
|
1858
|
+
- a **name** (static ID, upper case, e.g. `DOC_EMBEDDINGS`) and a description;
|
|
1859
|
+
- a **type**:
|
|
1860
|
+
- *AI service with an embedding model*: an [AI service](#ai-services) the application may use (OpenAI,
|
|
1861
|
+
Gemini, or OpenAI-compatible such as Ollama; Claude has no embeddings API) and the model, exactly as the
|
|
1862
|
+
provider names it: `text-embedding-3-small` (1536 dimensions; OpenAI shortens them to the provider's
|
|
1863
|
+
dimensions), `text-embedding-3-large` (3072), `gemini-embedding-001`, `nomic-embed-text` (768),
|
|
1864
|
+
`mxbai-embed-large` (1024) … The key, base URL and daily limits are the service's: **the key stays with the
|
|
1865
|
+
AI service** (encrypted, write-only, never exported); the export carries only the service's name. Texts per
|
|
1866
|
+
request and requests per minute limit the background embedding of queued rows;
|
|
1867
|
+
- *SQL or PL/pgSQL function*: `schema.name` of a function `(text)` returning `vector`, `real[]` or
|
|
1868
|
+
`float8[]`, e.g. a model inside the database (`pgml.embed`, `ai.openai_embed` of pgai) or your own;
|
|
1869
|
+
- the **dimensions**: every embedding is checked against them, and a vector column is `vector(n)` with this *n*
|
|
1870
|
+
(an HNSW index takes up to 2,000).
|
|
1871
|
+
|
|
1872
|
+
**Test** embeds a sample text and shows how many dimensions came back. A provider's page lists the search
|
|
1873
|
+
configurations and vector columns that use it. In SQL, `meta.embed(text, 'DOC_EMBEDDINGS')` returns a function
|
|
1874
|
+
provider's embedding as `real[]` (cast it: `meta.embed(…)::vector`), running the function **as the role of the
|
|
1875
|
+
query** (its grants apply: grant execute on it to the application's role). An AI service is called by the pgkiln
|
|
1876
|
+
server, never from SQL: `meta.embed` says so for such a provider; use it through a search configuration, a
|
|
1877
|
+
Retrieve tool or a vector column's queue.
|
|
1878
|
+
|
|
1879
|
+
**pgvector.** Everything with vectors needs the [pgvector](https://github.com/pgvector/pgvector) extension in
|
|
1880
|
+
the database (pgkiln itself installs without it). Workspace utilities → **Vector providers** says whether it is
|
|
1881
|
+
installed; when the database server has the package, administrators get **Create extension vector** (pgvector is
|
|
1882
|
+
not a trusted extension: the owner connection must be a superuser; otherwise a superuser runs
|
|
1883
|
+
`create extension vector;`). Without the package: install it (`apt install postgresql-17-pgvector`, the
|
|
1884
|
+
`pgvector/pgvector:pg17` Docker image, or the managed database's *vector* extension). The same page lists every
|
|
1885
|
+
provider of the workspace's applications and the vector columns they keep current.
|
|
1886
|
+
|
|
1887
|
+
**Add vector column** (SQL Workshop › Table Properties, or a table's ⋯ menu) needs a table with a one-column
|
|
1888
|
+
primary key: pick a provider of the workspace's applications, the **source columns** (their text, one per line,
|
|
1889
|
+
is embedded), the distance (`cosine`, `l2`, `inner_product`) and the column's and index's names. **Preview DDL**
|
|
1890
|
+
shows what Apply runs in one transaction (recorded in the Change Log); **Open in the worksheet** puts it there:
|
|
1891
|
+
|
|
1892
|
+
```sql
|
|
1893
|
+
alter table sales.doc add column embedding public.vector(1536);
|
|
1894
|
+
create index doc_embedding_idx on sales.doc using hnsw (embedding vector_cosine_ops);
|
|
1895
|
+
create trigger embedding_embed after insert or update of title, body on sales.doc
|
|
1896
|
+
for each row execute function meta.embedding_enqueue('12', 'DOC_EMBEDDINGS', 'embedding', 'id', 'title', 'body');
|
|
1897
|
+
```
|
|
1898
|
+
|
|
1899
|
+
**Keeping it current.** With an AI service the trigger (`meta.embedding_enqueue`) puts the changed row's key in a
|
|
1900
|
+
queue (`meta.embedding_queue`; a change to other columns, or to the same text, queues nothing). The server embeds
|
|
1901
|
+
queued rows in batches of the provider's *texts per request*, at most its *requests per minute*, within the
|
|
1902
|
+
application's daily AI limits, logged under AI usage (source *embedding*), and writes the vectors with the
|
|
1903
|
+
workspace's developer connection (the one the SQL Workshop uses). A failing batch keeps its message and is tried
|
|
1904
|
+
again after 1, 2, 4 … minutes (six times). A function provider can instead set the embedding **in the trigger**
|
|
1905
|
+
(`meta.embedding_set`, before insert or update, as the role that writes the row). After Apply the rows already
|
|
1906
|
+
there are queued; the page shows each vector column with a progress bar (rows embedded, queued, failing, the last
|
|
1907
|
+
message) and **Backfill**, which queues the rows without an embedding (or, ticked, all rows: after changing the
|
|
1908
|
+
provider's model). The server polls the queue every `EMBEDDING_INTERVAL_S` seconds (default 5);
|
|
1909
|
+
`EMBEDDINGS=off` keeps a server from embedding (another one does it).
|
|
1910
|
+
|
|
1911
|
+
**What goes to the provider**: the source columns' text of every row, and every search text. Choose a provider
|
|
1912
|
+
your organisation allows for that data; a function provider keeps it in the database.
|
|
1913
|
+
|
|
1746
1914
|
## App Builder AI
|
|
1747
1915
|
|
|
1748
1916
|
The App Builder uses one AI service (APEX: AI Assistant in App Builder and SQL Workshop). An
|
|
@@ -1860,6 +2028,10 @@ the SQL Workshop's connection may use. Without JavaScript the header's field ope
|
|
|
1860
2028
|
**Apply** runs both in one transaction and records them in the **Change Log**; **Open in the worksheet** puts them
|
|
1861
2029
|
there. The column keeps itself up to date; adding it rewrites the table. Name the column in a search
|
|
1862
2030
|
configuration of search type *fulltext*, or in a report's `fulltext` attribute.
|
|
2031
|
+
(sprint 136) **Add vector column…** (Table Properties, or the ⋯ menu): an embedding column `vector(n)` from a
|
|
2032
|
+
[vector provider](#vector-providers), an HNSW index for the distance and a trigger that re-embeds a row when its
|
|
2033
|
+
source columns change (at once with a function provider, else through the server's queue); the page shows each
|
|
2034
|
+
vector column's progress and **Backfill**. Without pgvector it says what is missing.
|
|
1863
2035
|
- (sprint 119) **Security** (the Object Browser's *Security* button on a table, *Security…* in its ⋯ menu): the
|
|
1864
2036
|
table's row level security policies, a matrix of database roles × columns with *read* and *update*, and masked
|
|
1865
2037
|
columns per application role in a masking view; Preview SQL, Apply (one transaction, recorded in the Change Log)
|