@elevasis/sdk 1.26.0 → 1.26.2

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.
@@ -1,15 +1,300 @@
1
1
  ---
2
- title: UI Execution
3
- description: Trigger workflow and agent executions from a custom React UI -- Run buttons, input forms, and result displays via @elevasis/ui
2
+ title: Execution Reference
3
+ description: REST endpoints for executing resources, querying execution history, and managing deployments; plus React UI components and hooks for triggering executions from custom pages via @elevasis/ui
4
4
  ---
5
5
 
6
- `@elevasis/ui` ships a set of components and hooks that let your custom React pages trigger workflow and agent executions without wiring up API calls manually. This page is for template users building interactive resource pages in `external/_template` who want to add Run buttons, input forms, and execution result displays.
6
+ This page covers two complementary surfaces for driving resource executions:
7
7
 
8
- The API comes in three tiers: a convenience one-tag component that handles everything, a controlled form primitive for custom modal chrome, and low-level hooks for fully custom rendering. Most template pages need only the first tier.
8
+ - **REST API** -- the `/api/external/` endpoints you call directly or through the CLI.
9
+ - **UI components** -- the `@elevasis/ui` components and hooks for building interactive Run dialogs in custom React pages.
10
+
11
+ ---
12
+
13
+ ## REST API
14
+
15
+ The Elevasis external API exposes REST endpoints under `/api/external/` for executing your deployed resources and inspecting results. All endpoints require your `ELEVASIS_PLATFORM_KEY` sent as a Bearer token. Organization is resolved server-side from the API key -- you never pass an org identifier in requests.
16
+
17
+ **Authentication header:**
18
+
19
+ ```
20
+ Authorization: Bearer sk_...
21
+ ```
22
+
23
+ ### API Base URL
24
+
25
+ | Environment | Base URL |
26
+ | ----------- | --------------------------- |
27
+ | Production | `https://api.elevasis.io` |
28
+ | Development | `http://localhost:<port>` |
29
+
30
+ Override the base URL by setting `ELEVASIS_API_URL` in your environment or passing `--api-url` to any CLI command.
31
+
32
+ ### Endpoint Overview
33
+
34
+ | Method | Path | Purpose |
35
+ | ------ | ---------------------------------------------------------- | ---------------------------------------- |
36
+ | `GET` | `/api/external/resources` | List all resources for your organization |
37
+ | `GET` | `/api/external/resources/:resourceId/definition` | Get resource metadata and schemas |
38
+ | `POST` | `/api/external/execute` | Execute a resource synchronously |
39
+ | `POST` | `/api/external/execute-async` | Execute a resource asynchronously |
40
+ | `POST` | `/api/external/executions/:resourceId/:executionId/cancel` | Cancel a running execution |
41
+ | `GET` | `/api/external/executions/:resourceId` | List execution history for a resource |
42
+ | `GET` | `/api/external/executions/:resourceId/:executionId` | Get full execution detail |
43
+ | `POST` | `/api/external/deploy` | Upload bundle and deploy resources |
44
+ | `GET` | `/api/external/deployments` | List all deployments |
45
+ | `GET` | `/api/external/deployments/:id` | Get a deployment by ID |
46
+
47
+ ### Execution Endpoints
48
+
49
+ #### POST /api/external/execute
50
+
51
+ Execute a resource synchronously. The request waits for the resource to complete and returns the full result.
52
+
53
+ **Request body:**
54
+
55
+ ```json
56
+ {
57
+ "resourceId": "onboard-client",
58
+ "input": {
59
+ "clientName": "Jane",
60
+ "email": "jane@example.com"
61
+ }
62
+ }
63
+ ```
64
+
65
+ **Response:**
66
+
67
+ ```json
68
+ {
69
+ "executionId": "550e8400-e29b-41d4-a716-446655440000",
70
+ "success": true,
71
+ "data": {
72
+ "success": true,
73
+ "clientId": "client_1708521600000",
74
+ "welcomeEmailSent": true
75
+ }
76
+ }
77
+ ```
78
+
79
+ #### POST /api/external/execute-async
80
+
81
+ Execute a resource asynchronously. Returns immediately with an `executionId`. Poll `GET /executions/:resourceId/:executionId` to check status and retrieve output.
82
+
83
+ **Request body:**
84
+
85
+ ```json
86
+ {
87
+ "resourceId": "onboard-client",
88
+ "input": { "clientName": "Jane" }
89
+ }
90
+ ```
91
+
92
+ **Response:**
93
+
94
+ ```json
95
+ {
96
+ "executionId": "550e8400-e29b-41d4-a716-446655440000",
97
+ "status": "running"
98
+ }
99
+ ```
100
+
101
+ #### POST /api/external/executions/:resourceId/:executionId/cancel
102
+
103
+ Cancel a running execution. If the execution is found in memory, sends a cancellation signal immediately. Falls back to a database status update if no in-memory signal is found.
104
+
105
+ **Response:**
106
+
107
+ ```json
108
+ {
109
+ "success": true
110
+ }
111
+ ```
112
+
113
+ ### Resource Endpoints
114
+
115
+ #### GET /api/external/resources
116
+
117
+ List all resources registered to your organization. In production, only `status: 'prod'` resources are returned.
118
+
119
+ **Response:**
120
+
121
+ ```json
122
+ [
123
+ {
124
+ "resourceId": "onboard-client",
125
+ "resourceType": "workflow",
126
+ "name": "Onboard Client",
127
+ "status": "prod"
128
+ },
129
+ {
130
+ "resourceId": "email-assistant",
131
+ "resourceType": "agent",
132
+ "name": "Email Assistant",
133
+ "status": "prod"
134
+ }
135
+ ]
136
+ ```
137
+
138
+ #### GET /api/external/resources/:resourceId/definition
139
+
140
+ Get the full definition for a single resource: metadata, input schema, and output schema.
141
+
142
+ **Response:**
143
+
144
+ ```json
145
+ {
146
+ "resourceId": "onboard-client",
147
+ "resourceType": "workflow",
148
+ "name": "Onboard Client",
149
+ "description": "Creates a client record and sends a welcome email",
150
+ "status": "prod",
151
+ "inputSchema": {
152
+ "type": "object",
153
+ "properties": {
154
+ "clientName": { "type": "string" },
155
+ "email": { "type": "string", "format": "email" }
156
+ },
157
+ "required": ["clientName", "email"]
158
+ },
159
+ "outputSchema": {
160
+ "type": "object",
161
+ "properties": {
162
+ "success": { "type": "boolean" },
163
+ "clientId": { "type": "string" }
164
+ }
165
+ }
166
+ }
167
+ ```
168
+
169
+ Returns `404` if the resource is not found.
170
+
171
+ ### Execution History Endpoints
172
+
173
+ #### GET /api/external/executions/:resourceId
174
+
175
+ List execution history for a resource.
176
+
177
+ **Query parameters:**
178
+
179
+ | Parameter | Description |
180
+ | --------- | --------------------------------------------------------------- |
181
+ | `limit` | Maximum number of results (default: 20) |
182
+ | `status` | Filter by status: `running`, `completed`, `failed`, `cancelled` |
183
+
184
+ **Response:**
185
+
186
+ ```json
187
+ [
188
+ {
189
+ "executionId": "550e8400-e29b-41d4-a716-446655440000",
190
+ "resourceId": "onboard-client",
191
+ "status": "completed",
192
+ "createdAt": "2026-02-25T14:32:01Z",
193
+ "durationMs": 1234
194
+ }
195
+ ]
196
+ ```
197
+
198
+ #### GET /api/external/executions/:resourceId/:executionId
199
+
200
+ Get the full detail for a single execution including input, output, logs, and error.
201
+
202
+ **Response:**
203
+
204
+ ```json
205
+ {
206
+ "executionId": "550e8400-e29b-41d4-a716-446655440000",
207
+ "resourceId": "onboard-client",
208
+ "status": "completed",
209
+ "createdAt": "2026-02-25T14:32:01Z",
210
+ "durationMs": 1234,
211
+ "input": {
212
+ "clientName": "Jane",
213
+ "email": "jane@example.com"
214
+ },
215
+ "output": {
216
+ "success": true,
217
+ "clientId": "client_1708521600000",
218
+ "welcomeEmailSent": true
219
+ },
220
+ "logs": [
221
+ { "timestamp": "2026-02-25T14:32:01.123Z", "message": "Starting onboard-client workflow" },
222
+ { "timestamp": "2026-02-25T14:32:01.456Z", "message": "Created client record" }
223
+ ],
224
+ "error": null
225
+ }
226
+ ```
227
+
228
+ ### Deployment Endpoints
229
+
230
+ #### POST /api/external/deploy
231
+
232
+ Upload a resource bundle and deploy it. Accepts a multipart request with the compiled bundle and resource metadata.
233
+
234
+ **Response:**
235
+
236
+ ```json
237
+ {
238
+ "deployId": "deploy_abc123",
239
+ "status": "active",
240
+ "resources": 4
241
+ }
242
+ ```
243
+
244
+ Use `elevasis-sdk deploy` from the CLI rather than calling this endpoint directly -- the CLI handles bundling, metadata generation, and status streaming automatically.
245
+
246
+ #### GET /api/external/deployments
247
+
248
+ List all deployments for your organization.
249
+
250
+ **Response:**
251
+
252
+ ```json
253
+ [
254
+ {
255
+ "id": "deploy_abc123",
256
+ "status": "active",
257
+ "createdAt": "2026-02-25T14:00:00Z",
258
+ "resources": 4
259
+ },
260
+ {
261
+ "id": "deploy_abc122",
262
+ "status": "stopped",
263
+ "createdAt": "2026-02-24T09:30:00Z",
264
+ "resources": 3
265
+ }
266
+ ]
267
+ ```
268
+
269
+ #### GET /api/external/deployments/:id
270
+
271
+ Get a single deployment by ID.
272
+
273
+ **Response shape:** Same as a single item from `GET /deployments`.
274
+
275
+ ### CLI Execution Commands
276
+
277
+ The SDK CLI wraps all execution endpoints. Use these commands instead of calling the API directly during development:
278
+
279
+ | Command | API call | Purpose |
280
+ | ------------------------------------------------------ | -------------------------------------------- | ------------------------ |
281
+ | `elevasis-sdk resources` | `GET /api/external/resources` | List all resources |
282
+ | `elevasis-sdk describe <resource>` | `GET /api/external/resources/:id/definition` | Show resource definition |
283
+ | `elevasis-sdk exec <resource> --input '...'` | `POST /api/external/execute` | Execute synchronously |
284
+ | `elevasis-sdk exec <resource> --input '...' --async` | `POST /api/external/execute-async` | Execute asynchronously |
285
+ | `elevasis-sdk executions <resource>` | `GET /api/external/executions/:id` | List execution history |
286
+ | `elevasis-sdk execution <resource> <id>` | `GET /api/external/executions/:id/:execId` | Get execution detail |
287
+ | `elevasis-sdk deployments` | `GET /api/external/deployments` | List deployments |
9
288
 
10
289
  ---
11
290
 
12
- ## Quick Start -- `ResourceExecuteDialog`
291
+ ## UI Execution
292
+
293
+ `@elevasis/ui` ships a set of components and hooks that let your custom React pages trigger workflow and agent executions without wiring up API calls manually. This section is for template users building interactive resource pages in `external/_template` who want to add Run buttons, input forms, and execution result displays.
294
+
295
+ The API comes in three tiers: a convenience one-tag component that handles everything, a controlled form primitive for custom modal chrome, and low-level hooks for fully custom rendering. Most template pages need only the first tier.
296
+
297
+ ### Quick Start -- `ResourceExecuteDialog`
13
298
 
14
299
  `ResourceExecuteDialog` combines a modal shell, an input form, mutation state, and result display into a single component. Drop it next to a Button and you have a working Run dialog in about fifteen lines.
15
300
 
@@ -62,9 +347,7 @@ What the user sees when they click Run:
62
347
 
63
348
  If `formSchema` is omitted or has no fields, the form skips to a single "Run" button with the message "This workflow takes no input."
64
349
 
65
- ---
66
-
67
- ## The Three-Tier API
350
+ ### The Three-Tier API
68
351
 
69
352
  | Tier | Component / Hook | Use case |
70
353
  | --------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------- |
@@ -74,9 +357,7 @@ If `formSchema` is omitted or has no fields, the form skips to a single "Run" bu
74
357
 
75
358
  Start with `ResourceExecuteDialog`. Move down the tiers only when you need something the convenience component cannot do.
76
359
 
77
- ---
78
-
79
- ## Controlled Usage with `ResourceExecuteForm`
360
+ ### Controlled Usage with `ResourceExecuteForm`
80
361
 
81
362
  Use `ResourceExecuteForm` when you want to own the modal or display the result somewhere outside the dialog -- for example, rendering the execution ID inline on the page after submission.
82
363
 
@@ -138,9 +419,7 @@ export function CustomRunPanel() {
138
419
  | `disabled` | `boolean` | `false` | Disables all fields and button |
139
420
  | `submitLabel` | `string` | `'Run'` | Button label when not pending |
140
421
 
141
- ---
142
-
143
- ## Low-Level: Hooks and `ExecuteWorkflowModal`
422
+ ### Low-Level: Hooks and `ExecuteWorkflowModal`
144
423
 
145
424
  For complete rendering control, use `useExecuteAsync` and `ExecuteWorkflowModal` independently. `ExecuteWorkflowModal` is a Mantine Modal pre-wired with a loading overlay, a success card (execution ID + "View execution" button), and an error alert. You pass `children` for the input area.
146
425
 
@@ -168,9 +447,7 @@ The modal locks close interactions (click-outside, Escape, close button) while `
168
447
 
169
448
  Source: `packages/ui/src/features/operations/executions/ExecuteWorkflowModal.tsx`, `packages/ui/src/hooks/executions/useExecuteAsync.ts`
170
449
 
171
- ---
172
-
173
- ## Zod-Validated Execution with `useExecuteWorkflow`
450
+ ### Zod-Validated Execution with `useExecuteWorkflow`
174
451
 
175
452
  `useExecuteWorkflow` wraps `useExecuteAsync` with a Zod parse step before the POST. Use it when you are constructing input programmatically (not from a form) and want to catch schema mismatches before they reach the API.
176
453
 
@@ -207,9 +484,7 @@ Prefer `useExecuteWorkflow` over raw `useExecuteAsync` when:
207
484
 
208
485
  Source: `packages/ui/src/hooks/executions/useExecuteWorkflow.ts`
209
486
 
210
- ---
211
-
212
- ## Input Forms
487
+ ### Input Forms
213
488
 
214
489
  `ResourceExecuteDialog` and `ResourceExecuteForm` auto-render form fields from `formSchema.fields`. Each field is a `SerializedFormField` with at minimum `name`, `label`, and `type`.
215
490
 
@@ -227,9 +502,7 @@ Required fields (`required: true`) are validated on submit. Custom field-to-inpu
227
502
 
228
503
  If `formSchema` is undefined, an empty object, or has `fields: []`, the form skips rendering fields entirely and shows "This workflow takes no input." with a single Run button.
229
504
 
230
- ---
231
-
232
- ## Error and Result Handling
505
+ ### Error and Result Handling
233
506
 
234
507
  Mutation state flows automatically into the modal chrome when using `ResourceExecuteDialog` or `ExecuteWorkflowModal`:
235
508
 
@@ -243,7 +516,7 @@ Mutation state flows automatically into the modal chrome when using `ResourceExe
243
516
 
244
517
  ## Related
245
518
 
246
- - [REST API](api.mdx) -- trigger executions directly over HTTP, without React
519
+ - [Deployment Overview](index.mdx) -- deploy pipeline, versioning, and bundle upload
247
520
  - [Command Center](command-center.mdx) -- built-in managed UI; includes Run buttons for all deployed resources
248
521
  - [Resource Patterns](../resources/patterns.mdx) -- HITL approval patterns and `approval.create()`
249
522
  - [Platform Adapters](../platform-tools/adapters-platform.mdx) -- `approval.create()` reference
@@ -182,13 +182,108 @@ The deploy bundle is a single CJS file produced by esbuild. It includes:
182
182
 
183
183
  The bundle is stored on the platform for durability and restart recovery. If the platform API restarts, it re-downloads your bundle and re-registers your resources automatically -- no action required on your part.
184
184
 
185
- ## Documentation
185
+ ---
186
186
 
187
- - [Command Center](command-center.mdx) - Resource graph, relationships, node types, and post-deployment UI reference
188
- - [Provided Features](provided-features.mdx) - Shared Lead Gen, CRM, Projects, and feature-shell surfaces for downstream apps and agents
189
- - [Execution API](api.mdx) - REST endpoints for executing resources and managing deployments
190
- - [UI Execution](ui-execution.mdx) - Custom React run dialogs, forms, and hooks for triggering resource executions
187
+ ## Provided Features
188
+
189
+ The SDK includes more than workflow execution. The published `@elevasis/ui` package provides system manifests, pages, hooks, and headless provider exports for building shell-aware applications.
190
+
191
+ ### Shared Shell Contract
192
+
193
+ `ElevasisSystemsProvider` reads the canonical `OrganizationModel`, including `navigation.sidebar`, and exposes a shell model plus sidebar projection helpers. System manifests provide implementation hooks such as icons and subshell sidebars; they do not own structural navigation.
194
+
195
+ ```tsx
196
+ import { Outlet } from '@tanstack/react-router'
197
+ import { ElevasisSystemsProvider, SystemShell } from '@elevasis/ui/provider'
198
+ import { leadGenManifest } from '@elevasis/ui/features/lead-gen'
199
+ import { crmManifest } from '@elevasis/ui/features/crm'
200
+ import { deliveryManifest } from '@elevasis/ui/features/delivery'
201
+ import { monitoringManifest } from '@elevasis/ui/features/monitoring'
202
+ import { settingsManifest } from '@elevasis/ui/features/settings'
203
+ import { canonicalOrganizationModel } from '@core/config/organization-model'
204
+
205
+ const systems = [
206
+ leadGenManifest,
207
+ crmManifest,
208
+ deliveryManifest,
209
+ monitoringManifest,
210
+ settingsManifest
211
+ ]
212
+
213
+ export function AppShell() {
214
+ return (
215
+ <ElevasisSystemsProvider systems={systems} organizationModel={canonicalOrganizationModel}>
216
+ <SystemShell>
217
+ <Outlet />
218
+ </SystemShell>
219
+ </ElevasisSystemsProvider>
220
+ )
221
+ }
222
+ ```
223
+
224
+ Host apps still own TanStack route registration, topbar behavior, branding, auth wiring, and any root dashboard composition.
225
+
226
+ ### Contract Matrix
227
+
228
+ | Contract type | What is published | Current examples |
229
+ | --------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
230
+ | Manifest-backed shared subshell systems | System manifest plus shared sidebar/pages, mounted through `@elevasis/ui/provider` | Lead Gen, CRM, Projects, Operations |
231
+ | Shared feature pages and hooks | Pages, hooks, and helpers that can be composed inside host routes | Monitoring, Settings, Dashboard widgets |
232
+ | Headless provider contract | Provider, hooks, and shell model helpers | `ElevasisSystemsProvider`, `useElevasisSystems`, `SystemShell` |
233
+ | Compatibility barrel | Existing imports remain available while newer integrations prefer feature/provider subpaths | `@elevasis/ui/components` |
234
+
235
+ ### System Map
236
+
237
+ | System | Primary route space | Shared UI surface | Best SDK entry point |
238
+ | ---------- | ------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
239
+ | Lead Gen | `/lead-gen/*` | Lead Gen pages, sidebars, list detail page, run dialogs | `@elevasis/ui/features/lead-gen`, `@elevasis/ui/hooks`, `@elevasis/sdk/worker` |
240
+ | CRM | `/crm/*` | CRM sidebar, overview widgets, deal/detail pages, workbench panels | `@elevasis/ui/features/crm`, `@elevasis/ui/hooks`, `@elevasis/sdk/worker` |
241
+ | Projects | `/projects/*` | Projects list page, milestones/tasks/notes sidebars and pages | `@elevasis/ui/features/delivery`, `@elevasis/ui/hooks/delivery`, `elevasis-sdk project:*` |
242
+ | Operations | `/operations/*` | Command View, resources, organization graph, sessions | `@elevasis/ui/features/operations` |
243
+ | Dashboard | `/` host-owned | Dashboard and overview components only | `@elevasis/ui/features/dashboard` |
244
+ | Monitoring | `/monitoring/*` | Monitoring pages/components | `@elevasis/ui/features/monitoring` |
245
+ | Settings | `/settings/*` | Settings/account/org components | `@elevasis/ui/features/settings` |
246
+
247
+ ### Organization Model Alignment
248
+
249
+ Manifest `systemId` values must match Organization Model System IDs. Sidebar placement is authored in the Organization Model navigation domain:
250
+
251
+ ```ts
252
+ systems: {
253
+ dashboard: { id: 'dashboard', order: 10, label: 'Dashboard', lifecycle: 'active' },
254
+ clients: { id: 'clients', order: 20, label: 'Clients', lifecycle: 'active' }
255
+ },
256
+ navigation: {
257
+ sidebar: {
258
+ primary: {
259
+ dashboard: { type: 'surface', order: 10, label: 'Dashboard', path: '/', surfaceType: 'dashboard', targets: { systems: ['dashboard'] } },
260
+ business: {
261
+ type: 'group',
262
+ order: 20,
263
+ label: 'Business',
264
+ children: {
265
+ clients: { type: 'surface', order: 20, label: 'Clients', path: '/clients', surfaceType: 'list', targets: { systems: ['clients'] } }
266
+ }
267
+ }
268
+ },
269
+ bottom: {}
270
+ }
271
+ }
272
+ ```
273
+
274
+ Dashboard appears before Business in the primary sidebar. Business is a navigation group only; `/clients` is the canonical client route.
275
+
276
+ ### Choosing the Right Surface
277
+
278
+ - Need packaged sidebar/page composition? Use `ElevasisSystemsProvider`, `SystemShell`, and manifests from `@elevasis/ui/features/*`.
279
+ - Need a root dashboard? Keep that route host-owned and compose dashboard components.
280
+ - Need list-scoped lead-gen runtime behavior? Use the `list` adapter, then `acqDb` for broader acquisition CRUD.
281
+ - Need project/task automation? Use `elevasis-sdk project:*`.
191
282
 
192
283
  ---
193
284
 
194
- **Last Updated:** 2026-04-23
285
+ ## Documentation
286
+
287
+ - [Command Center](command-center.mdx) - Resource graph, relationships, node types, and post-deployment UI reference
288
+ - [Execution Reference](execution-reference.mdx) - REST endpoints for executing resources, managing deployments, and React UI components for custom Run dialogs
289
+ - [Platform Adapters](../platform-tools/adapters-platform.mdx) - `approval.create()` and all platform service adapters
@@ -7,13 +7,23 @@
7
7
  import { defineOrganizationModel, defineResources } from '@elevasis/core/organization-model'
8
8
 
9
9
  // ---------------------------------------------------------------------------
10
- // Branding override
10
+ // Identity and branding override
11
11
  // ---------------------------------------------------------------------------
12
12
  export const brandingOverrideExample = defineOrganizationModel({
13
+ identity: {
14
+ organizationName: 'Northstar Studio',
15
+ productName: 'Northstar Ops',
16
+ shortName: 'Northstar'
17
+ },
13
18
  branding: {
14
- organizationName: 'Acme Corp',
15
- productName: 'Acme Command Center',
16
- shortName: 'Acme'
19
+ logos: {
20
+ light: '/brand/northstar-logo-light.svg',
21
+ dark: '/brand/northstar-logo-dark.svg'
22
+ },
23
+ voice: 'Clear, practical, and calm.',
24
+ tagline: 'Operational clarity for growing teams.',
25
+ values: ['Clarity', 'Reliability', 'Momentum'],
26
+ themePresetId: 'northstar'
17
27
  }
18
28
  })
19
29
 
@@ -24,7 +24,7 @@ After `pnpm dlx @elevasis/sdk init`, your project is scaffolded with a working e
24
24
 
25
25
  - **Workflows** -- Step-based automation with typed inputs and outputs. Steps can be linear, conditional, or branching. Each step is a plain async function. See [Resources](resources/index.mdx) for the complete definition API.
26
26
  - **Agents** -- Autonomous AI resources with access to platform tools. Agents run in the worker runtime with full LLM access and platform tool support. Use `--async` when executing agents to avoid HTTP timeout limits on long-running runs.
27
- - **Feature-driven apps** -- The published `@elevasis/ui` surface includes manifest-backed shared features for Lead Gen, CRM, Projects, Operations, Monitoring, Settings, and SEO, plus dashboard-oriented compatibility components for host-owned shells. See [Provided Features](deployment/provided-features.mdx).
27
+ - **Feature-driven apps** -- The published `@elevasis/ui` surface includes manifest-backed shared features for Lead Gen, CRM, Projects, Operations, Monitoring, Settings, and SEO, plus dashboard-oriented compatibility components for host-owned shells. See [Provided Features](deployment/index.mdx#provided-features).
28
28
 
29
29
  ## Platform Tools
30
30
 
@@ -81,9 +81,7 @@ See [Platform Tools](platform-tools/index.mdx) for the full catalog, adapter ref
81
81
  ### Deployment Subpages
82
82
 
83
83
  - [Command Center](deployment/command-center.mdx) - Resource graph, relationships, node types, and post-deployment UI reference
84
- - [Provided Features](deployment/provided-features.mdx) - Manifest-backed shared features, compatibility components, and host shell wiring
85
- - [Execution API](deployment/api.mdx) - REST endpoints for executing resources and managing deployments
86
- - [UI Execution](deployment/ui-execution.mdx) - Custom React execution dialogs, forms, and hooks built with `@elevasis/ui`
84
+ - [Execution Reference](deployment/execution-reference.mdx) - REST endpoints for executing resources, managing deployments, and React UI components for custom Run dialogs
87
85
 
88
86
  ### More
89
87
 
@@ -439,7 +439,7 @@ The Command Queue page in the Command Center surfaces all pending approval tasks
439
439
 
440
440
  Use these hooks to build a custom approval queue surface in your template UI. `useSubmitAction` accepts `taskId`, `actionId`, and optional `notes`, and optimistically marks the task as `processing` while the request is in flight.
441
441
 
442
- For triggering executions from custom pages (the other side of the workflow interaction), see [UI Execution](../deployment/ui-execution.mdx).
442
+ For triggering executions from custom pages (the other side of the workflow interaction), see [UI Execution](../deployment/execution-reference.mdx#ui-execution).
443
443
 
444
444
  ---
445
445
 
@@ -109,7 +109,14 @@ import { sseConnectionManager } from '@/lib/sse/SSEConnectionManager'
109
109
 
110
110
  **WorkOS config:**
111
111
 
112
- WorkOS `clientId`, `redirectUri`, and `signoutUri` are hardcoded in `ui/src/config/workos.ts` -- no UI env vars are required to run the template. Edit that file if a fork needs a different WorkOS client. The dev server runs on port `4300` with Vite `strictPort: true`, so a second `pnpm -C ui dev` on the same machine fails fast instead of drifting.
112
+ WorkOS `clientId`, `redirectUri`, and `signoutUri` are resolved in `ui/src/config/workos.ts` from `VITE_WORKOS_CLIENT_ID`, `VITE_WORKOS_REDIRECT_URI`, `VITE_WORKOS_SIGNOUT_URI`, and `VITE_APP_ORIGIN`, with localhost fallbacks so the template runs locally without production env vars. For deployed apps, set the production env vars in the hosting provider and allow the exact redirect and sign-out URLs in the WorkOS application dashboard:
113
+
114
+ - Redirect URI: `https://your-production-domain/auth-redirect`
115
+ - Sign-out redirect: `https://your-production-domain/login`
116
+ - Configure CORS origin: `https://your-production-domain`; required for browser AuthKit calls to `api.workos.com`
117
+ - App homepage origin: `https://your-production-domain`
118
+
119
+ The dev server runs on port `4300` with Vite `strictPort: true`, so a second `pnpm -C ui dev` on the same machine fails fast instead of drifting.
113
120
 
114
121
  The API URL is centralized in `ui/src/lib/constants/api.ts`. In the current template it is hard-coded to `https://api.elevasis.io`, so if the bootstrap is repointed to another API target, that file is the source of truth.
115
122