pgkiln 0.50.0 → 0.52.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.
Files changed (104) hide show
  1. package/SECURITY.md +7 -0
  2. package/db/migrations/119_workspace_home.sql +30 -0
  3. package/db/migrations/120_datasets.sql +87 -0
  4. package/db/migrations/121_ai_agents.sql +94 -0
  5. package/db/migrations/122_team_development.sql +186 -0
  6. package/db/migrations/123_workflow_outcomes.sql +407 -0
  7. package/db/migrations/124_component_details.sql +51 -0
  8. package/docs/apex-feature-parity.md +15 -12
  9. package/docs/guide/01-installation.md +9 -3
  10. package/docs/guide/03-builder.md +211 -11
  11. package/docs/guide/04-pages-and-regions.md +96 -22
  12. package/docs/guide/05-items.md +7 -1
  13. package/docs/guide/06-processing.md +123 -8
  14. package/docs/guide/07-dynamic-actions.md +34 -0
  15. package/docs/guide/09-reference.md +2 -1
  16. package/docs/guide/11-from-apex.md +2 -1
  17. package/docs/guide/12-development.md +70 -11
  18. package/docs/guide/20-ai-agents.md +4 -2
  19. package/examples/hr/README.md +2 -0
  20. package/examples/hr/hr_63_datasets.sql +29 -0
  21. package/examples/hr/hr_64_ai_agent.sql +97 -0
  22. package/examples/hr/hr_65_ask_reports.sql +21 -0
  23. package/examples/hr/hr_66_team_development.sql +58 -0
  24. package/examples/hr/hr_67_workflow_outcomes.sql +113 -0
  25. package/examples/hr/hr_68_component_details.sql +96 -0
  26. package/package.json +1 -1
  27. package/public/app.css +46 -0
  28. package/public/app.js +134 -20
  29. package/public/builder.css +116 -0
  30. package/public/builder.js +47 -0
  31. package/src/ai/chat.ts +18 -18
  32. package/src/ai/service.ts +35 -11
  33. package/src/ai/types.ts +7 -2
  34. package/src/app.ts +11 -1
  35. package/src/builder/advisor.ts +6 -3
  36. package/src/builder/ai-agents.ts +372 -0
  37. package/src/builder/ai-builder.ts +3 -3
  38. package/src/builder/ai.ts +13 -9
  39. package/src/builder/assistant.ts +22 -7
  40. package/src/builder/components.ts +38 -9
  41. package/src/builder/datasets.ts +472 -0
  42. package/src/builder/designer.ts +8 -3
  43. package/src/builder/feedback.ts +6 -1
  44. package/src/builder/home.ts +12 -7
  45. package/src/builder/instance.ts +2 -0
  46. package/src/builder/locks.ts +7 -1
  47. package/src/builder/region-help.ts +2 -2
  48. package/src/builder/reporter.ts +52 -3
  49. package/src/builder/routes.ts +7 -4
  50. package/src/builder/shared.ts +1 -1
  51. package/src/builder/subscriptions.ts +1 -0
  52. package/src/builder/team.ts +991 -0
  53. package/src/builder/ui.ts +8 -5
  54. package/src/builder/workflow-migrate.ts +210 -0
  55. package/src/builder/workflows.ts +29 -6
  56. package/src/builder/workspace-home.ts +285 -0
  57. package/src/builder/workspace-transfer.ts +1 -1
  58. package/src/builder/workspaces.ts +7 -4
  59. package/src/cli/replace.ts +7 -1
  60. package/src/datasets.ts +367 -0
  61. package/src/i18n/ar.ts +33 -0
  62. package/src/i18n/cs.ts +33 -0
  63. package/src/i18n/da.ts +33 -0
  64. package/src/i18n/de.ts +33 -0
  65. package/src/i18n/el.ts +33 -0
  66. package/src/i18n/es.ts +33 -0
  67. package/src/i18n/fi.ts +33 -0
  68. package/src/i18n/fr.ts +33 -0
  69. package/src/i18n/he.ts +33 -0
  70. package/src/i18n/it.ts +33 -0
  71. package/src/i18n/ja.ts +33 -0
  72. package/src/i18n/ko.ts +33 -0
  73. package/src/i18n/nb.ts +33 -0
  74. package/src/i18n/pl.ts +33 -0
  75. package/src/i18n/pt.ts +33 -0
  76. package/src/i18n/ru.ts +33 -0
  77. package/src/i18n/sv.ts +33 -0
  78. package/src/i18n/tr.ts +33 -0
  79. package/src/i18n/uk.ts +33 -0
  80. package/src/i18n/zh.ts +33 -0
  81. package/src/i18n.ts +66 -0
  82. package/src/instance.ts +3 -0
  83. package/src/metadata.ts +9 -3
  84. package/src/release-check.ts +139 -0
  85. package/src/reporting-app.ts +101 -0
  86. package/src/runtime/ai-agents.ts +365 -0
  87. package/src/runtime/ai-filter.ts +385 -107
  88. package/src/runtime/assistant.ts +64 -11
  89. package/src/runtime/context.ts +2 -0
  90. package/src/runtime/data-reporter.ts +199 -32
  91. package/src/runtime/ir-phrases.ts +812 -0
  92. package/src/runtime/ir-plan.ts +449 -0
  93. package/src/runtime/items.ts +1 -1
  94. package/src/runtime/regions.ts +6 -2
  95. package/src/runtime/render.ts +1 -1
  96. package/src/runtime/report.ts +1 -1
  97. package/src/runtime/tasks.ts +63 -12
  98. package/src/session.ts +2 -0
  99. package/src/subscriptions.ts +2 -1
  100. package/src/task-events.ts +232 -0
  101. package/src/team-samples.ts +74 -0
  102. package/src/team.ts +342 -0
  103. package/src/workflow.ts +135 -18
  104. package/src/workspace-export.ts +39 -4
@@ -7,23 +7,23 @@ 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-18 (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-10-19 (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 | 20 | 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) |
16
+ | App Builder and development | 21 | 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
- | Logic and processing | 17 | 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 |
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 |
20
20
  | Security | 22 | 0 | 0 | 0 | An editable login page and Forgot password; a session timeout warning; On par or stricter (CSP without `unsafe-inline`); OIDC, SAML and LDAP; header authentication behind a proxy; database accounts; custom authentication |
21
21
  | User interface | 12 | 0 | 0 | 0 | Region templates incl. hero, inline dialog and drawer, wizard and carousel; Universal Theme-like and responsive; a Theme Roller with style variants and conditional, dynamic styles; about 1,700 icons with Font APEX-like modifiers |
22
22
  | Globalization | 6 | 0 | 0 | 0 | One translated app like 26.1 with dynamic translations of table values; number format masks and automatic time zone; twenty-two built-in languages |
23
23
  | Data and integration | 13 | 0 | 0 | 2 | REST source catalogs from OpenAPI documents; Generate DDL and schema comparison; `meta.data_export` and data export downloads (CSV, JSON, XML, HTML, Excel, PDF); e-mail through SMTP (password or OAuth2), Microsoft Graph, Amazon SES and HTTP APIs; REST APIs via PostgREST, REST data sources that write back and synchronise, web credentials with OAuth2 grants, CSV/XLSX/JSON/XML loading with saved definitions and unloading, SQL scripts and Quick SQL, report PDFs and document templates |
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
- | Administration | 11 | 0 | 0 | 0 | An APEX-like sign-in with a workspace; 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
- | **Total** | **143** | **0** | **0** | **3** | 146 APEX features compared: 98% available, none partial or missing |
25
+ | Administration | 12 | 0 | 0 | 0 | An APEX-like sign-in with a workspace and a Workspace home; 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
+ | **Total** | **146** | **0** | **0** | **3** | 149 APEX features compared: 98% available, none partial or missing |
27
27
 
28
28
  (Counts are of the rows in the tables below. A review on 2026-10-06 added 18 rows for APEX features that were
29
29
  not compared before, one on 2026-10-12 added two more (property help, application availability), and one on
@@ -43,6 +43,7 @@ two, REST source catalogs and the workspace export, with their features.)
43
43
  | 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)) |
44
44
  | APEXlang: human-readable, diffable app files; static IDs (26.1) | ✅ | `pgkiln export --format dir`: one JSON file per component with sorted keys, SQL and HTML in sibling files, references by static id instead of database ids; `pgkiln import --replace` updates an app in place, `pgkiln diff` compares ([chapter 18](guide/18-cli.md)). (0.31) **`--format text`**: the same files as YAML (a strict subset any YAML tool reads) with the SQL and templates inline, read back losslessly ([text files](guide/18-cli.md#text-files-apexlang)); regions have a stored **Static ID** (exported as their key, rendered as `data-static-id`), other components are named by their stored names. The syntax is YAML rather than APEXlang's own, so APEXlang files don't import |
45
45
  | Working copies, merge, team development | ✅ | **Working copies** of an application ([chapter 3](guide/03-builder.md#working-copies)): a second app on the same schema and data, compared three ways per component (settings, each shared component, page, region, item, …) with the main app as it was when copied; changes on one side merge, conflicts are chosen per component with a line diff; merge into the main app or refresh the copy, keeping users, sessions, saved reports, secrets and automation switches; locks respected. Conflicts are resolved per component, not per property |
46
+ | Team Development: issues, labels, milestones, templates, feedback | ✅ | (sprint 113) Builder → **Team Development** ([chapter 3](guide/03-builder.md#team-development)): issues per workspace with labels in groups, milestones, assignees, application and page links, Markdown comments with in-app @mentions and a history; a filtered list with saved views and a board by label group or milestone (no JavaScript needed); a set-up wizard installs sample labels, templates, canned responses and milestones. Users' feedback and developer comments become issues; open issues show in the Page Designer, on App Home and on the Workspace home; issues travel in the workspace export. Not included: e-mail notifications, GitHub sync |
46
47
  | Application lock (26.1), page locks, comments | ✅ | Page and application locks, enforced on the server for every builder change; the owner or an administrator unlocks, and an administrator breaking a lock is logged. Developer comments per page and per app ([chapter 3](guide/03-builder.md)) |
47
48
  | Static application files | ✅ | Shared Components → **Static application files** ([chapter 3](guide/03-builder.md#static-application-files)): JavaScript, CSS, JSON, images and fonts uploaded or written in the builder, served at `/a/<alias>/static/<name>` with long caching per version, loaded by every page or by one page (APEX's *JavaScript/CSS File URLs*), exported with the application (as files in a directory export). No HTML; the CSP stays `script-src 'self'` |
48
49
  | Supporting objects (install scripts) | ✅ | Install, upgrade and deinstall scripts travel with the export (JSON and directory formats), never run on import; reviewed and run from the builder as the app's role, in one transaction, with a result per statement ([chapter 3](guide/03-builder.md#supporting-objects)) |
@@ -91,7 +92,7 @@ two, REST source catalogs and the workspace export, with their features.)
91
92
  | Text field, textarea, number, date picker, password, hidden, display only | ✅ | Native inputs, with the right phone keyboard (`inputmode`) |
92
93
  | Select list, radio group, checkbox, switch | ✅ | |
93
94
  | Checkbox group, shuttle / multi-select | ✅ | Colon-separated values, as in APEX |
94
- | Popup LOV | ✅ | `popup_lov`: a dialog with server-side search (paged, at most 100 rows a page) of the item's own shared, static or SQL list of values, extra display columns, return vs display value; the posted value is checked against the list; a select list without JavaScript ([chapter 5](guide/05-items.md)) |
95
+ | Popup LOV | ✅ | `popup_lov`: a dialog with server-side search (loaded page after page as the dialog scrolls, at most 100 rows a request; ‹ / More without IntersectionObserver) of the item's own shared, static or SQL list of values, extra display columns, return vs display value; the posted value is checked against the list; a select list without JavaScript ([chapter 5](guide/05-items.md)) |
95
96
  | Cascading, shared and static lists of values | ✅ | `cascade_parents`, `LOV:NAME`, `STATIC:` |
96
97
  | E-mail, phone, URL, colour picker | ✅ | Typed inputs |
97
98
  | Read-only condition, required, help text, default | ✅ | |
@@ -120,7 +121,8 @@ two, REST source catalogs and the workspace export, with their features.)
120
121
  | Error handling function | ✅ | (sprint 52) `schema.function(jsonb) returns jsonb` (Settings → Errors and sessions): every message users see (raised, constraint, unexpected with its reference) can be rewritten, as the app's role with a time limit ([chapter 6](guide/06-processing.md#error-handling)) |
121
122
  | User preferences, application settings (`APEX_UTIL.SET_PREFERENCE`, `APEX_APP_SETTING`) | ✅ | (sprint 53) `meta.get/set/remove_preference`, and items with `{"persist": "user"}` keep their value per user across sessions; application settings with valid values and *required*, `meta.get/set_app_setting`, exported with the application and kept on upgrade |
122
123
  | APEX PL/SQL APIs | ✅ | `meta.app_user()`, `meta.has_role()`, `meta.v()`, `meta.page_url()`, `meta.message()`, `meta.html_escape()`, password functions, `meta.debug()`; **`meta.web_request()` / `meta.web_request_source()` + `meta.web_response()`** (APEX_WEB_SERVICE: queued and made by the server, right after the page process that queued it or by the scheduler after commit, through the allow-list/SSRF checks and the app's web credentials; responses kept 24 h) and **`meta.parse_data()` / `meta.parse_data_columns()`** (APEX_DATA_PARSER for CSV/TSV and JSON in SQL, same names and types as the data loader) ([chapter 9](guide/09-reference.md)). (070) **XML and Excel** in `meta.parse_data` (as the data loader reads them; Excel files that pgkiln received: uploads and web responses), **APEX_ZIP** (`meta.zip_add`/`zip_finish`/`zip_agg` build zips in SQL, `meta.zip_entries`/`zip_entry` read them), **BOOLEAN** state (`meta.v_boolean`), and a mapping from APEX_JSON to PostgreSQL's JSON functions ([chapter 9](guide/09-reference.md#zip-files-in-sql)). A synchronous HTTP call inside one statement needs the `http` extension ([chapter 15](guide/15-extensions.md)); `meta.web_request` is queued by design |
123
- | Declarative menu buttons, button badges (26.1) | ✅ | Menu buttons with links and submit requests (a hidden button can't be reached through a menu), works without JavaScript; badges as text with `&ITEM.` or from SQL ([chapter 6](guide/06-processing.md#menu-buttons-and-badges)) |
124
+ | Declarative menu buttons, button badges (26.1) | ✅ | Menu buttons with links, submit requests and (sprint 115) dynamic actions (event *Menu entry chosen*, `menu_entry`) (a hidden button can't be reached through a menu), works without JavaScript except action entries; badges as text with `&ITEM.` or from SQL ([chapter 6](guide/06-processing.md#menu-buttons-and-badges)) |
125
+ | Wait Popup (26.1) | ✅ | (sprint 115) `wait_popup` / `remove_wait_popup` dynamic actions: a modal dialog with a status message (aria-busy, Escape-proof), shown until removed or the next page; `pgkiln.waitPopup()` in JavaScript ([chapter 7](guide/07-dynamic-actions.md#wait-popup)) |
124
126
  | Plug-ins | ✅ | **Region, item, dynamic action and process plug-ins** with their own code ([chapter 4](guide/04-pages-and-regions.md#plug-ins-with-their-own-code)): one `pgkiln-plugin/2` file with custom attributes, JavaScript and CSS (static application files, registered with `pgkiln.plugins.register`; the CSP stays strict), a template component for regions, a PL/pgSQL function for processes and install SQL that a developer reviews and runs; Shared Components → Plug-ins, `pgkiln plugin build|install`, four examples. Template component plug-ins (`pgkiln-plugin/1`) as before. Authentication and authorization plug-ins: custom authentication and SQL authorization schemes cover them |
125
127
  | Build options | ✅ | Include / exclude (and `!NAME` for the reverse) on pages, regions, items, buttons, dynamic actions, validations, processes, computations, branches, navigation entries and application processes; fail closed; *Used in*, Advisor and export ([chapter 6](guide/06-processing.md#build-options)) |
126
128
  | Collections (`APEX_COLLECTION`) | ➖ | Temporary or unlogged tables, or `jsonb` in session state |
@@ -194,7 +196,7 @@ two, REST source catalogs and the workspace export, with their features.)
194
196
  | Printing, document generator (PDF) | ✅ | **Document templates**: a query (with JSON columns for lines) fills an HTML template with Mustache-style tags, drawn as PDF with a report layout; buttons and links download them. (sprint 82) **Report queries**: a named query as PDF, Excel, CSV, JSON, XML or HTML. Report PDF with **report layouts** and a print stylesheet on every page. No Word/Excel templates or DOCX/XLSX output |
195
197
  | `APEX_DATA_EXPORT` (a query to CSV, XLSX, PDF, HTML or JSON from PL/SQL) | ✅ | (sprint 53) `meta.data_export(query, format, options)` returns CSV, JSON, XML or HTML as `bytea` with the caller's privileges; the download process's `{"export": …}` sends a query's rows as CSV, JSON, XML, HTML, Excel or PDF |
196
198
  | SQL Workshop utilities: schema comparison, generate DDL | ✅ | (sprint 56) SQL Workshop → **DDL**: a schema's objects (types, sequences, tables, functions, views, constraints, indexes, triggers, RLS and policies, comments, grants) from the catalog, in an order that runs, unqualified so it also creates them in another schema. **Compare**: two schemas by their DDL (only in one, different, with a diff) and a change script that makes the target like the source (tables column by column; drops commented out for review). Also `pgkiln ddl`, `pgkiln compare` and the MCP tools `generate_ddl`, `compare_schemas` ([chapter 3](guide/03-builder.md#sql-workshop)). Two schemas of the same database only (APEX: also within one workspace) |
197
- | Data Reporter: self-service reports for business users (26.1) | ✅ | A **Data Reporter** region ([chapter 4](guide/04-pages-and-regions.md#data_reporter-data-reporter)): the developer offers tables and views with chosen columns, labels and format masks; signed-in users pick columns, filter, group with totals (count, sum, average, minimum, maximum), sort and chart, and save reports privately or shared with the app's users. Runs as the app's role (grants and RLS apply); works without JavaScript and fits phones. (sprint 68) A **welcome page** like 26.1's: a greeting (the developer's own, or pgkiln's), the sources as cards that start a report, the user's reports latest first, shared ones, and a search. One source per report (offer a view to combine tables); no downloads from a reporter yet |
199
+ | Data Reporter: self-service reports for business users (26.1) | ✅ | A **Data Reporter** region ([chapter 4](guide/04-pages-and-regions.md#data_reporter-data-reporter)): the developer offers tables and views with chosen columns, labels and format masks; signed-in users pick columns, filter, group with totals (count, sum, average, minimum, maximum), sort and chart, and save reports privately or shared with the app's users. Runs as the app's role (grants and RLS apply); works without JavaScript and fits phones. (sprint 68) A **welcome page** like 26.1's: a greeting (the developer's own, or pgkiln's), the sources as cards that start a report, the user's reports latest first, shared ones, and a search. One source per report (offer a view to combine tables); no downloads from a reporter yet (sprint 110) **A workspace tool too**: App Builder → **Data Reporter** ([chapter 3](guide/03-builder.md#data-reporter-datasets-and-reporting-applications)) keeps **datasets** (tables and views of one schema with joins proposed from foreign keys, offered columns with labels, masks and descriptions, a row filter; files and the workspace export) and makes a **reporting application** on them in two clicks: viewers open published reports by a stable URL and pin them, editors build and publish, administrators moderate; every report runs as the application's SELECT-only role through RLS. |
198
200
  | REST Source Catalogs (Workspace Utilities) | ✅ | (sprint 67) Workspace utilities → **REST Source Catalogs**: a workspace's web services with a base URL and services, from an **OpenAPI 3 / Swagger 2.0** document (file, pasted or read from a URL on the allow-list), a catalog file or by hand: parameters (under the service's own names), row selector, typed columns and write-back operations from the response schemas and collection/item paths, with notes on what can't be used. An application's *REST data sources → From a REST source catalog* makes a data source from a service, with its own web credential ([chapter 19](guide/19-rest-data-sources.md#rest-source-catalogs)). **Missing:** YAML documents (convert to JSON), APEX's built-in catalogs (e.g. Oracle Fusion) |
199
201
  | JSON sources, duality views (24.2) | ➖ | PostgreSQL `jsonb` works in any SQL region, form or grid source |
200
202
  | Remote servers / database links | ➖ | `postgres_fdw` or `dblink` |
@@ -204,10 +206,10 @@ two, REST source catalogs and the workspace export, with their features.)
204
206
 
205
207
  | APEX | pgkiln | Notes |
206
208
  |---|---|---|
207
- | 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`). **Missing:** built-in e-mail notifications (send them with `meta.send_mail` from the completion SQL or an automation) |
208
- | 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)). No *Send E-Mail* activity: send mail with `meta.send_mail` from an SQL step |
209
+ | 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)) |
210
+ | 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** |
209
211
  | 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)) |
210
- | 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. **Natural-language report filters**: an "Ask in your own words" box turns a question into the report's normal filters, search and sort, limited to its visible columns ([chapter 4](guide/04-pages-and-regions.md)). Agents are defined per region (not as shared components); answers are not streamed. `pgvector` covers semantic search on the data side |
212
+ | 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)). Not yet: phrases mapped to faceted search and smart filter values. (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 |
211
213
  | *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 |
212
214
  | 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) |
213
215
 
@@ -216,6 +218,7 @@ two, REST source catalogs and the workspace export, with their features.)
216
218
  | APEX | pgkiln | Notes |
217
219
  |---|---|---|
218
220
  | Developer accounts, workspace sign-in | ✅ | (sprint 61) The builder's sign-in page like APEX's: workspace (optional; it becomes the current one, a wrong one answers like a wrong password), username, password with a Show button, *Remember workspace and username*, a link to Administration. (sprint 68) **Find my workspace**: developers' e-mail addresses, and a mail with their workspaces through the builder's mail service (the same answer for every address, limited per address and IP). **Missing:** the sign-in page's language links (the builder is in English only) |
221
+ | Workspace home (tool cards, top apps and users, summary, workspace and system message) | ✅ | (sprint 109) `/builder/home` opens after sign-in ([chapter 3](guide/03-builder.md#workspace-home)): App Builder, SQL Workshop, Data Reporter and App Gallery cards; the workspace message edited in place; a Summary of applications, tables, developers and reporting applications; top applications, users and developers over an hour, a day or a week; a system message with the server's version and, with the optional release check (`PGKILN_RELEASE_CHECK`, off by default), *pgkiln X is available*. The App Builder moved to `/builder/apps`; `/builder` opens either, per workspace. |
219
222
  | Workspace message, environment banner, workspace utilization, preferences and extension links (Manage Service) | ✅ | (sprint 61) An **Administration** menu in the icon rail; administrators and workspace administrators set a **workspace message** (on the App Builder home) and an **environment banner** (a coloured label on every builder page of the workspace), and see **workspace utilization** (applications, pages, page views, users, static files, schema storage) ([chapter 3](guide/03-builder.md#workspace-message-and-environment-banner)). (sprint 62) **Workspace preferences**: the SQL Workshop and the applications' RESTful services (REST modules) on or off per workspace; **extension links** in an Extensions menu of the rail ([chapter 3](guide/03-builder.md#workspace-preferences)). **Missing:** the account login controls of APEX's preferences (pgkiln's password policy and sign-in throttling are installation-wide) |
220
223
  | Instance administration, install/upgrade logs (26.1) | ✅ | Versioned migrations (`npm run db:migrate`), every run logged; Workspace utilities → **Installation** (administrators): server version, install and upgrade runs with errors, applied migrations, and warnings for migrations the database misses or the server doesn't know ([chapter 3](guide/03-builder.md)). Workspace utilities → **Instance settings**: session length and sign-in throttling (stored in the database, over the environment variables) and an overview of the server's configuration without secrets; a server whose database lacks migrations says so (503) or applies them (`MIGRATE_ON_START`). Other settings stay environment variables |
221
224
  | Debug messages | ✅ | Debug levels 1–9 per app; `meta.debug(level, text)` and `meta.debug_enabled(level)` from application SQL (APEX_DEBUG); timed entries per request (page steps, regions, processes, branches, errors, SQL notices); Activity → **Debug messages** viewer per page view with filters and the slowest step highlighted; retention 1–90 days; password item values are never recorded ([chapter 6](guide/06-processing.md)). (sprint 50) Debug for **one session** from the developer toolbar, the application staying out of debug. **Missing:** debug entries for background jobs and REST requests |
@@ -332,7 +335,7 @@ Sources: [APEX 26.1 new features](https://docs.oracle.com/en/database/oracle/ape
332
335
  | Workflows, Task Definitions, Automations | The same names |
333
336
  | Text Messages, Translate, Dynamic Translations, Globalization Attributes | Translations and Text Messages, Dynamic Translations, Settings → Globalization |
334
337
  | Map Backgrounds | ➖ Not planned per application: the installation's map tile server (`MAP_TILE_URL`) is every map's background |
335
- | AI Attributes, AI Services, AI Agents | AI Services; AI agents ➖ not planned |
338
+ | AI Attributes, AI Services, AI Agents | AI Services; AI Agents and AI Tools (sprint 111) |
336
339
 
337
340
  ## Database Actions (SQL Developer Web) and the SQL Workshop
338
341
 
@@ -182,6 +182,8 @@ which is read at startup; real environment variables take precedence.
182
182
  | `PDF_FONT`, `PDF_FONT_BOLD` | *(none)* | TrueType fonts for report PDFs, for text beyond Western European (e.g. `DejaVuSans.ttf`) |
183
183
  | `ANTHROPIC_API_KEY` | *(none)* | Default API key of [AI services](03-builder.md#ai-services) with the provider Claude that have no key of their own |
184
184
  | `OPENAI_API_KEY` | *(none)* | Default API key of AI services with the provider OpenAI that have no key of their own |
185
+ | `GEMINI_API_KEY` | *(none)* | (sprint 111) Default API key of AI services with the provider Gemini that have no key of their own |
186
+ | `OPENAI_COMPATIBLE_API_KEY` | *(none)* | (sprint 111) Default API key of OpenAI-compatible AI services (Ollama, vLLM, Azure OpenAI) that have no key of their own; without either, no key is sent (`none`) |
185
187
  | `PGKILN_SECRET_KEY` | *(none)* | Encrypts the secrets of web credentials and the API keys of AI services; at least 32 characters (e.g. `openssl rand -base64 32`). Keep it outside the database; changing it means entering the secrets again ([chapter 19](19-rest-data-sources.md)) |
186
188
  | `PGKILN_REST_ALLOWED_HOSTS` | *(none: no outgoing calls)* | Hosts REST data sources and `invoke_api` may call: `api.example.com`, `*.example.com`, `host:8443`, `*` (any public host) ([chapter 19](19-rest-data-sources.md#server-configuration-and-the-allow-list)) |
187
189
  | `PGKILN_REST_PRIVATE_HOSTS` | *(none)* | Hosts that may resolve to private, loopback or link-local addresses (also allows them) |
@@ -191,6 +193,8 @@ which is read at startup; real environment variables take precedence.
191
193
  | `PGKILN_REST_MAX_BYTES` | `5000000` | Largest web service response read (also after decompression) |
192
194
  | `MIGRATE_ON_START` | `false` | `true` applies missing migrations when the server starts. Without it, a server whose database lacks migrations answers every request with 503 and names the missing files until they are applied (`npm run db:migrate` or `pgkiln migrate`; no restart needed) |
193
195
  | `LOG_LEVEL` | `info` | `fatal`, `error`, `warn`, `info`, `debug`, `trace` |
196
+ | `PGKILN_RELEASE_CHECK` | `off` | `on`: the server asks GitHub once a day for a newer pgkiln release and the [Workspace home](03-builder.md#the-release-check) announces it. Administrators can also set it in the builder (Instance settings → *New versions*), which wins over the variable. Keep it off where the server may not reach the internet |
197
+ | `PGKILN_RELEASE_URL` | GitHub's releases API | For tests and mirrors only: the address of a JSON document like GitHub's `releases/latest` |
194
198
 
195
199
  ## npm scripts
196
200
 
@@ -262,9 +266,11 @@ stops the container at once with a message saying so.
262
266
  | `PGKILN_IMAGE` | `pgkiln/pgkiln:latest` | The image to run, e.g. a fixed version (`pgkiln/pgkiln:0.31.0`) or `ghcr.io/pgkiln/pgkiln` |
263
267
 
264
268
  **Upgrading:** with the published image: `docker compose pull`, then `docker compose up -d` (with a
265
- fixed version in `PGKILN_IMAGE`, change it first). Built from a checkout: `git pull`, then
266
- `docker compose up -d --build`. The new container migrates the database
267
- before it starts serving. Back up first (`docker compose exec db pg_dump -U pgkiln pgkiln > backup.sql`).
269
+ fixed version in `PGKILN_IMAGE`, change it first); `up -d` replaces the container when the image changed, so
270
+ `--force-recreate` isn't needed. Built from a checkout: `git pull`, then `docker compose up -d --build`. The new
271
+ container migrates the database before it starts serving. A `compose.yaml` from pgkiln 0.51.0 or older has
272
+ `pull_policy: missing` under `pgkiln`, which makes `docker compose pull` skip an image that is already present:
273
+ delete that line (or take the current `deploy/compose.yaml`) before the first upgrade this way. Back up first (`docker compose exec db pg_dump -U pgkiln pgkiln > backup.sql`).
268
274
  Keep `PGKILN_SECRET_KEY`: without it, stored secrets (web credentials, AI keys, push keys) can't be decrypted.
269
275
 
270
276
  ## Upgrading
@@ -6,7 +6,7 @@ The builder lives at `/builder`. Everything it does is also possible in SQL (see
6
6
  ## Signing in and developer accounts
7
7
 
8
8
  Sign in with a developer account. The first one is `admin` / `admin`, and a red banner reminds you
9
- to change it.
9
+ to change it. After signing in the builder opens the [Workspace home](#workspace-home) (`/builder/home`).
10
10
 
11
11
  The sign-in page (`/builder/login`) is laid out like APEX's: **Workspace** (optional), **Username** and
12
12
  **Password** (with a *Show* button). A workspace you name must be one of yours (administrators: any); it becomes the
@@ -75,7 +75,8 @@ its developers must not reach other teams' applications or data.
75
75
 
76
76
  Administrators and the workspace's administrators set them on the workspace's page (*Manage service*, or the
77
77
  Administration menu → *Workspace message and environment banner*; APEX: Define Workspace Message, Define Environment
78
- Banner): a **message** (plain text, up to 2000 characters) shown to the workspace's developers on the App Builder home,
78
+ Banner): a **message** (plain text, up to 2000 characters) shown to the workspace's developers on the
79
+ [Workspace home](#workspace-home) (where they can also edit it in place) and the App Builder home,
79
80
  and an **environment banner**: a label of up to 40 characters in one of eight colours, shown at the top of every
80
81
  builder page while the workspace is current.
81
82
 
@@ -95,6 +96,11 @@ Administrators and the workspace's administrators set them on the workspace's pa
95
96
 
96
97
  Both are on by default (migration 093) and are not exported.
97
98
 
99
+ - **Builder links open** (sprint 109, migration 119): what an address of just `/builder` (a bookmark from before the
100
+ Workspace home) opens in this workspace: the **App Builder** (the default: it is also at `/builder/apps`) or the
101
+ **Workspace home** (a redirect). Signing in always opens the Workspace home. It travels in a
102
+ [workspace export](#export-and-import)'s settings.
103
+
98
104
  ### Extension links
99
105
 
100
106
  Links to the other tools a workspace's developers use (monitoring, a wiki, a ticket system; APEX: Manage Extension
@@ -151,6 +157,8 @@ applications' files. Choose what goes in:
151
157
  | Extension links | Label, URL, description, order |
152
158
  | REST source catalogs | Every [catalog](19-rest-data-sources.md#rest-source-catalogs) with its services |
153
159
  | SQL scripts, blueprints, data generators | The SQL Workshop's saved work |
160
+ | Data Reporter datasets | Every [dataset](#data-reporter-datasets-and-reporting-applications) (sprint 110) |
161
+ | Team Development | [Label groups, labels, milestones, templates and issues](#team-development) with their comments and history; an issue's application by alias (sprint 113) |
154
162
 
155
163
  Never in the file: the workspace's name, its [isolation](#isolated-workspaces) and database roles, passwords and
156
164
  secrets, script runs and other history. **Applications are exported on their own** (an application's *Export*).
@@ -213,7 +221,8 @@ longer sign in. Delete a workspace only when it is shared and empty; its logins
213
221
 
214
222
  Every builder page has the same frame, modelled on an IDE:
215
223
 
216
- - **The icon rail** on the left: App Builder, SQL Workshop, [App Gallery](#app-gallery), **Search** (on the
224
+ - **The icon rail** on the left: Home (the [Workspace home](#workspace-home); the logo leads there too), App Builder,
225
+ SQL Workshop, [App Gallery](#app-gallery), [Data Reporter](#data-reporter-datasets-and-reporting-applications), **Search** (on the
217
226
  pages of an application); at the bottom the **Administration** menu (Workspace utilities; for administrators of the
218
227
  current workspace *Manage service*: [workspace message and environment banner](#workspace-message-and-environment-banner),
219
228
  [workspace utilization](#workspace-utilization) and the workspace's page; Manage users and groups, Developers,
@@ -247,9 +256,44 @@ application of a workspace you are not a member of) shows a **Page not found** p
247
256
  theme with a link to the App Builder home; a server error shows **Something went wrong** (the error
248
257
  is in the server log, not on the page). Scripts get the plain answers they always got.
249
258
 
259
+ ## Workspace home
260
+
261
+ (sprint 109; APEX: the workspace home page) The page the builder opens after signing in, `/builder/home`, above the
262
+ App Builder and the SQL Workshop. Everything on it is of the current [workspace](#workspaces), and it works without
263
+ JavaScript. The [default-password banner](#signing-in-and-developer-accounts) stays on top until the password is changed.
264
+
265
+ - **Tool cards**: App Builder (`/builder/apps`), SQL Workshop (not when the workspace's preferences turn it off),
266
+ **Data Reporter** (when the server has the Data Reporter tool at `/builder/reporter`) and the [App Gallery](#app-gallery).
267
+ - **Workspace message**: the [workspace message](#workspace-message-and-environment-banner), plain text. The
268
+ workspace's administrators (and the installation's) edit it in place with **Edit message**; empty removes it.
269
+ - **Summary**: the number of applications (opens the App Builder), tables in the schemas the workspace's database
270
+ roles may use (opens the Object Browser), developers (opens Developers) and reporting applications (applications
271
+ made by [Data Reporter](#data-reporter-datasets-and-reporting-applications) → *Create reporting application*; opens
272
+ the Data Reporter).
273
+ - **Activity**: **Top applications** (page views and users), **Top users** and **Top developers** (page views by the
274
+ workspace's developers and the installation's administrators in its applications) over **1 hour**, **1 day** (the
275
+ default) or **1 week**. The timeframe is remembered for each developer (`meta.developer.home_timeframe`).
276
+ - **System message**: the pgkiln version the server runs and, when the [release check](#the-release-check) is on and
277
+ a newer release is out, **pgkiln X is available** with a link to its release notes and how to upgrade (back up,
278
+ install the new version, `pgkiln migrate`, restart).
279
+ - **A side column**: About, **Team Development** ([open issues](#team-development), those assigned to you, unseen
280
+ mentions of you, or *Set up Team Development* before it is set up), **Learn more** (this guide, the [tutorial](10-tutorial.md),
281
+ [Coming from APEX](11-from-apex.md), the changelog and the discussions on GitHub) and Resources.
282
+
283
+ ### The release check
284
+
285
+ Off by default. When it is on, the server asks GitHub's releases API (`api.github.com`) for the latest pgkiln release,
286
+ at most once a day per server process (an hour after a failure), with a 5-second timeout and a 1 MB limit; nothing
287
+ about the installation is sent. Pages never wait for it: they show what was fetched last and refresh it in the
288
+ background. Administrators turn it on or off on the Workspace home (**Check for new versions**, **Check now**,
289
+ **Turn off**) or on Workspace utilities → **Instance settings** → *New versions* (*On*, *Off*, or *As the environment
290
+ says*: the variable `PGKILN_RELEASE_CHECK`, [chapter 1](01-installation.md#configuration-reference)). Leave it off on a server
291
+ that may not reach the internet. Under the test runner the server never asks GitHub.
292
+
250
293
  ## App Builder home
251
294
 
252
- The home page is laid out like APEX's App Builder:
295
+ The App Builder's home page, `/builder/apps` (`/builder` shows it too, unless the workspace's
296
+ [preferences](#workspace-preferences) send `/builder` to the Workspace home), is laid out like APEX's App Builder:
253
297
 
254
298
  - **Four tiles**: **Create** and **Import** (each on its own page), the workspace **Dashboard**
255
299
  (applications, pages, active accounts; page views, users, failed sign-ins and errors of the last
@@ -292,6 +336,49 @@ The **App Gallery** (the cube in the icon rail, `/builder/gallery`; APEX: App Ga
292
336
 
293
337
  The list is `examples/gallery/gallery.json`; add your own starters there as blueprint files.
294
338
 
339
+ ## Data Reporter: datasets and reporting applications
340
+
341
+ **Data Reporter** in the icon rail (`/builder/reporter`, sprint 110; APEX 26.1: Data Reporter as a workspace tool)
342
+ gives business users reports on the workspace's data without a developer writing a page per question. Every
343
+ developer of the workspace manages it; the page lists the workspace's **datasets** and its **reporting
344
+ applications** (with their users and published reports).
345
+
346
+ A **dataset** (`meta.dataset`, per workspace) is a trusted view of the data: tables and views of one schema, joined,
347
+ the columns users may see, and a row filter.
348
+
349
+ - **New dataset**: choose a schema (those your [SQL Workshop](#sql-workshop) connection may use; never pgkiln's own
350
+ or the system's), tick tables and views (the first is the main one) and give it a name (lower case, it can't
351
+ change) and a label. **Joins are proposed from foreign keys** in either direction (a left join on the key's
352
+ columns); every column is offered, labelled from its name, numbers with a number mask.
353
+ - **The dataset's page**: its label and description; the tables with their joins (to an earlier table, left or
354
+ inner, *on* `column = its column`; add a table, remove one); the **columns** (offer or not, a name reports use, a
355
+ label, a [format mask](14-globalization.md) and a description users see in the report editor); up to five
356
+ **row filter** conditions (column, operator, value) that every report on it gets; the **query** it builds, and a
357
+ **preview** of ten rows (read only, through your SQL Workshop connection). The dataset is checked against the
358
+ database when it is saved: tables, views and columns must exist; the page says what doesn't match (any more).
359
+ - **Download** one dataset or **Export all** as a file (`*.dataset.json`, format `pgkiln-dataset/1`); **Import**
360
+ reads such a file (or pasted text) in one transaction: each dataset is checked against this installation's
361
+ database, and one with the same name is kept unless you choose *Replace*. Datasets also travel in the
362
+ [workspace export](#export-and-import); they are not part of an application's export.
363
+
364
+ **Create reporting application** (on a dataset's row or page: the form is filled in, so *Create* is the second
365
+ click) makes an application of type *Reporting* on one or more datasets: page 1 is a
366
+ [Data Reporter](04-pages-and-regions.md#data_reporter-data-reporter) region offering the datasets, users sign in with
367
+ their accounts of the [user directory](#users-the-user-directory), and the first administrator is the account you
368
+ name (yours by default). Its database role `app_<alias>` may only **read** (SELECT) the datasets' tables and views,
369
+ so every report runs through those grants and [row level security](08-security.md) (a view with
370
+ `security_invoker` needs grants on its own tables too: grant them to the role yourself). Give accounts access and
371
+ roles under the application's *Users and roles*:
372
+
373
+ | Role | May |
374
+ |---|---|
375
+ | viewer (or no role) | Open published reports (by their stable URL too), pin them |
376
+ | editor | Also build reports, save them, publish and unpublish their own |
377
+ | administrator | Also unpublish and delete anyone's reports |
378
+
379
+ The application is an ordinary pgkiln application otherwise: change its pages, theme or sign-in in the builder as
380
+ you like. `meta.reporting_app_count(workspace_id)` counts a workspace's reporting applications.
381
+
295
382
  ### Creating an application
296
383
 
297
384
  **Create** (a tile, or `/builder/create`) is one page, like APEX's Create Application wizard. Links at the top
@@ -668,6 +755,10 @@ author or an administrator deletes it. The page list counts each page's comments
668
755
  another number keeps its lock and comments. Locks and comments belong to this installation and
669
756
  are not exported.
670
757
 
758
+ **Make an issue** under a comment turns it into a [Team Development](#team-development) issue about the same page;
759
+ the comment then links to its issue. A page with open issues shows them above the designer's tabs (*1 open issue:
760
+ …*, with *New issue* for that page), and the application's page list tags such pages (*2 issues*).
761
+
671
762
  ### Arranging the layout
672
763
 
673
764
  Regions are placed in sequence order; a region's *column span* (1–12) sets its width, and a
@@ -755,8 +846,8 @@ out, other keys are kept, columns the query no longer returns stay listed so you
755
846
  | `smart_filters` | The same per-column facets, the suggestions per facet and the search field's placeholder |
756
847
  | `display_selector` | Tabs or a select list, "Show all", remember the choice; per other region of the page: in a tab and the tab name (saved in that region's settings) |
757
848
  | `ai_assistant` | The AI service (those the application may use), system prompt, welcome text, placeholder, error message, tool rounds per question, questions per conversation, public or not, and the context queries and tools as JSON (checked when saving: query shapes, parameter types, REST data sources and authorization schemes that exist) ([AI assistant](04-pages-and-regions.md#ai_assistant-ai-assistant)) |
758
- | `report` (also) | *Ask in your own words (AI)*: the AI service and placeholder of the [natural-language filters](04-pages-and-regions.md#natural-language-filters-ask-in-your-own-words) |
759
- | `data_reporter` | Data sources (a table or view each: static id, label, description, offered columns with labels and format masks), who may share reports, rows per page ([Data Reporter](04-pages-and-regions.md#data_reporter-data-reporter)) |
849
+ | `report` (also) | *Ask in your own words (AI)*: off, the built-in phrases or an AI service, and the placeholder of [Ask in your own words](04-pages-and-regions.md#ask-in-your-own-words-ai-interactive-reports) |
850
+ | `data_reporter` | Data sources (a table or view each: static id, label, description, offered columns with labels and format masks; or (sprint 110) a dataset of the workspace), who may share, build and moderate reports, publishing, rows per page ([Data Reporter](04-pages-and-regions.md#data_reporter-data-reporter)) |
760
851
  | `form_designer` | Who may design forms (an authorization scheme), data sources (a table or view each: static id, label, description, key column, may add / change / delete rows, offered columns with labels and lists of values), rows per page ([Form Designer](04-pages-and-regions.md#form_designer-form-designer)) |
761
852
 
762
853
  Links, lists of values and the facets' report are checked when saving: a form can only point to
@@ -873,6 +964,48 @@ user, page, rating and browser), set its status (*Open*, *In progress*, *Done*,
873
964
  an answer the user sees. Answering is allowed while the application is locked or Run only. The
874
965
  setting travels with the export; the feedback itself belongs to the installation.
875
966
 
967
+ **Make an issue** turns an entry into a [Team Development](#team-development) issue of the application's workspace
968
+ (title from its first line, the feedback quoted, linked to its page, labelled *Bug* for a problem and *Feature* for
969
+ an idea when the workspace has those labels); open feedback becomes *In progress*, and the entry links to its issue.
970
+
971
+ ## Team Development
972
+
973
+ (sprint 113, migration 122; APEX: Team Development) An issue tracker for the developers of a
974
+ [workspace](#workspaces): **Team Development** on the icon rail (`/builder/team`) and a block in the
975
+ [Workspace home](#workspace-home)'s side column with the number of open issues. Everything is of the current
976
+ workspace and works without JavaScript.
977
+
978
+ - **Set up** installs sample data, like APEX's set-up wizard: the label groups *Type* (Bug, Feature, Task) and
979
+ *Priority* (High, Medium, Low), issue templates (*Bug report*, *Feature request*, *Task*), canned responses and the
980
+ milestones *1.0*, *1.1* and *Backlog*. What the workspace has already (by name) is kept, so it can run again.
981
+ The samples are in English; other languages are added in `src/team-samples.ts`.
982
+ - **Issues** have a title, a description in Markdown (rendered safely: raw HTML is shown as text, links are http,
983
+ https, mailto or relative), *Open* or *Closed*, labels, a milestone, assignees (the workspace's developers and the
984
+ installation's administrators), and optionally an application of the workspace and one of its pages. Comments are
985
+ Markdown too; *Comment and close* does both. **@name** mentions a developer of the workspace: they see it under
986
+ *Mentions of you* (and on the Workspace home) until they open the issue or mark them seen; no mail is sent. Every
987
+ change is in the issue's history (who changed the title, labels, milestone, assignees, link or status, and when).
988
+ An issue is deleted by its author or a workspace administrator.
989
+ - **The list** filters by status, label, milestone, assignee (*Me*, *Nobody*), application and a search of the title
990
+ and text (or `#12` for issue 12). **Save view** keeps the filters under a name, for you only.
991
+ - **The board** shows the issues as columns of cards, by the labels of one label group (a card moved to *High*
992
+ loses *Medium*; *None of these* removes the group's labels) or by milestone. Each card has a *Move* form, so it
993
+ works without dragging.
994
+ - **Labels** belong to label groups and have a colour from a fixed palette (red, orange, yellow, green, teal, blue,
995
+ purple, gray). **Milestones** have a due date and are open or closed, with the share of their issues closed.
996
+ **Templates** are issue templates (title, labels, text: *Start from a template* on *New issue*) and canned
997
+ responses (*Canned response* → *Insert* above an issue's comment field). Any developer of the workspace adds and
998
+ changes them; only its administrators delete labels, label groups and milestones.
999
+ - Issues come from [feedback](#feedback) and [developer comments](#page-locks-and-comments) with **Make an issue**,
1000
+ linked both ways. The page designer shows a page's open issues and App Home counts them per page (*Open issues* in
1001
+ its Tasks).
1002
+
1003
+ Issues and the rest are workspace data: they are not part of an application's export (an in-place import keeps them)
1004
+ but travel in the workspace's [Export and import](#export-and-import) (*Team Development*): labels, milestones and
1005
+ templates match by name, an issue by its title and creation time; assignees are kept when they are developers of the
1006
+ importing workspace and the application link when it has an application with that alias. GitHub synchronisation is
1007
+ not part of it.
1008
+
876
1009
  ## Working copies
877
1010
 
878
1011
  APEX's working copies: a second application to change in isolation, then merge back. On an
@@ -939,8 +1072,8 @@ is the earlier page: every component in one rail, with **Access control** next t
939
1072
  | **Shortcuts** | Named texts: `"NAME"` in static content, help texts and confirm messages ([chapter 2](02-concepts.md#shortcuts-name)) |
940
1073
  | **Application computations** | Computations of (application) items for every page: at sign-in, before every page, after every submit ([chapter 6](06-processing.md#application-computations)) |
941
1074
  | **REST modules** | REST endpoints (method, path, SQL) served by pgkiln, with an OpenAPI description ([chapter 13](13-rest-api.md#rest-modules-in-the-builder)) |
942
- | **Workflows** | Multi-step processes of tasks, SQL, web service calls (invoke API), decisions, waits and parallel branches, with versions and a diagram ([chapter 6](06-processing.md#workflows)) |
943
- | **Task definitions** | Approvals and action tasks: subject, owners, administrators, due date, the SQL that runs on completion ([chapter 6](06-processing.md#approvals-and-the-task-list)) |
1075
+ | **Workflows** | Multi-step processes of tasks, SQL, web service calls (invoke API), e-mail, decisions, waits and parallel branches, with versions, draft steps, migration of running instances and a diagram (SVG / PNG download) ([chapter 6](06-processing.md#workflows)) |
1076
+ | **Task definitions** | Approvals and action tasks: subject, owners, administrators, due date, custom outcomes, the SQL that runs on completion, events and e-mail notifications ([chapter 6](06-processing.md#approvals-and-the-task-list)) |
944
1077
  | **Document templates** | Letters, invoices and other PDFs filled from a query ([chapter 16](16-files.md#document-templates)), with a preview |
945
1078
  | **Build options** | Include / exclude switches for features; pages and their components name one in their *Build option* property, and *Used in* lists them ([chapter 6](06-processing.md#build-options)) |
946
1079
  | **Web credentials** | How the application signs in to web services (basic, API key header, bearer token, OAuth2 client credentials); the secret is write-only and encrypted ([chapter 19](19-rest-data-sources.md#web-credentials)) |
@@ -963,6 +1096,7 @@ application has a **type** (Settings → Application type):
963
1096
  | Theme application | Offers its theme (colours, navigation, light/dark settings and the Theme Roller's styles) and its template components to other applications |
964
1097
  | Library application | Offers its lists of values, authorization schemes, build options, template components and lists (with their entries) to other applications |
965
1098
  | Boilerplate application | A starting point: **Create** offers it under *Start from* |
1099
+ | Reporting application | (sprint 110) Made by [App Builder → Data Reporter](#data-reporter-datasets-and-reporting-applications) on datasets: its users build, publish and share reports |
966
1100
 
967
1101
  **Shared Components → Subscriptions** subscribes the application to one of those components: it is
968
1102
  copied now (replacing a component with the same name) and remembered as a subscription. The page
@@ -1207,7 +1341,12 @@ Workspace utilities → **AI services** (administrators only; APEX: *Generative
1207
1341
  large language model services of this installation. A service has:
1208
1342
 
1209
1343
  - a **name** (upper case, e.g. `CLAUDE`) by which processes, dynamic actions and SQL refer to it;
1210
- - a **provider**: *Claude (Anthropic)* or *OpenAI*, called through their official SDKs;
1344
+ - a **provider**: *Claude (Anthropic)* or *OpenAI*, called through their official SDKs; *Gemini*
1345
+ (Google, through its OpenAI-compatible endpoint `https://generativelanguage.googleapis.com/v1beta/openai/`,
1346
+ with the `openai` SDK); or *OpenAI-compatible*: any endpoint that speaks OpenAI's Chat Completions,
1347
+ such as Ollama (`http://localhost:11434/v1`), vLLM, Azure OpenAI (`https://<resource>.openai.azure.com/openai/v1/`)
1348
+ or a gateway. An OpenAI-compatible service needs a base URL; its key may stay empty for endpoints
1349
+ without keys (a local Ollama);
1211
1350
  - a **model**, exactly as the provider names it (new Claude services start with `claude-opus-5-5`);
1212
1351
  pgkiln never changes or downgrades it;
1213
1352
  - for Claude, the **effort** (how deeply the model thinks; current Claude models always think, lower
@@ -1219,8 +1358,9 @@ large language model services of this installation. A service has:
1219
1358
  - an optional **base URL** for a gateway or proxy that speaks the provider's API (calls to the AI
1220
1359
  service don't go through `PGKILN_REST_ALLOWED_HOSTS`: only administrators set this URL);
1221
1360
  - the **API key**: stored encrypted with `PGKILN_SECRET_KEY`, write-only (never shown again, never
1222
- exported or logged, not readable by applications). Without one the server's `ANTHROPIC_API_KEY` /
1223
- `OPENAI_API_KEY` is used.
1361
+ exported or logged, not readable by applications, never sent to the browser). Without one the
1362
+ server's `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY` or `OPENAI_COMPATIBLE_API_KEY`
1363
+ (by provider) is used.
1224
1364
 
1225
1365
  On a service's page, **Applications** sets which applications may use it, each with optional daily
1226
1366
  limits (requests and input + output tokens per UTC day; a request over a limit fails with a message
@@ -1228,11 +1368,71 @@ and is logged as *limited*), and **Test** sends a prompt (logged as a builder te
1228
1368
  on the list page for all services, the usage log: the last requests and the totals per application
1229
1369
  and service of the last 30 days.
1230
1370
 
1371
+ An interactive report's *Ask in your own words* doesn't need a service: without one (or when the
1372
+ service is disabled or not allowed for the application) pgkiln reads the request with its built-in
1373
+ phrases ([chapter 4](04-pages-and-regions.md#ask-in-your-own-words-ai-interactive-reports)).
1374
+
1231
1375
  **Prompts go to the provider.** Whatever a prompt contains, including the item values substituted
1232
1376
  into it, is sent to the chosen provider (or the gateway of the base URL). Choose providers and
1233
1377
  models that your organisation allows for that data. See
1234
1378
  [Generate text with AI](06-processing.md#generate-text-with-ai).
1235
1379
 
1380
+ ## AI agents
1381
+
1382
+ Shared Components → Generative AI → **AI Agents** (APEX 26.1 / 26.2: AI Agents and AI Tools) holds an
1383
+ application's agents and the tools they may use. An agent reasons over a user's request in an
1384
+ [AI assistant region](04-pages-and-regions.md#ai_assistant-ai-assistant) and acts **only through the
1385
+ tools you approve**; pgkiln prepares the context, runs each tool call itself under the checks below,
1386
+ and composes the conversation.
1387
+
1388
+ An **agent** has:
1389
+
1390
+ - a **name** (upper case, e.g. `SALES_AGENT`) that regions refer to, and a description;
1391
+ - an **AI service** the application may use, and a **system prompt** (`&ITEM.` is replaced by the item's
1392
+ value as delimited data, as in assistant regions);
1393
+ - a **reasoning effort**: *low*, *medium* or *high*, or empty for the service's own. For Claude it is
1394
+ the output effort (thinking depth, `output_config.effort`); for OpenAI, Gemini and OpenAI-compatible
1395
+ services it is sent as `reasoning_effort` (leave it empty for models without reasoning: they refuse it);
1396
+ - the **tools** it may use (ticked from the application's tools);
1397
+ - **maximum steps** (rounds of tool calls per question, 1–20, default 5) and **maximum output tokens**
1398
+ per call (never above the service's maximum);
1399
+ - an **authorization scheme**: other users see *You may not use this assistant* instead of the message
1400
+ box, and their questions are refused before anything is sent to the AI service.
1401
+
1402
+ A **tool** has a name the model calls it by, a description that tells the model what it does and when
1403
+ to use it, optional **parameters** (JSON: `{"DNAME": {"type": "string", "description": "…", "optional": true}}`;
1404
+ types string, integer, number, boolean, date, `enum` for a list of texts), an optional authorization
1405
+ scheme (only users who pass it are offered the tool) and one of these types:
1406
+
1407
+ | Type | What runs | Checks |
1408
+ |---|---|---|
1409
+ | **SQL query** | one `SELECT` (or `WITH`, `VALUES`, `TABLE`) with the parameters as `:NAME` bind values, plus `:APP_USER` and items | as the application's database role (grants and row level security apply), in a **read-only transaction** (functions it calls can't write either), with a time limit (1–60 s, default 15) and at most *maximum rows* rows (default 50) back to the model |
1410
+ | **PL/pgSQL function** | `schema.function` called with named arguments: each parameter name in lower case is an argument name (`P_EMPNO` → `p_empno => …`) | as the application's role; it **may change data** (committed); same time limit and rows |
1411
+ | **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) |
1412
+ | **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 |
1413
+ | **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 |
1414
+
1415
+ The model's arguments are checked against the parameters before a tool runs; they are bind values
1416
+ (escaped literals), never SQL text, and can't replace the server's own names (`:APP_USER`, `:APP_ID`, …).
1417
+ Tool results go back to the model as data, with the instruction never to follow instructions inside them.
1418
+
1419
+ **Every tool call is logged** with the arguments the model gave, its status (*ok*, *error*, or *refused*
1420
+ for a page the user may not open) and duration: in the page's debug messages (level 4) and under
1421
+ Activity → **AI usage** → *Tool calls* (`meta.ai_tool_call`, kept 30 days; arguments may hold user data,
1422
+ only developers see them). The token usage of each call to the model is logged as before.
1423
+
1424
+ Agents and tools are kept in the application (`meta.app.ai_agents`, `meta.app.ai_tools`) and **exported
1425
+ with it**; an export made before they existed imports with none. The forms check each one before
1426
+ saving (a SQL tool must be a query, a function `schema.name`, a navigate tool's pages must exist); the
1427
+ runtime checks them again and shows *This assistant is not set up yet* for a broken one. Renaming a
1428
+ tool keeps it in its agents; a tool an agent uses can't be deleted; renaming an agent renames it in
1429
+ the regions that use it.
1430
+
1431
+ The HR example (`examples/hr/hr_64_ai_agent.sql`) has an agent `HR_AGENT` on page 46: ask *Who in Sales
1432
+ earns most?* and it calls the SQL tool `top_earners` as the signed-in user's role, then offers
1433
+ *Open BLAKE's record*, a link to the employee form (page 3) with a valid checksum, only to users who
1434
+ may open that page.
1435
+
1236
1436
  ## App Builder AI
1237
1437
 
1238
1438
  The App Builder uses one AI service (APEX: AI Assistant in App Builder and SQL Workshop). An