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
Copy file name to clipboardExpand all lines: content/docs/api/client-sdk.mdx
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ The `@objectstack/client` is the official TypeScript client for ObjectStack. It
17
17
-**Batch Operations**: Efficient bulk create/update/upsert/delete with transaction support
18
18
-**Query Builder**: Programmatic query construction with `createQuery()` and `createFilter()`
19
19
-**Standardized Errors**: Machine-readable error codes with retry guidance
20
-
-**Protocol Compliant**: Implements the core API namespaces defined in `@objectstack/spec`, plus additional namespaces (approvals, feed, organizations, projects/environments)
20
+
-**Protocol Compliant**: Implements the core API namespaces defined in `@objectstack/spec`, plus additional namespaces (approvals, organizations, projects/environments)
21
21
22
22
## Installation
23
23
@@ -76,7 +76,7 @@ async function main() {
76
76
When you call `client.connect()`, the client:
77
77
78
78
1. Probes `/api/v1/discovery` first, then falls back to `{origin}/.well-known/objectstack`
79
-
2. Parses the discovery response including `routes`, `features`, and `services`
79
+
2. Parses the discovery response including `routes`, `capabilities`, and `services`
80
80
3. Configures all API route paths dynamically
81
81
82
82
```typescript
@@ -104,7 +104,7 @@ if (discovery.services?.auth?.enabled) {
104
104
105
105
## Protocol Coverage
106
106
107
-
The `@objectstack/client` SDK aims to implement the ObjectStack API protocol specification. The core namespaces are listed below; the client also exposes additional namespaces (`approvals`, `feed`, `organizations`, `oauth`, `projects`/environments) — see [`index.ts`](https://github.com/objectstack-ai/framework/blob/main/packages/client/src/index.ts) for the full surface:
107
+
The `@objectstack/client` SDK aims to implement the ObjectStack API protocol specification. The core namespaces are listed below; the client also exposes additional namespaces (`approvals`, `organizations`, `oauth`, `projects`/environments) — see [`index.ts`](https://github.com/objectstack-ai/framework/blob/main/packages/client/src/index.ts) for the full surface:
Copy file name to clipboardExpand all lines: content/docs/api/plugin-endpoints.mdx
+12Lines changed: 12 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -28,6 +28,10 @@ The following endpoints become available when the corresponding plugin is instal
28
28
29
29
### Workflow (`/workflow`) — Plugin Required
30
30
31
+
<Callouttype="warn">
32
+
Not yet mounted. These routes are declared in the API protocol but the core dispatcher registers no `/workflow` handler and no bundled plugin provides a `workflow` service (only an in-memory dev stub), so they return **404** today. `discovery.services.workflow` reports `unavailable` in a standard install.
33
+
</Callout>
34
+
31
35
| Method | Endpoint | Description |
32
36
|:-------|:---------|:------------|
33
37
| GET |`/workflow/:object/config`| Get workflow configuration |
@@ -46,6 +50,10 @@ The automation dispatcher also exposes flow CRUD (`GET`/`POST /automation`, `GET
46
50
47
51
### Views (`/ui`) — Plugin Required
48
52
53
+
<Callouttype="warn">
54
+
Not yet mounted. The `/ui/views` CRUD routes are declared in the API protocol but no handler is registered for them, so they return **404** today (and the `/api/v1/ui` prefix is itself deprecated in favour of `/api/v1/meta/view`). The always-available view **resolver** is a separate route — see the note below.
55
+
</Callout>
56
+
49
57
| Method | Endpoint | Description |
50
58
|:-------|:---------|:------------|
51
59
| GET |`/ui/views/:object`| List views for an object |
@@ -60,6 +68,10 @@ The auto-generated (non-CRUD) view resolver `GET /ui/view/:object/:type` is alwa
60
68
61
69
### Realtime (`/realtime`) — Plugin Required
62
70
71
+
<Callouttype="warn">
72
+
Not implemented. There is no realtime HTTP or WebSocket surface: `@objectstack/service-realtime` is an in-process pub/sub bus consumed via `kernel.getService('realtime')`, not over HTTP. The dispatcher has no `/realtime` branch, discovery deliberately omits the route (`features.websockets` is `false`), and the routes below would return **404** (ADR-0076 D12). They document the planned protocol shape only.
73
+
</Callout>
74
+
63
75
| Method | Endpoint | Description |
64
76
|:-------|:---------|:------------|
65
77
| POST |`/realtime/connect`| Establish WebSocket/SSE connection |
Copy file name to clipboardExpand all lines: content/docs/api/wire-format.mdx
+1-5Lines changed: 1 addition & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -254,10 +254,6 @@ The response is the `DeleteDataResponse` envelope: `{ object, id, success }`.
254
254
}
255
255
```
256
256
257
-
<Callouttype="info">
258
-
**Soft Delete:** If the object enables soft delete (`softDelete: { enabled: true }` in its definition), the record is moved to the trash / recycle bin instead of being permanently deleted.
259
-
</Callout>
260
-
261
257
---
262
258
263
259
## 6. Get Metadata
@@ -365,7 +361,7 @@ Field-level failures carry a `fields` array.
365
361
366
362
```json
367
363
{
368
-
"error": "[Security] Access denied: operation 'update' on object 'task' is not permitted for roles [standard_user]",
364
+
"error": "[Security] Access denied: operation 'update' on object 'task' is not permitted for positions [standard_user]",
Copy file name to clipboardExpand all lines: content/docs/automation/approvals.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,7 +24,7 @@ A flow declares `runAs` (ADR-0049), and for approvals this is the decision that
24
24
-`runAs: 'user'` (default) — the flow's data operations run as the **submitter**, respecting their RLS. Good when the flow only touches records the submitter can already see.
25
25
-`runAs: 'system'` — **elevated**, bypasses RLS. Needed when the flow must read/write records the submitter can't (e.g. post to a ledger, notify an approver who owns rows the submitter can't see). Declare it **explicitly** so the elevation is visible, not accidental.
26
26
27
-
A schedule-triggered escalation has no triggering user — so it must be `system` to act at all.
27
+
A schedule-triggered escalation has no triggering user, so under the default `runAs: 'user'` its data operations run **unscoped** (elevated, RLS-bypassing) anyway — declare `system` to make that elevation explicit and intended rather than an implicit fail-open (the engine warns, and `os lint` flags the bare shape as `flow-schedule-runas-unscoped`).
0 commit comments