@elevasis/sdk 0.4.5 → 0.4.6

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.
@@ -0,0 +1,148 @@
1
+ ---
2
+ title: Project Structure
3
+ description: Each file scaffolded by elevasis init and its purpose in the development workflow
4
+ ---
5
+
6
+ `elevasis init` creates a complete project structure. This page explains what each file does and when you will interact with it.
7
+
8
+ ---
9
+
10
+ ## Source Files
11
+
12
+ ### `src/index.ts`
13
+
14
+ Your resource definitions live here. This file must export an `OrganizationResources` object as its default export. The scaffolded file contains a working echo workflow that demonstrates the `z.infer` pattern for Zod schema types.
15
+
16
+ Every resource you add -- workflows and agents -- is registered through this default export.
17
+
18
+ ### `elevasis.config.ts`
19
+
20
+ Project-level configuration. The scaffolded file contains commented-out options (`defaultStatus`, `dev.port`) so you can discover available settings without having to look them up. Leave this file minimal; the platform provides sensible defaults.
21
+
22
+ ---
23
+
24
+ ## Documentation
25
+
26
+ ### `docs/index.mdx`
27
+
28
+ The entry point for your project's documentation. Documentation files in `docs/` are deployed alongside your code during `elevasis deploy` and rendered in the Elevasis platform UI.
29
+
30
+ Use MDX frontmatter to set page metadata:
31
+
32
+ ```yaml
33
+ ---
34
+ title: Overview
35
+ description: Documentation for this project
36
+ order: 0
37
+ ---
38
+ ```
39
+
40
+ Add more pages by creating additional `.mdx` files in `docs/`. Nested directories create sections: `docs/guides/setup.mdx` becomes a `guides/setup` page under your deployment's documentation.
41
+
42
+ ---
43
+
44
+ ## Configuration Files
45
+
46
+ ### `.env`
47
+
48
+ Contains your `ELEVASIS_API_KEY`. This file is gitignored. Never commit it.
49
+
50
+ ### `.env.example`
51
+
52
+ A git-safe template showing which variables are needed:
53
+
54
+ ```
55
+ ELEVASIS_API_KEY=sk_your_key_here
56
+ ```
57
+
58
+ Commit this file so collaborators know what to configure.
59
+
60
+ ### `.npmrc`
61
+
62
+ Sets `auto-install-peers = true`. The SDK uses Zod as a peer dependency, so this ensures Zod installs automatically.
63
+
64
+ ### `tsconfig.json`
65
+
66
+ App-focused TypeScript configuration. It does not include `declaration` or `declarationMap` settings because your project is a deployable application, not a library.
67
+
68
+ ### `.gitignore`
69
+
70
+ Pre-configured to exclude:
71
+ - `.env` -- API key
72
+ - `__elevasis_worker.ts` -- temporary file generated during deployment
73
+ - `.claude/settings.local.json` -- local Claude Code overrides
74
+ - `.claude/profile.json` -- your personal onboarding profile
75
+
76
+ ---
77
+
78
+ ## Claude Code Integration
79
+
80
+ The `.claude/` directory and `CLAUDE.md` give Claude Code full awareness of the SDK, CLI, and your project structure from the first session.
81
+
82
+ ### `CLAUDE.md`
83
+
84
+ The most important file for AI-assisted development. It provides Claude Code with:
85
+
86
+ - **Project orientation** -- what an Elevasis SDK project is and how it works
87
+ - **Project structure** -- which files contain resources, documentation, and configuration
88
+ - **SDK patterns** -- working code examples for resource definitions, Zod schemas, and the `OrganizationResources` export
89
+ - **CLI reference** -- all commands with flags (`check`, `deploy`, `exec`, `resources`, `executions`, `execution`, `deployments`, `env list/set/remove`)
90
+ - **Development rules** -- conventions the agent should enforce (source in `src/`, docs in `docs/`, use `@elevasis/sdk` types only)
91
+
92
+ Do not remove or heavily edit `CLAUDE.md`. It is the primary context source that makes the slash commands work well.
93
+
94
+ ### `.claude/settings.json`
95
+
96
+ Sets `autoCompact: false`. This prevents Claude Code from automatically compacting context during long sessions, which can lose important earlier context about your project.
97
+
98
+ ### `.claude/profile.json`
99
+
100
+ Created automatically on your first Claude Code session. The agent runs a one-time onboarding flow asking about your organization, project goals, and experience level. Answers are stored here and used to personalize subsequent sessions.
101
+
102
+ This file is gitignored -- it is personal to you and not shared with collaborators.
103
+
104
+ ---
105
+
106
+ ## Slash Commands
107
+
108
+ The `.claude/commands/` directory contains three commands covering the core development loop. Invoke them in Claude Code with `/docs`, `/resource`, and `/deploy`.
109
+
110
+ ### `/docs` -- Documentation Assistant
111
+
112
+ Helps you write and maintain documentation in `docs/`. Three operations:
113
+
114
+ - **No arguments** -- Review existing `docs/` files, identify undocumented resources and gaps, suggest improvements
115
+ - **`create <page-name>`** -- Scaffold a new documentation page with correct frontmatter, populated from your resource definitions
116
+ - **`review`** -- Check all `docs/` files for accuracy against the actual code in `src/`, flag mismatches between documented schemas and implementation
117
+
118
+ ### `/resource` -- Resource Scaffolding
119
+
120
+ Scaffolds new workflow definitions with proper types, Zod schemas, and step structure. Three operations:
121
+
122
+ - **`workflow <name>`** -- Single-step workflow with Zod input/output schemas, config object, contract, step handler, and addition to the `OrganizationResources` export
123
+ - **`multi-step <name>`** -- Multi-step workflow with `StepType.LINEAR` or `StepType.CONDITIONAL`, connected steps, and per-step schemas
124
+ - **`tool-step <name>`** -- Step that calls a platform tool via `platform.call()` with `PlatformToolError` error handling and a credential note
125
+
126
+ ### `/deploy` -- Deployment Assistant
127
+
128
+ Guides you through validation and deployment. Two operations:
129
+
130
+ - **No arguments** -- Runs `elevasis check`, reports any validation errors, then runs `elevasis deploy` if check passes. Analyzes failure output and suggests fixes if the deploy fails
131
+ - **`status`** -- Runs `elevasis deployments` and `elevasis resources` to show current deployment state
132
+
133
+ ---
134
+
135
+ ## File Reference
136
+
137
+ | File | When You Edit It |
138
+ |------|-----------------|
139
+ | `src/index.ts` | Adding or modifying resources |
140
+ | `docs/index.mdx` | Updating project documentation |
141
+ | `elevasis.config.ts` | Changing project-level settings |
142
+ | `.env` | Adding environment variables |
143
+ | `CLAUDE.md` | Rarely -- only to add project-specific context |
144
+ | `.claude/commands/*.md` | Rarely -- commands work well as scaffolded |
145
+
146
+ ---
147
+
148
+ **Last Updated:** 2026-02-25
@@ -0,0 +1,105 @@
1
+ ---
2
+ title: Elevasis SDK
3
+ description: Build and deploy workflows, agents, and resources with the Elevasis SDK
4
+ ---
5
+
6
+ `@elevasis/sdk` lets you build workflows, agents, and resources in TypeScript and deploy them to the Elevasis platform with a single command. The developer experience is Vercel-style: write TypeScript, validate locally, deploy -- the platform handles execution, tool access, and observability. You never manage infrastructure. Zod 4.1 is the only peer dependency.
7
+
8
+ ## Quick Start
9
+
10
+ ```bash
11
+ npm install @elevasis/sdk
12
+ elevasis init
13
+ elevasis deploy
14
+ ```
15
+
16
+ After `elevasis init`, your project is scaffolded with a working echo workflow, config file, TypeScript setup, and a `CLAUDE.md` that gives Claude Code full awareness of the SDK. After `elevasis deploy`, your resources appear in AI Studio and are available to run immediately.
17
+
18
+ Here is a minimal workflow definition:
19
+
20
+ ```ts
21
+ import { WorkflowDefinition, OrganizationResources } from '@elevasis/sdk';
22
+ import { z } from 'zod';
23
+
24
+ const greetInput = z.object({ name: z.string() });
25
+ const greetOutput = z.object({ message: z.string() });
26
+
27
+ type GreetInput = z.infer<typeof greetInput>;
28
+ type GreetOutput = z.infer<typeof greetOutput>;
29
+
30
+ const greetWorkflow: WorkflowDefinition = {
31
+ id: 'greet',
32
+ name: 'Greet',
33
+ inputSchema: greetInput,
34
+ outputSchema: greetOutput,
35
+ steps: [
36
+ {
37
+ id: 'greet-step',
38
+ name: 'Build greeting',
39
+ handler: async (input: GreetInput): Promise<GreetOutput> => {
40
+ return { message: `Hello, ${input.name}!` };
41
+ },
42
+ next: null,
43
+ },
44
+ ],
45
+ };
46
+
47
+ export const resources: OrganizationResources = {
48
+ workflows: [greetWorkflow],
49
+ };
50
+ ```
51
+
52
+ ## What You Can Build
53
+
54
+ - **Workflows** -- Step-based automation with typed inputs and outputs. Steps can be linear, conditional, or branching. Each step is a plain async function. Workflows are the primary resource type and are fully supported.
55
+ - **Agents** -- Autonomous AI resources with access to platform tools. Agent definitions are accepted by the SDK and appear in the registry, but autonomous agent execution (multi-turn tool use loops) is deferred -- see Known Limitations below.
56
+
57
+ ## Platform Tools
58
+
59
+ Inside any workflow step, import `platform` from `@elevasis/sdk/worker` to call platform tools:
60
+
61
+ ```ts
62
+ import { platform } from '@elevasis/sdk/worker';
63
+
64
+ const result = await platform.call({
65
+ tool: 'gmail',
66
+ method: 'send',
67
+ params: { to: 'user@example.com', subject: 'Hello', body: 'World' },
68
+ credential: 'my-gmail-credential',
69
+ });
70
+ ```
71
+
72
+ The platform exposes 70+ tools across 12 integration adapters -- Gmail, Slack, HubSpot, Notion, and more. Credentials are managed server-side; API keys never cross the execution boundary. LLM calls are also available via `platform.call({ tool: 'llm', ... })` with API keys resolved from platform environment variables.
73
+
74
+ See [Platform Tools](platform-tools/index.mdx) for the full catalog.
75
+
76
+ ## Known Limitations
77
+
78
+ - **Agent execution is deferred** -- The worker runtime returns a failed status for agent resources. LLM calls are available via `platform.call`, but autonomous multi-turn agent loops are not yet supported.
79
+ - **No streaming logs** -- Execution logs are returned in the response body after completion. Real-time log streaming is not available.
80
+
81
+ ## Documentation
82
+
83
+ ### Getting Started
84
+
85
+ - [Getting Started](getting-started/index.mdx) - Installation, authentication, first workflow, and project structure
86
+
87
+ ### Core Concepts
88
+
89
+ - [Resources](resources/index.mdx) - Workflow and agent definition patterns, Zod schemas, step types, and routing
90
+ - [Platform Tools](platform-tools/index.mdx) - Full catalog of 70+ tools, integration adapters, and credential management
91
+
92
+ ### Reference
93
+
94
+ - [CLI Reference](cli/index.mdx) - All CLI commands: check, deploy, exec, resources, executions, env, and more
95
+ - [Deployment](deployment/index.mdx) - Deploy pipeline, versioning, bundle upload, and registry registration
96
+ - [Runtime](runtime/index.mdx) - Worker execution model, concurrency, timeouts, cancellation, and resource limits
97
+
98
+ ### Developer Tools
99
+
100
+ - [Documentation](documentation/index.mdx) - Writing and deploying MDX documentation alongside your resources
101
+ - [Roadmap](roadmap/index.mdx) - Planned features including agent execution, streaming logs, and SDK testing utilities
102
+
103
+ ---
104
+
105
+ **Last Updated:** 2026-02-25
@@ -0,0 +1,186 @@
1
+ ---
2
+ title: Integration Examples
3
+ description: Common platform.call() patterns for email, CRM, PDF, LLM inference, resource triggering, and storage
4
+ ---
5
+
6
+ Common `platform.call()` patterns ready to use in your SDK workflows. Each example shows the complete invocation including tool name, method, params, and credential (where required).
7
+
8
+ ## Sending Email via Resend
9
+
10
+ Send a transactional email through your Resend account. Store your Resend API key as a credential named `resend` using the [Elevasis CLI](../cli/index.mdx).
11
+
12
+ ```typescript
13
+ const result = await platform.call({
14
+ tool: 'resend',
15
+ method: 'sendEmail',
16
+ credential: 'resend',
17
+ params: {
18
+ from: 'hello@yourapp.com',
19
+ to: 'customer@example.com',
20
+ subject: 'Your order is confirmed',
21
+ html: '<p>Thank you for your order!</p>'
22
+ }
23
+ })
24
+ ```
25
+
26
+ The `credential` value must match the name you used when storing the API key. Resend supports `{ apiKey }` as its credential shape.
27
+
28
+ ## Creating a CRM Record via Attio
29
+
30
+ Create a contact or company record in Attio. Store your Attio API key as a credential named `attio`.
31
+
32
+ ```typescript
33
+ const result = await platform.call({
34
+ tool: 'attio',
35
+ method: 'createRecord',
36
+ credential: 'attio',
37
+ params: {
38
+ objectType: 'people',
39
+ attributes: {
40
+ name: [{ full_name: 'Jane Smith' }],
41
+ email_addresses: [{ email_address: 'jane@example.com' }],
42
+ company: 'Acme Corp'
43
+ }
44
+ }
45
+ })
46
+
47
+ // result.data.id is the new record ID
48
+ const recordId = result.data.id
49
+ ```
50
+
51
+ Attio exposes 11 tools covering CRUD operations, schema inspection, and notes. See the Attio adapter documentation for the full method list.
52
+
53
+ ## Generating a PDF
54
+
55
+ Render a PDF from an HTML string or a registered template. No credential required -- PDF generation is a built-in platform service.
56
+
57
+ ```typescript
58
+ const pdfBuffer = await platform.call({
59
+ tool: 'pdf',
60
+ method: 'renderToBuffer',
61
+ params: {
62
+ html: `
63
+ <h1>Invoice #1042</h1>
64
+ <p>Customer: Jane Smith</p>
65
+ <p>Amount due: $450.00</p>
66
+ `,
67
+ options: {
68
+ format: 'A4',
69
+ margin: { top: '20mm', bottom: '20mm', left: '15mm', right: '15mm' }
70
+ }
71
+ }
72
+ })
73
+
74
+ // Upload the buffer to storage for later retrieval
75
+ await platform.call({
76
+ tool: 'storage',
77
+ method: 'upload',
78
+ params: {
79
+ path: 'invoices/invoice-1042.pdf',
80
+ data: pdfBuffer,
81
+ contentType: 'application/pdf'
82
+ }
83
+ })
84
+ ```
85
+
86
+ ## Making an LLM Call with Structured Output
87
+
88
+ Use the `llm` tool to call any supported model with a JSON Schema for structured output. No API keys are needed in your code -- keys are resolved server-side.
89
+
90
+ ```typescript
91
+ const classification = await platform.call({
92
+ tool: 'llm',
93
+ method: 'generate',
94
+ params: {
95
+ provider: 'anthropic',
96
+ model: 'claude-sonnet-4-5',
97
+ messages: [
98
+ {
99
+ role: 'system',
100
+ content: 'You extract structured data from support tickets. Return valid JSON matching the schema.'
101
+ },
102
+ {
103
+ role: 'user',
104
+ content: ticketText
105
+ }
106
+ ],
107
+ responseSchema: {
108
+ type: 'object',
109
+ properties: {
110
+ priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },
111
+ category: { type: 'string', enum: ['billing', 'technical', 'account', 'other'] },
112
+ sentiment: { type: 'string', enum: ['positive', 'neutral', 'negative'] },
113
+ summary: { type: 'string' }
114
+ },
115
+ required: ['priority', 'category', 'sentiment', 'summary']
116
+ },
117
+ temperature: 0.1
118
+ }
119
+ })
120
+
121
+ // classification = { priority: 'high', category: 'technical', sentiment: 'negative', summary: '...' }
122
+ ```
123
+
124
+ Supported providers: `google`, `openai`, `anthropic`, `openrouter`. See [Platform Tools](index.mdx) for the full model list.
125
+
126
+ ## Triggering Another Resource
127
+
128
+ Trigger a separate workflow or agent as a nested child execution. The call is synchronous -- your workflow waits for the child to complete and receives its output.
129
+
130
+ ```typescript
131
+ const outcome = await platform.call({
132
+ tool: 'execution',
133
+ method: 'trigger',
134
+ params: {
135
+ resourceId: 'send-welcome-sequence',
136
+ input: {
137
+ userId: newUser.id,
138
+ email: newUser.email,
139
+ plan: 'pro'
140
+ }
141
+ }
142
+ })
143
+
144
+ if (!outcome.success) {
145
+ throw new Error(`Child workflow failed: ${outcome.error}`)
146
+ }
147
+
148
+ // outcome = { success: true, executionId: '...', output: { emailsSent: 3 }, error: undefined }
149
+ ```
150
+
151
+ Nested executions are tracked with depth up to a maximum of 5 levels. Both the calling workflow and the child must belong to the same organization.
152
+
153
+ ## Uploading to Storage
154
+
155
+ Upload a file to Elevasis-managed storage and generate a signed URL for temporary access. No credential required.
156
+
157
+ ```typescript
158
+ // Upload a processed file
159
+ await platform.call({
160
+ tool: 'storage',
161
+ method: 'upload',
162
+ params: {
163
+ path: `exports/${organizationSlug}/report-${Date.now()}.csv`,
164
+ data: csvContent,
165
+ contentType: 'text/csv'
166
+ }
167
+ })
168
+
169
+ // Generate a signed URL valid for 1 hour (3600 seconds)
170
+ const { signedUrl } = await platform.call({
171
+ tool: 'storage',
172
+ method: 'createSignedUrl',
173
+ params: {
174
+ path: `exports/${organizationSlug}/report-${Date.now()}.csv`,
175
+ expiresIn: 3600
176
+ }
177
+ })
178
+
179
+ // Share signedUrl with the user or include in an email
180
+ ```
181
+
182
+ Storage also supports `download`, `delete`, and `list` operations. Use `list` to enumerate files under a path prefix.
183
+
184
+ ---
185
+
186
+ **Last Updated:** 2026-02-25
@@ -0,0 +1,141 @@
1
+ ---
2
+ title: Platform Tools
3
+ description: Access 70+ integration adapters and platform services from your SDK workflows via platform.call()
4
+ ---
5
+
6
+ `platform.call()` gives your SDK workflows access to the same 70+ tools that internal Elevasis agents use -- Gmail, Stripe, Google Sheets, PDF generation, human-in-the-loop approvals, storage, scheduling, and more. Credentials are managed server-side and never appear in your code. You pass a tool name, method, and parameters; Elevasis handles credential lookup, rate limiting, and retry transparently.
7
+
8
+ All tools share the same interface regardless of type: integration adapters (third-party APIs) and platform services (built-in Elevasis capabilities) are both called the same way.
9
+
10
+ ## Usage
11
+
12
+ ```typescript
13
+ const result = await platform.call({
14
+ tool: 'resend', // tool name (integration adapter or platform service)
15
+ method: 'sendEmail', // method exposed by that tool
16
+ params: { ... }, // method-specific parameters
17
+ credential: 'my-resend' // credential name (integration tools only)
18
+ })
19
+ ```
20
+
21
+ `platform.call()` returns a Promise that resolves with the tool result or rejects with a `PlatformToolError` containing a message, error code, and a `retryable` flag.
22
+
23
+ ## Integration Adapters
24
+
25
+ Twelve integration adapters give you access to roughly 50 tool factories covering third-party APIs. Pass the `credential` field with the name of the stored credential for that service.
26
+
27
+ | Adapter | Tools | Credential Shape |
28
+ | --- | --- | --- |
29
+ | Attio | 11 (CRUD + schema + notes) | `{ apiKey }` |
30
+ | Google Sheets | 13 (read/write/filter/upsert) | OAuth2 / service account |
31
+ | Trello | 10 (cards/lists/checklists) | `{ apiKey, token }` |
32
+ | Notion | 8 (pages + blocks) | `{ token }` |
33
+ | Stripe | 6 (payment links + checkout) | `{ secretKey }` |
34
+ | Instantly | 5 (email campaigns) | `{ apiKey }` |
35
+ | Gmail | 2 (send email) | OAuth2 / service account |
36
+ | Resend | 3 (send/get email) | `{ apiKey }` |
37
+ | SignatureAPI | 3 (envelopes) | `{ apiKey }` |
38
+ | Dropbox | 2 (upload/folder) | `{ accessToken }` |
39
+ | Apify | 1 (run actor) | `{ token }` |
40
+ | Mailso | 1 (verify email) | `{ apiKey }` |
41
+
42
+ Credentials are stored in the Elevasis credentials table and injected server-side. The credential name you pass in `credential` must match the name you set when storing the credential.
43
+
44
+ ## Platform Services
45
+
46
+ Nine built-in platform services are available without a `credential` field. These are Elevasis-managed capabilities.
47
+
48
+ | Tool Key | Methods | Purpose |
49
+ | --- | --- | --- |
50
+ | `email` | `send` | Send transactional email via Elevasis email service |
51
+ | `storage` | `upload`, `download`, `createSignedUrl`, `delete`, `list` | File storage operations |
52
+ | `pdf` | `render`, `renderToBuffer` | Generate PDFs from templates or HTML |
53
+ | `notification` | `create` | Create in-app notifications |
54
+ | `approval` | `create`, `deleteByMetadata` | Human-in-the-loop approval gates |
55
+ | `scheduler` | `createSchedule`, `updateAnchor`, `deleteSchedule`, `findByIdempotencyKey`, `deleteScheduleByIdempotencyKey`, `listSchedules`, `getSchedule`, `cancelSchedule`, `cancelSchedulesByMetadata` | Task scheduling |
56
+ | `lead` | Dynamic (all methods) | Lead management operations |
57
+ | `llm` | `generate` | LLM inference across multiple providers |
58
+ | `execution` | `trigger` | Trigger another resource as a nested child execution |
59
+
60
+ ## LLM Tool
61
+
62
+ Call any supported LLM from your workflow with no API keys required. Keys are resolved server-side from environment variables.
63
+
64
+ ```typescript
65
+ const result = await platform.call({
66
+ tool: 'llm',
67
+ method: 'generate',
68
+ params: {
69
+ provider: 'google',
70
+ model: 'gemini-3-flash-preview',
71
+ messages: [
72
+ { role: 'system', content: 'Classify this email reply.' },
73
+ { role: 'user', content: emailText }
74
+ ],
75
+ responseSchema: {
76
+ type: 'object',
77
+ properties: {
78
+ category: { type: 'string', enum: ['interested', 'not-interested', 'bounced'] },
79
+ confidence: { type: 'number', minimum: 0, maximum: 1 }
80
+ },
81
+ required: ['category', 'confidence']
82
+ },
83
+ temperature: 0.2
84
+ }
85
+ })
86
+ ```
87
+
88
+ **Supported models:**
89
+
90
+ | Provider | Models |
91
+ | --- | --- |
92
+ | `google` | `gemini-3-flash-preview` |
93
+ | `openai` | `gpt-5`, `gpt-5-mini` |
94
+ | `anthropic` | `claude-opus-4-5`, `claude-sonnet-4-5`, `claude-haiku-4-5` |
95
+ | `openrouter` | `openrouter/anthropic/claude-sonnet-4.5`, `openrouter/deepseek/deepseek-v3.2`, `openrouter/x-ai/grok-4.1-fast` |
96
+
97
+ **Key params:**
98
+
99
+ - `provider` -- one of `google`, `openai`, `anthropic`, `openrouter`
100
+ - `model` -- model identifier from the table above
101
+ - `messages` -- array of `{ role, content }` objects
102
+ - `responseSchema` -- optional JSON Schema for structured output
103
+ - `temperature` -- optional, controls output randomness
104
+
105
+ ## Execution Tool
106
+
107
+ Trigger another resource (workflow or agent) as a nested child of the current execution. The child runs synchronously and its result is returned. Depth is tracked automatically up to a maximum of 5 levels to prevent infinite recursion.
108
+
109
+ ```typescript
110
+ const result = await platform.call({
111
+ tool: 'execution',
112
+ method: 'trigger',
113
+ params: {
114
+ resourceId: 'my-other-workflow',
115
+ input: { key: 'value' }
116
+ }
117
+ })
118
+ // result = { success: true, executionId: '...', output: { ... }, error: undefined }
119
+ ```
120
+
121
+ The invoked resource must belong to the same organization. The `organizationId` is always taken from the parent execution context -- you cannot invoke resources across organizations.
122
+
123
+ ## Managing Environment Variables
124
+
125
+ Use the `elevasis env` CLI to manage environment variables for your deployed workers:
126
+
127
+ ```bash
128
+ elevasis env list
129
+ elevasis env set KEY value
130
+ elevasis env remove KEY
131
+ ```
132
+
133
+ Environment variables set this way are injected into your worker process at startup and are available via `process.env`.
134
+
135
+ ## Documentation
136
+
137
+ - [Integration Examples](examples.mdx) - Common `platform.call()` patterns with working code for email, CRM, PDF, LLM, and more
138
+
139
+ ---
140
+
141
+ **Last Updated:** 2026-02-25