@lotics/app-sdk 0.90.2 → 0.90.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/queries.md CHANGED
@@ -464,7 +464,7 @@ derived surfaces share one implementation.
464
464
  | number | `number` | `equals`, `not_equals`, `greater_than`, `less_than`, `greater_than_or_equal_to`, `less_than_or_equal_to`, `is_empty`, `is_not_empty` | same set | Full numeric aggregate set (§8). |
465
465
  | date / datetime | `date` / `datetime` (datetime when the field's format includes time) | `on`, `before`, `after`, `on_or_before`, `on_or_after`, `between`, `time_of_day`, `is_empty`, `is_not_empty` — values are `DateTimePoint`s (below) | same set | Day-level filters on datetime values expand to the full-day window. Sortable; bucketable in `group.by` (§8); `earliest`/`latest`/`min`/`max`/`date_range` aggregate. |
466
466
  | boolean | `boolean` | `equals` (value `true`/`false`; `false` matches NULL/missing) | same | `checked`/`unchecked`/`percent_*` aggregate (`unchecked` counts false **or** empty). |
467
- | select (single & multi) | `select` | `has_any_of`, `has_none_of`, `has_all_of`, `is_empty`, `is_not_empty` — values are **option keys** (`opt_*`), never labels | same | Cells are arrays even for single-selects. Sorting a select column in a query orders by raw JSON, **not** configured option order. `unnest` fans option keys. |
467
+ | select (single & multi) | `select` | `has_any_of`, `has_none_of`, `has_all_of`, `is_empty`, `is_not_empty` — values are **option keys** (`opt_*`), never labels | the **runtime** `filter` (§9) also takes option **names**, resolving each to its key — an unknown one is refused rather than matching nothing, and the value stays an array either way; a select column the query DERIVES instead of projecting from a field carries no option set, so addressing one there is refused | Cells are arrays even for single-selects. Sorting a select column in a query orders by raw JSON, **not** configured option order. `unnest` fans option keys. |
468
468
  | select_member | `select_member` | select ops + `is_current_member`, `is_not_current_member` (field-scoped, no value) | same — `is_current_member` **works at the runtime layer** too | `unnest` fans member ids. Anonymous public request: current-member binds the app owner (§1). |
469
469
  | select_record_link | `select_record_link` | membership by linked-record **id**: `has_any_of`, `has_none_of`, `has_all_of`; text over the cached **display**: `contains`, `not_contains`, `starts_with`, `ends_with`; `is_empty`, `is_not_empty` | same — id-membership works at the runtime layer (converged `[{id}]` containment) | Sorting orders by raw JSON, not display text — project the display (link extraction / `display_output`) and sort that. `unnest` fans link ids (+ display). |
470
470
  | files | `files` | `has_filename`, `has_mime_type` (substring), `has_file_count` (exact count), `is_empty`, `is_not_empty` | same | Presign-enriched at delivery (§1); `unnest` fans file ids. Only presence-counting aggregates. |
package/docs/workflows.md CHANGED
@@ -16,9 +16,8 @@ engine, no `eval`, no sandbox. Four consequences shape everything below:
16
16
 
17
17
  - **Only the listed forms exist.** Anything outside them fails the save with a precise error
18
18
  naming the rule and, where one exists, the substitute. A save never partially succeeds.
19
- - **A successful save may still return `warnings[]`** — advisory lint that does not block
20
- (a possible infinite loop, a link path more than three hops deep, a button action with no
21
- `validate` guard). Read them; they are the failures that only show up in production.
19
+ - **A successful save may still return `warnings[]`** — advisory lint that does not block.
20
+ Read them; they are the failures that only show up in production.
22
21
  - **One canonical form per concept.** Several JS spellings are accepted and *lowered* to one
23
22
  stored form. The stored tree renders back to source on `lotics app pull`, so a pulled body
24
23
  shows the canonical spelling, not the sugar you typed (see *Round-tripping* below).
@@ -803,8 +802,8 @@ What only the **server** can decide, so `check` stays green and `set` may still
803
802
  - **`switch` case validation** against a single-select's options, and the multi-select rejection;
804
803
  - the **literal `formatDate` format probe**;
805
804
  - **wait inside a loop**, and the `before_*` restrictions on waits and `agent` steps;
806
- - the **lint** — possible self-retrigger, deep link chains, a button action with no `validate`
807
- guard (all warnings).
805
+ - the **lint** — deep link chains, an input the alias declares that this body never reads, and
806
+ an unguarded `set` in a body that generates a document (all warnings).
808
807
 
809
808
  There is no separate verify endpoint: the loop is `set` → read the returned diagnostics → fix →
810
809
  `set`. Diagnostics arrive **batched** — independent errors across the whole body come back in one
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lotics/app-sdk",
3
- "version": "0.90.2",
3
+ "version": "0.90.3",
4
4
  "description": "Runtime SDK for Lotics custom-code apps \u2014 typed hooks, postMessage bridge, mount entry point",
5
5
  "type": "module",
6
6
  "exports": {