You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(site): drop numeric stats; first round of persona-review fixes
Per review feedback, remove count-style statistics from module overviews
and landing (field type counts, hook event counts, namespace tallies) in
favor of qualitative descriptions — counts drift from the implementation
and don't help readers.
Also lands the first fixes from the reader-persona review pass:
- ai/actions-as-tools: remove walkthrough of HITL demo tests that do not
exist in examples/app-todo (only mcp-actions/seed tests exist); point
at the real delete_completed danger action instead
- ai/agents, ai/natural-language-queries: fix orphaned 'see above'
references and same-page anchors that now live on sibling pages
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018r9mjpF7jr9BKdzEmUE4uZ
Copy file name to clipboardExpand all lines: content/docs/ai/actions-as-tools.mdx
+7-15Lines changed: 7 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -116,21 +116,13 @@ The queue is exposed via four REST endpoints (`GET`, `GET/:id`, `POST/:id/approv
116
116
117
117
### End-to-end example
118
118
119
-
Two runnable demos live in `examples/app-todo/test/`:
120
-
121
-
-**`ai-hitl.test.ts`** — drives the tool registry directly (no LLM dependency). Asserts the full lifecycle: `variant:'danger'` action registered as a tool → invocation returns `pending_approval` without executing → row persisted → `approvePendingAction(id, actor)` re-runs the handler → row transitions to `executed`. Reject path is also covered.
122
-
123
-
```bash
124
-
pnpm --filter @example/app-todo test:hitl
125
-
```
126
-
127
-
-**`ai-hitl-llm.test.ts`** — same scenario but with a real model behind Vercel AI Gateway. The LLM is given the auto-generated tool description and asked to "delete all completed tasks"; the framework returns `pending_approval` so the model summarises the wait instead of retrying. After we call approve from the test, the deletion completes.
Copy file name to clipboardExpand all lines: content/docs/automation/index.mdx
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
---
2
2
title: Automation
3
-
description: 18 hook events, 20+ extensible flow node types, scheduled flows, approvals, and durable webhooks — the process engine that reacts to your data.
3
+
description: Hooks, flows, workflows, approvals, scheduled jobs, and durable webhooks — the process engine that reacts to your data.
-**Hooks** intercept **18 lifecycle events** — before/after each of find, findOne, count, aggregate, insert, update, delete, updateMany, deleteMany. Hooks support priority ordering, fire-and-forget `async` mode, CEL `condition` guards, and a `retryPolicy` with backoff ([Hooks](/docs/automation/hooks)).
31
-
-**Flows** are node-based processes with **20 built-in node types** (decision, loop, create/update/delete record, http, notify, script, screen, wait, subflow, parallel/join gateways, …) — and the set is **registry-extensible**: plugins can contribute new node types via `registerNodeExecutor`. Flows launch on record changes, on a schedule, from a screen, or via API ([Flows](/docs/automation/flows)).
30
+
-**Hooks** intercept every record operation with before/after events — reads, writes, deletes, and their bulk variants. Hooks support priority ordering, fire-and-forget `async` mode, CEL `condition` guards, and a `retryPolicy` with backoff ([Hooks](/docs/automation/hooks)).
31
+
-**Flows** are node-based processes built from nodes like decision, loop, record operations, http, notify, script, screen, wait, subflow, and parallel/join gateways — and the set is **registry-extensible**: plugins can contribute new node types via `registerNodeExecutor`. Flows launch on record changes, on a schedule, from a screen, or via API ([Flows](/docs/automation/flows)).
32
32
-**Workflows** model a record's lifecycle as a **finite state machine**: states, transitions, and guards ([Workflows](/docs/automation/workflows)).
33
33
-**Approvals** are flow nodes with approver resolution, approve/reject decisions, and escalation ([Approvals](/docs/automation/approvals)).
34
34
-**Webhooks** deliver events to external systems through a **durable outbox** — exponential/linear/fixed retry with dead-lettering, HMAC signing, and an admin redeliver endpoint ([Webhook Delivery](/docs/automation/webhooks)).
@@ -39,7 +39,7 @@ Rule of thumb: model *state* with workflows, model *steps* with flows, use hooks
39
39
## What's in this module
40
40
41
41
<Cards>
42
-
<Cardhref="/docs/automation/hooks"title="Hooks"description="18 before/after events on record operations" />
42
+
<Cardhref="/docs/automation/hooks"title="Hooks"description="Before/after events on record operations" />
43
43
<Cardhref="/docs/automation/hook-bodies"title="Hook & Action Bodies (L1/L2)"description="The two authoring levels for hook logic" />
description: Complete reference for all 48 ObjectStack field types with per-type configuration properties
3
+
description: Complete reference for every ObjectStack field type with per-type configuration properties
4
4
---
5
5
6
6
# Field Type Gallery
7
7
8
-
ObjectStack provides **49 field types** covering every data modeling need — from basic text and numbers to AI vectors and rich media. This guide organizes them by category with per-type configuration details.
8
+
ObjectStack provides a **comprehensive set of field types** covering every data modeling need — from basic text and numbers to AI vectors and rich media. This guide organizes them by category with per-type configuration details.
9
9
10
10
<Callouttype="info">
11
11
**Source:**`packages/spec/src/data/field.zod.ts`
@@ -24,7 +24,6 @@ Single-line plain text input.
24
24
|`maxLength`|`number`| — | Maximum character length |
25
25
|`minLength`|`number`| — | Minimum character length |
26
26
|`format`|`string`| — | Validation format pattern |
27
-
|`caseSensitive`|`boolean`| — | Whether text comparisons are case-sensitive |
|`deleteBehavior`|`'restrict' \| 'cascade' \| 'set_null'`|`'set_null'`| Behavior when referenced record is deleted |
305
+
|`deleteBehavior`|`'restrict' \| 'cascade' \| 'set_null'`|`'set_null'`| Behavior when referenced record is deleted (a *required* lookup left at the default `set_null` is escalated to `restrict`, since a NOT NULL foreign key cannot be cleared) |
Person picker — a lookup specialized to the built-in `sys_user` object. Stored identically to `lookup` (foreign key to `sys_user.id`; `multiple: true` stores an array) and resolved through the same `$expand` machinery. Supports `defaultValue: 'current_user'` to stamp the acting user's id on insert.
Structured postal address. Stored as `{ street, city, state, postalCode, country, countryCode, formatted }` (all parts optional). No per-type config properties.
The nested `vectorConfig` object (with `distanceMetric`, `indexed`, `indexType`, …) is retained for back-compat only and is a runtime no-op — set the flat `dimensions` property instead.
Not sure which type fits your data? Follow the [Field Type Decision Tree](/docs/data-modeling/field-type-decision-tree) — a flowchart, quick-reference tables, and a use-case mapping for every type in this gallery.
0 commit comments