@elevasis/sdk 1.44.3 → 1.46.0

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.
Files changed (259) hide show
  1. package/dist/cli.cjs +35026 -30226
  2. package/dist/index.d.ts +1786 -808
  3. package/dist/index.js +789 -739
  4. package/dist/node/index.d.ts +105 -181
  5. package/dist/node/index.js +2 -2
  6. package/dist/test-utils/index.d.ts +901 -359
  7. package/dist/test-utils/index.js +587 -824
  8. package/dist/worker/index.d.ts +12685 -0
  9. package/dist/worker/index.js +188 -216
  10. package/package.json +4 -7
  11. package/reference/_navigation.md +161 -22
  12. package/reference/_reference-manifest.json +228 -4
  13. package/reference/claude-config.md +8 -0
  14. package/reference/core/exports.mdx +2 -0
  15. package/reference/core/index.mdx +3 -3
  16. package/reference/examples/organization-model.ts +117 -111
  17. package/reference/index.mdx +4 -4
  18. package/reference/packages/core/src/business/README.md +4 -1
  19. package/reference/packages/core/src/content/README.md +19 -0
  20. package/reference/packages/core/src/organization-model/README.md +148 -149
  21. package/reference/packages/core/src/organization-model/readiness/README.md +42 -0
  22. package/reference/packages/ui/src/features/README.md +28 -28
  23. package/reference/rules/active-change-index.md +40 -54
  24. package/reference/rules/agent-runtime.md +81 -0
  25. package/reference/rules/agent-start-here.md +71 -163
  26. package/reference/rules/deployment.md +33 -10
  27. package/reference/rules/error-handling.md +26 -0
  28. package/reference/rules/execution.md +13 -0
  29. package/reference/rules/frontend.md +10 -3
  30. package/reference/rules/observability.md +9 -1
  31. package/reference/rules/operations.md +26 -17
  32. package/reference/rules/organization-model.md +74 -88
  33. package/reference/rules/organization-os.md +71 -88
  34. package/reference/rules/package-taxonomy.md +11 -2
  35. package/reference/rules/platform.md +13 -7
  36. package/reference/rules/shared-types.md +36 -0
  37. package/reference/rules/task-tracking.md +30 -5
  38. package/reference/rules/ui.md +145 -3
  39. package/reference/rules/vibe-intents.md +271 -0
  40. package/reference/rules/vibe.md +17 -243
  41. package/reference/scaffold/core/organization-graph.mdx +112 -99
  42. package/reference/scaffold/core/organization-model.mdx +231 -215
  43. package/reference/scaffold/operations/propagation-pipeline.md +16 -17
  44. package/reference/scaffold/operations/scaffold-maintenance.md +22 -20
  45. package/reference/scaffold/operations/workflow-recipes.md +72 -20
  46. package/reference/scaffold/recipes/add-a-feature.md +156 -146
  47. package/reference/scaffold/recipes/add-a-resource.md +123 -117
  48. package/reference/scaffold/recipes/customize-crm-actions.md +28 -13
  49. package/reference/scaffold/recipes/customize-knowledge-browser.md +52 -117
  50. package/reference/scaffold/recipes/customize-organization-model.md +161 -149
  51. package/reference/scaffold/recipes/extend-a-base-entity.md +156 -140
  52. package/reference/scaffold/recipes/extend-content.md +265 -0
  53. package/reference/scaffold/recipes/extend-crm.md +16 -11
  54. package/reference/scaffold/recipes/extend-lead-gen.md +37 -21
  55. package/reference/scaffold/recipes/gate-by-feature-or-admin.md +160 -118
  56. package/reference/scaffold/recipes/index.md +6 -3
  57. package/reference/scaffold/recipes/query-the-knowledge-graph.md +23 -23
  58. package/reference/scaffold/reference/contracts.md +30 -56
  59. package/reference/scaffold/reference/feature-registry.md +3 -0
  60. package/reference/scaffold/reference/glossary.md +4 -4
  61. package/reference/scaffold/reference/system-interface-capabilities.md +5 -4
  62. package/reference/scaffold/ui/composition-extensibility.mdx +271 -232
  63. package/reference/scaffold/ui/customization.md +2 -2
  64. package/reference/scaffold/ui/feature-flags-and-gating.md +14 -6
  65. package/reference/scaffold/ui/feature-shell.mdx +277 -62
  66. package/reference/scaffold/ui/recipes.md +229 -197
  67. package/reference/sdk/cli-management.mdx +166 -33
  68. package/reference/sdk/cli.mdx +90 -13
  69. package/reference/sdk/concepts.mdx +2 -0
  70. package/reference/sdk/define-builders.mdx +76 -0
  71. package/reference/sdk/deployment/command-center.mdx +6 -2
  72. package/reference/sdk/deployment/execution-reference.mdx +64 -186
  73. package/reference/sdk/deployment/index.mdx +2 -0
  74. package/reference/sdk/exports.mdx +4 -4
  75. package/reference/sdk/framework/agent.mdx +52 -116
  76. package/reference/sdk/framework/index.mdx +46 -65
  77. package/reference/sdk/framework/project-structure.mdx +150 -205
  78. package/reference/sdk/framework/tutorial-system.mdx +2 -2
  79. package/reference/sdk/human-in-the-loop.mdx +152 -0
  80. package/reference/sdk/index.mdx +6 -7
  81. package/reference/sdk/platform-tools/adapters-platform.mdx +3 -1
  82. package/reference/sdk/platform-tools/index.mdx +12 -0
  83. package/reference/sdk/platform-tools/type-safety.mdx +4 -0
  84. package/reference/sdk/project-deployment-spec.mdx +131 -0
  85. package/reference/sdk/resources/index.mdx +21 -7
  86. package/reference/sdk/resources/patterns.mdx +54 -24
  87. package/reference/sdk/resources/types.mdx +7 -4
  88. package/reference/sdk/templates/data-enrichment.mdx +7 -3
  89. package/reference/sdk/templates/email-sender.mdx +139 -135
  90. package/reference/sdk/templates/lead-scorer.mdx +5 -1
  91. package/reference/sdk/templates/pdf-generator.mdx +155 -151
  92. package/reference/sdk/templates/recurring-job.mdx +195 -189
  93. package/reference/sdk/templates/text-classifier.mdx +4 -0
  94. package/reference/sdk/templates/web-scraper.mdx +139 -135
  95. package/reference/spine/spine-primer.md +135 -96
  96. package/reference/ui/exports.mdx +1 -0
  97. package/reference/ui/index.mdx +14 -7
  98. package/dist/types/worker/adapters/anymailfinder.d.ts +0 -14
  99. package/dist/types/worker/adapters/apify.d.ts +0 -14
  100. package/dist/types/worker/adapters/approval.d.ts +0 -23
  101. package/dist/types/worker/adapters/attio.d.ts +0 -22
  102. package/dist/types/worker/adapters/clickup.d.ts +0 -22
  103. package/dist/types/worker/adapters/create-adapter.d.ts +0 -41
  104. package/dist/types/worker/adapters/crm.d.ts +0 -20
  105. package/dist/types/worker/adapters/dropbox.d.ts +0 -14
  106. package/dist/types/worker/adapters/email.d.ts +0 -25
  107. package/dist/types/worker/adapters/execution.d.ts +0 -22
  108. package/dist/types/worker/adapters/gmail.d.ts +0 -14
  109. package/dist/types/worker/adapters/google-sheets.d.ts +0 -14
  110. package/dist/types/worker/adapters/index.d.ts +0 -33
  111. package/dist/types/worker/adapters/instantly.d.ts +0 -14
  112. package/dist/types/worker/adapters/lead.d.ts +0 -28
  113. package/dist/types/worker/adapters/list.d.ts +0 -9
  114. package/dist/types/worker/adapters/llm.d.ts +0 -45
  115. package/dist/types/worker/adapters/millionverifier.d.ts +0 -14
  116. package/dist/types/worker/adapters/notification.d.ts +0 -28
  117. package/dist/types/worker/adapters/pdf.d.ts +0 -22
  118. package/dist/types/worker/adapters/projects.d.ts +0 -20
  119. package/dist/types/worker/adapters/resend.d.ts +0 -14
  120. package/dist/types/worker/adapters/scheduler.d.ts +0 -25
  121. package/dist/types/worker/adapters/signature-api.d.ts +0 -14
  122. package/dist/types/worker/adapters/storage.d.ts +0 -33
  123. package/dist/types/worker/adapters/stripe.d.ts +0 -14
  124. package/dist/types/worker/adapters/tomba.d.ts +0 -14
  125. package/dist/types/worker/index.d.ts +0 -60
  126. package/dist/types/worker/platform.d.ts +0 -90
  127. package/dist/types/worker/utils.d.ts +0 -9
  128. package/reference/claude-config/Overview.md +0 -230
  129. package/reference/claude-config/hooks/post-edit-validate.mjs +0 -98
  130. package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +0 -187
  131. package/reference/claude-config/hooks/tool-failure-recovery.mjs +0 -73
  132. package/reference/claude-config/registries/graph-skills.json +0 -4
  133. package/reference/claude-config/registries/knowledge-flags.json +0 -154
  134. package/reference/claude-config/registries/skill-coverage.json +0 -20
  135. package/reference/claude-config/rules/active-change-index.md +0 -22
  136. package/reference/claude-config/rules/agent-start-here.md +0 -22
  137. package/reference/claude-config/rules/deployment.md +0 -22
  138. package/reference/claude-config/rules/error-handling.md +0 -22
  139. package/reference/claude-config/rules/execution.md +0 -22
  140. package/reference/claude-config/rules/frontend.md +0 -22
  141. package/reference/claude-config/rules/observability.md +0 -22
  142. package/reference/claude-config/rules/operations.md +0 -22
  143. package/reference/claude-config/rules/organization-model.md +0 -22
  144. package/reference/claude-config/rules/organization-os.md +0 -22
  145. package/reference/claude-config/rules/package-taxonomy.md +0 -22
  146. package/reference/claude-config/rules/platform.md +0 -22
  147. package/reference/claude-config/rules/shared-types.md +0 -22
  148. package/reference/claude-config/rules/task-tracking.md +0 -22
  149. package/reference/claude-config/rules/topbar-actions.md +0 -70
  150. package/reference/claude-config/rules/ui.md +0 -22
  151. package/reference/claude-config/rules/vibe.md +0 -22
  152. package/reference/claude-config/scripts/statusline-command.js +0 -18
  153. package/reference/claude-config/settings.json +0 -30
  154. package/reference/claude-config/skills/client/SKILL.md +0 -201
  155. package/reference/claude-config/skills/deploy/SKILL.md +0 -159
  156. package/reference/claude-config/skills/dsp/SKILL.md +0 -66
  157. package/reference/claude-config/skills/elevasis/SKILL.md +0 -251
  158. package/reference/claude-config/skills/explore/SKILL.md +0 -78
  159. package/reference/claude-config/skills/git-sync/SKILL.md +0 -166
  160. package/reference/claude-config/skills/om/SKILL.md +0 -475
  161. package/reference/claude-config/skills/om/operations/build.md +0 -237
  162. package/reference/claude-config/skills/om/operations/codify-level-a.md +0 -109
  163. package/reference/claude-config/skills/om/operations/codify-level-b.md +0 -159
  164. package/reference/claude-config/skills/om/operations/customers.md +0 -114
  165. package/reference/claude-config/skills/om/operations/features.md +0 -88
  166. package/reference/claude-config/skills/om/operations/goals.md +0 -123
  167. package/reference/claude-config/skills/om/operations/identity.md +0 -97
  168. package/reference/claude-config/skills/om/operations/labels.md +0 -110
  169. package/reference/claude-config/skills/om/operations/offerings.md +0 -114
  170. package/reference/claude-config/skills/om/operations/roles.md +0 -104
  171. package/reference/claude-config/skills/om/operations/scaffold.md +0 -163
  172. package/reference/claude-config/skills/om/operations/techStack.md +0 -38
  173. package/reference/claude-config/skills/project/SKILL.md +0 -1114
  174. package/reference/claude-config/skills/run-ui/SKILL.md +0 -73
  175. package/reference/claude-config/skills/save/SKILL.md +0 -183
  176. package/reference/claude-config/skills/setup/SKILL.md +0 -290
  177. package/reference/claude-config/skills/status/SKILL.md +0 -59
  178. package/reference/claude-config/skills/submit-request/SKILL.md +0 -180
  179. package/reference/claude-config/skills/sync/SKILL.md +0 -47
  180. package/reference/claude-config/skills/tutorial/SKILL.md +0 -259
  181. package/reference/claude-config/skills/tutorial/progress-template.md +0 -74
  182. package/reference/claude-config/skills/tutorial/technical.md +0 -1303
  183. package/reference/claude-config/skills/tutorial/vibe-coder.md +0 -890
  184. package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +0 -27
  185. package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +0 -30
  186. package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +0 -73
  187. package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +0 -86
  188. package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +0 -55
  189. package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +0 -97
  190. package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +0 -112
  191. package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +0 -93
  192. package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +0 -58
  193. package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +0 -56
  194. package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +0 -71
  195. package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +0 -83
  196. package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +0 -59
  197. package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +0 -42
  198. package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +0 -60
  199. package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +0 -37
  200. package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +0 -34
  201. package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +0 -38
  202. package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +0 -32
  203. package/reference/claude-config/sync-notes/2026-05-09-command-system.md +0 -33
  204. package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +0 -69
  205. package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +0 -30
  206. package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +0 -45
  207. package/reference/claude-config/sync-notes/2026-05-15-om-skill-rename-and-write-family.md +0 -52
  208. package/reference/claude-config/sync-notes/2026-05-17-sdk-boundary-consolidation.md +0 -33
  209. package/reference/claude-config/sync-notes/2026-05-20-om-define-helpers.md +0 -32
  210. package/reference/claude-config/sync-notes/2026-05-22-access-model-and-right-panel.md +0 -43
  211. package/reference/claude-config/sync-notes/2026-05-22-lead-gen-tenant-config.md +0 -40
  212. package/reference/claude-config/sync-notes/2026-05-22-org-model-multi-file-split.md +0 -61
  213. package/reference/claude-config/sync-notes/2026-05-23-branding-names-to-identity.md +0 -49
  214. package/reference/claude-config/sync-notes/2026-05-23-lead-gen-manage-access.md +0 -31
  215. package/reference/claude-config/sync-notes/2026-05-23-om-deployment-drift-detection.md +0 -42
  216. package/reference/claude-config/sync-notes/2026-05-23-om-full-model-deploy-contract.md +0 -33
  217. package/reference/claude-config/sync-notes/2026-05-23-ui-sdk-package-fixes.md +0 -37
  218. package/reference/claude-config/sync-notes/2026-05-24-platform-invite-router-core-baseline.md +0 -28
  219. package/reference/claude-config/sync-notes/2026-05-24-system-interface-readiness.md +0 -43
  220. package/reference/claude-config/sync-notes/2026-05-25-invitation-login-loader.md +0 -26
  221. package/reference/claude-config/sync-notes/2026-05-25-om-topbar-requests.md +0 -33
  222. package/reference/claude-config/sync-notes/2026-05-25-system-interface-profile-registry-and-substrate.md +0 -35
  223. package/reference/claude-config/sync-notes/2026-05-25-tenant-om-scaffold-cli.md +0 -49
  224. package/reference/claude-config/sync-notes/2026-05-25-vibe-operate-intent.md +0 -47
  225. package/reference/claude-config/sync-notes/2026-05-28-om-snapshot-sdk-workflow-config.md +0 -33
  226. package/reference/claude-config/sync-notes/2026-05-30-client-source-and-om-profiles.md +0 -39
  227. package/reference/claude-config/sync-notes/2026-06-02-knowledge-nested-group-routing.md +0 -27
  228. package/reference/claude-config/sync-notes/2026-06-02-nest-projects-under-platform.md +0 -45
  229. package/reference/claude-config/sync-notes/2026-06-03-skill-autogen-and-client-skill.md +0 -34
  230. package/reference/claude-config/sync-notes/2026-06-04-scaffold-registry-lane-severity.md +0 -34
  231. package/reference/claude-config/sync-notes/2026-06-05-appearance-app-mode-decouple.md +0 -29
  232. package/reference/claude-config/sync-notes/2026-06-05-ontology-endpoint-rename-and-knowledge-browser-ui.md +0 -86
  233. package/reference/claude-config/sync-notes/2026-06-06-om-build-systems-scaffold.md +0 -47
  234. package/reference/claude-config/sync-notes/2026-06-06-om-item-copy-references.md +0 -50
  235. package/reference/claude-config/sync-notes/2026-06-08-knowledge-base-page-not-found-fix.md +0 -76
  236. package/reference/claude-config/sync-notes/2026-06-09-agent-sessions-public-agent-chat-route.md +0 -75
  237. package/reference/claude-config/sync-notes/2026-06-09-sdk-cli-load-org-model-resolution.md +0 -42
  238. package/reference/claude-config/sync-notes/2026-06-12-agent-grants-visualizer-operations.md +0 -30
  239. package/reference/claude-config/sync-notes/2026-06-14-session-ux-and-project-cli-json.md +0 -33
  240. package/reference/claude-config/sync-notes/2026-06-14-shared-session-conversation-view.md +0 -26
  241. package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +0 -46
  242. package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +0 -34
  243. package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +0 -52
  244. package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +0 -47
  245. package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +0 -75
  246. package/reference/claude-config/sync-notes/2026-07-23-agent-session-memory.md +0 -49
  247. package/reference/claude-config/sync-notes/2026-07-23-workos-org-marker.md +0 -50
  248. package/reference/claude-config/sync-notes/2026-07-24-claude-5-models-and-session-surface-fixes.md +0 -116
  249. package/reference/claude-config/sync-notes/2026-07-27-agent-strict-output-and-turn-drift.md +0 -73
  250. package/reference/claude-config/sync-notes/2026-07-28-agent-reply-is-its-own-field.md +0 -84
  251. package/reference/claude-config/sync-notes/2026-07-30-login-screen-and-member-provisioning-state.md +0 -114
  252. package/reference/claude-config/sync-notes/2026-08-02-auth-guard-defaults-and-truncation-fix.md +0 -122
  253. package/reference/claude-config/sync-notes/2026-08-03-agent-prose-escape-normalization.md +0 -88
  254. package/reference/claude-config/sync-notes/2026-08-03-cli-gateway-errors-and-request-timeout.md +0 -120
  255. package/reference/claude-config/sync-notes/README.md +0 -43
  256. package/reference/sdk/framework/interaction-guidance.mdx +0 -182
  257. package/reference/sdk/framework/memory.mdx +0 -326
  258. package/reference/sdk/framework/resource-documentation.mdx +0 -90
  259. package/reference/sdk/roadmap.mdx +0 -164
@@ -1,135 +1,139 @@
1
- ---
2
- title: "Template: Email Sender"
3
- description: "Transactional email via Resend with template support -- send styled emails to one or multiple recipients"
4
- loadWhen: "Applying the email-sender workflow template"
5
- ---
6
-
7
- **Category:** Communication
8
-
9
- **Platform Tools:** `resend` (send email)
10
-
11
- **Credentials Required:**
12
-
13
- - `my-resend` -- Resend API key (bearer type)
14
-
15
- ---
16
-
17
- ## What This Workflow Does
18
-
19
- Sends a transactional email to one or more recipients using the Resend email service. Supports plain text and HTML content, reply-to addresses, and CC/BCC. Suitable for welcome emails, notification emails, confirmation emails, and any triggered transactional communication.
20
-
21
- ---
22
-
23
- ## Input Schema
24
-
25
- ```typescript
26
- z.object({
27
- to: z.union([z.string(), z.array(z.string())]), // Recipient(s)
28
- subject: z.string(), // Email subject
29
- html: z.string().optional(), // HTML body
30
- text: z.string().optional(), // Plain text body (fallback)
31
- from: z.string().optional(), // Sender (defaults to workspace default)
32
- replyTo: z.string().optional(), // Reply-to address
33
- })
34
- ```
35
-
36
- ## Output Schema
37
-
38
- ```typescript
39
- z.object({
40
- sent: z.boolean(),
41
- messageId: z.string().optional(),
42
- error: z.string().optional(),
43
- })
44
- ```
45
-
46
- ---
47
-
48
- ## Workflow Code Pattern
49
-
50
- ```typescript
51
- import type { WorkflowDefinition } from '@elevasis/sdk'
52
- import { platform, PlatformToolError } from '@elevasis/sdk/worker'
53
- import { z } from 'zod'
54
-
55
- const inputSchema = z.object({
56
- to: z.union([z.string(), z.array(z.string())]),
57
- subject: z.string(),
58
- html: z.string().optional(),
59
- text: z.string().optional(),
60
- from: z.string().optional(),
61
- replyTo: z.string().optional(),
62
- })
63
- const outputSchema = z.object({
64
- sent: z.boolean(),
65
- messageId: z.string().optional(),
66
- error: z.string().optional(),
67
- })
68
-
69
- type Input = z.infer<typeof inputSchema>
70
-
71
- export const emailSender: WorkflowDefinition = {
72
- config: {
73
- resourceId: 'email-sender',
74
- name: 'Email Sender',
75
- type: 'workflow',
76
- description: 'Sends transactional email via Resend',
77
- version: '1.0.0',
78
- status: 'dev',
79
- },
80
- contract: { inputSchema, outputSchema },
81
- steps: {
82
- send: {
83
- id: 'send',
84
- name: 'Send Email',
85
- description: 'Send the email via Resend',
86
- inputSchema,
87
- outputSchema,
88
- handler: async (input, context) => {
89
- const { to, subject, html, text, from, replyTo } = input as Input
90
-
91
- try {
92
- const result = await platform.call({
93
- tool: 'resend',
94
- method: 'sendEmail',
95
- credential: 'my-resend',
96
- params: {
97
- to: Array.isArray(to) ? to : [to],
98
- subject,
99
- html: html ?? `<p>${text ?? ''}</p>`,
100
- text,
101
- from: from ?? 'noreply@yourdomain.com',
102
- replyTo,
103
- },
104
- }) as { id: string }
105
-
106
- context.logger.info('Email sent', { messageId: result.id, to })
107
- return { sent: true, messageId: result.id }
108
- } catch (err) {
109
- if (err instanceof PlatformToolError) {
110
- context.logger.error('Email send failed', { error: err.message, to })
111
- return { sent: false, error: err.message }
112
- }
113
- throw err
114
- }
115
- },
116
- next: null,
117
- },
118
- },
119
- entryPoint: 'send',
120
- }
121
- ```
122
-
123
- ---
124
-
125
- ## Adaptation Notes
126
-
127
- - **Credential name:** Replace `'my-resend'` with the user's Resend credential name.
128
- - **From address:** Replace `'noreply@yourdomain.com'` with the user's verified sender address (must be verified in Resend).
129
- - **HTML vs text:** For beginners, suggest writing plain text first and adding HTML later. For developers, show both.
130
- - **Error handling:** The template returns `{ sent: false, error }` on failure rather than throwing, suitable for non-critical emails. For critical notifications, change to `throw err` so the execution fails visibly.
131
- - **Multi-step context:** This template is a single step, but it can be used as the last step of a multi-step workflow (e.g., "process data then send summary email").
132
-
133
- ---
134
-
135
- **Last Updated:** 2026-02-26
1
+ ---
2
+ title: "Template: Email Sender"
3
+ description: "Transactional email via Resend with template support -- send styled emails to one or multiple recipients"
4
+ loadWhen: "Applying the email-sender workflow template"
5
+ ---
6
+
7
+ **Category:** Communication
8
+
9
+ **Platform Tools:** `resend` (send email)
10
+
11
+ **Credentials Required:**
12
+
13
+ - `my-resend` -- Resend API key (bearer type)
14
+
15
+ ---
16
+
17
+ ## What This Workflow Does
18
+
19
+ Sends a transactional email to one or more recipients using the Resend email service. Supports plain text and HTML content, reply-to addresses, and CC/BCC. Suitable for welcome emails, notification emails, confirmation emails, and any triggered transactional communication.
20
+
21
+ ---
22
+
23
+ ## Input Schema
24
+
25
+ {/* doc-snippet:skip: illustrative excerpt -- shows the schema shape in isolation, omits the `import { z } from 'zod'` shown in Workflow Code Pattern below */}
26
+
27
+ ```typescript
28
+ z.object({
29
+ to: z.union([z.string(), z.array(z.string())]), // Recipient(s)
30
+ subject: z.string(), // Email subject
31
+ html: z.string().optional(), // HTML body
32
+ text: z.string().optional(), // Plain text body (fallback)
33
+ from: z.string().optional(), // Sender (defaults to workspace default)
34
+ replyTo: z.string().optional(), // Reply-to address
35
+ })
36
+ ```
37
+
38
+ ## Output Schema
39
+
40
+ {/* doc-snippet:skip: illustrative excerpt -- shows the schema shape in isolation, omits the `import { z } from 'zod'` shown in Workflow Code Pattern below */}
41
+
42
+ ```typescript
43
+ z.object({
44
+ sent: z.boolean(),
45
+ messageId: z.string().optional(),
46
+ error: z.string().optional(),
47
+ })
48
+ ```
49
+
50
+ ---
51
+
52
+ ## Workflow Code Pattern
53
+
54
+ ```typescript
55
+ import type { WorkflowDefinition } from '@elevasis/sdk'
56
+ import { platform, PlatformToolError } from '@elevasis/sdk/worker'
57
+ import { z } from 'zod'
58
+
59
+ const inputSchema = z.object({
60
+ to: z.union([z.string(), z.array(z.string())]),
61
+ subject: z.string(),
62
+ html: z.string().optional(),
63
+ text: z.string().optional(),
64
+ from: z.string().optional(),
65
+ replyTo: z.string().optional(),
66
+ })
67
+ const outputSchema = z.object({
68
+ sent: z.boolean(),
69
+ messageId: z.string().optional(),
70
+ error: z.string().optional(),
71
+ })
72
+
73
+ type Input = z.infer<typeof inputSchema>
74
+
75
+ export const emailSender: WorkflowDefinition = {
76
+ config: {
77
+ resourceId: 'email-sender',
78
+ name: 'Email Sender',
79
+ type: 'workflow',
80
+ description: 'Sends transactional email via Resend',
81
+ version: '1.0.0',
82
+ status: 'dev',
83
+ },
84
+ contract: { inputSchema, outputSchema },
85
+ steps: {
86
+ send: {
87
+ id: 'send',
88
+ name: 'Send Email',
89
+ description: 'Send the email via Resend',
90
+ inputSchema,
91
+ outputSchema,
92
+ handler: async (input, context) => {
93
+ const { to, subject, html, text, from, replyTo } = input as Input
94
+
95
+ try {
96
+ const result = await platform.call({
97
+ tool: 'resend',
98
+ method: 'sendEmail',
99
+ credential: 'my-resend',
100
+ params: {
101
+ to: Array.isArray(to) ? to : [to],
102
+ subject,
103
+ html: html ?? `<p>${text ?? ''}</p>`,
104
+ text,
105
+ from: from ?? 'noreply@yourdomain.com',
106
+ replyTo,
107
+ },
108
+ }) as { id: string }
109
+
110
+ context.logger.info(`Email sent: ${result.id} to ${JSON.stringify(to)}`)
111
+ return { sent: true, messageId: result.id }
112
+ } catch (err) {
113
+ if (err instanceof PlatformToolError) {
114
+ context.logger.error(`Email send failed for ${JSON.stringify(to)}: ${err.message}`)
115
+ return { sent: false, error: err.message }
116
+ }
117
+ throw err
118
+ }
119
+ },
120
+ next: null,
121
+ },
122
+ },
123
+ entryPoint: 'send',
124
+ }
125
+ ```
126
+
127
+ ---
128
+
129
+ ## Adaptation Notes
130
+
131
+ - **Credential name:** Replace `'my-resend'` with the user's Resend credential name.
132
+ - **From address:** Replace `'noreply@yourdomain.com'` with the user's verified sender address (must be verified in Resend).
133
+ - **HTML vs text:** For beginners, suggest writing plain text first and adding HTML later. For developers, show both.
134
+ - **Error handling:** The template returns `{ sent: false, error }` on failure rather than throwing, suitable for non-critical emails. For critical notifications, change to `throw err` so the execution fails visibly.
135
+ - **Multi-step context:** This template is a single step, but it can be used as the last step of a multi-step workflow (e.g., "process data then send summary email").
136
+
137
+ ---
138
+
139
+ **Last Updated:** 2026-02-26
@@ -23,6 +23,8 @@ Receives a lead with company and contact details, uses an LLM to score the lead
23
23
 
24
24
  ## Input Schema
25
25
 
26
+ {/* doc-snippet:skip: illustrative excerpt -- shows the schema shape in isolation, omits the `import { z } from 'zod'` shown in Workflow Code Pattern below */}
27
+
26
28
  ```typescript
27
29
  z.object({
28
30
  leadId: z.string(),
@@ -36,6 +38,8 @@ z.object({
36
38
 
37
39
  ## Output Schema
38
40
 
41
+ {/* doc-snippet:skip: illustrative excerpt -- shows the schema shape in isolation, omits the `import { z } from 'zod'` shown in Workflow Code Pattern below */}
42
+
39
43
  ```typescript
40
44
  z.object({
41
45
  leadId: z.string(),
@@ -150,7 +154,7 @@ export const leadScorer: WorkflowDefinition = {
150
154
  },
151
155
  })
152
156
 
153
- context.logger.info('Lead scored and stored', { leadId, score, tier })
157
+ context.logger.info(`Lead ${leadId} scored ${score} (${tier}) and stored`)
154
158
  return { leadId, score, tier, reasoning, stored: true }
155
159
  },
156
160
  next: null,
@@ -1,151 +1,155 @@
1
- ---
2
- title: "Template: PDF Generator"
3
- description: "PDF generation from structured data with platform storage upload -- render a PDF from a template and upload to platform storage"
4
- loadWhen: "Applying the pdf-generator workflow template"
5
- ---
6
-
7
- **Category:** Documents
8
-
9
- **Platform Tools:** `pdf` (render), `storage` (upload)
10
-
11
- **Credentials Required:**
12
-
13
- - None required (pdf and storage are platform services, not integrations)
14
-
15
- ---
16
-
17
- ## What This Workflow Does
18
-
19
- Receives structured data, renders a PDF using an HTML template, uploads the result to platform storage, and returns a signed URL for download. Suitable for invoices, reports, certificates, contracts, and any document that needs to be generated on demand and delivered as a downloadable file.
20
-
21
- ---
22
-
23
- ## Input Schema
24
-
25
- ```typescript
26
- z.object({
27
- templateHtml: z.string(), // HTML template with {variable} placeholders
28
- data: z.record(z.unknown()), // Data to inject into the template
29
- filename: z.string(), // Output filename (without .pdf extension)
30
- expiresInSeconds: z.number().optional(), // Signed URL expiry (default: 3600)
31
- })
32
- ```
33
-
34
- ## Output Schema
35
-
36
- ```typescript
37
- z.object({
38
- downloadUrl: z.string(), // Signed URL for the generated PDF
39
- storageKey: z.string(), // Storage key for future reference
40
- expiresAt: z.string(), // ISO timestamp when URL expires
41
- })
42
- ```
43
-
44
- ---
45
-
46
- ## Workflow Code Pattern
47
-
48
- ```typescript
49
- import type { WorkflowDefinition } from '@elevasis/sdk'
50
- import { StepType } from '@elevasis/sdk'
51
- import { platform } from '@elevasis/sdk/worker'
52
- import { z } from 'zod'
53
-
54
- const inputSchema = z.object({
55
- templateHtml: z.string(),
56
- data: z.record(z.unknown()),
57
- filename: z.string(),
58
- expiresInSeconds: z.number().optional(),
59
- })
60
- const outputSchema = z.object({
61
- downloadUrl: z.string(),
62
- storageKey: z.string(),
63
- expiresAt: z.string(),
64
- })
65
-
66
- type Input = z.infer<typeof inputSchema>
67
-
68
- function renderTemplate(html: string, data: Record<string, unknown>): string {
69
- return html.replace(/\{(\w+)\}/g, (_, key) => String(data[key] ?? ''))
70
- }
71
-
72
- export const pdfGenerator: WorkflowDefinition = {
73
- config: {
74
- resourceId: 'pdf-generator',
75
- name: 'PDF Generator',
76
- type: 'workflow',
77
- description: 'Generates a PDF from HTML template and uploads to storage',
78
- version: '1.0.0',
79
- status: 'dev',
80
- },
81
- contract: { inputSchema, outputSchema },
82
- steps: {
83
- render: {
84
- id: 'render',
85
- name: 'Render PDF',
86
- description: 'Render HTML template to PDF buffer',
87
- inputSchema,
88
- outputSchema: z.object({ buffer: z.string(), filename: z.string(), expiresInSeconds: z.number() }),
89
- handler: async (input) => {
90
- const { templateHtml, data, filename, expiresInSeconds } = input as Input
91
- const html = renderTemplate(templateHtml, data)
92
-
93
- const result = await platform.call({
94
- tool: 'pdf',
95
- method: 'renderToBuffer',
96
- params: { html },
97
- }) as { buffer: string } // base64-encoded buffer
98
-
99
- return { buffer: result.buffer, filename, expiresInSeconds: expiresInSeconds ?? 3600 }
100
- },
101
- next: { type: StepType.LINEAR, target: 'upload' },
102
- },
103
- upload: {
104
- id: 'upload',
105
- name: 'Upload PDF',
106
- description: 'Upload rendered PDF to platform storage and get signed URL',
107
- inputSchema: z.object({ buffer: z.string(), filename: z.string(), expiresInSeconds: z.number() }),
108
- outputSchema,
109
- handler: async (input, context) => {
110
- const { buffer, filename, expiresInSeconds } = input as { buffer: string; filename: string; expiresInSeconds: number }
111
- const key = `documents/${filename}-${Date.now()}.pdf`
112
-
113
- await platform.call({
114
- tool: 'storage',
115
- method: 'upload',
116
- params: {
117
- key,
118
- content: buffer,
119
- contentType: 'application/pdf',
120
- },
121
- })
122
-
123
- const urlResult = await platform.call({
124
- tool: 'storage',
125
- method: 'createSignedUrl',
126
- params: { key, expiresIn: expiresInSeconds },
127
- }) as { signedUrl: string; expiresAt: string }
128
-
129
- context.logger.info('PDF generated and uploaded', { key, filename })
130
- return { downloadUrl: urlResult.signedUrl, storageKey: key, expiresAt: urlResult.expiresAt }
131
- },
132
- next: null,
133
- },
134
- },
135
- entryPoint: 'render',
136
- }
137
- ```
138
-
139
- ---
140
-
141
- ## Adaptation Notes
142
-
143
- - **Template format:** The simple `{variable}` placeholder system handles most cases. For complex documents, suggest the user write a more complete HTML template with inline CSS.
144
- - **Filename:** The template appends a timestamp to avoid collisions. Adapt naming to the user's convention (e.g., `invoice-{invoiceId}`).
145
- - **Expiry:** Default is 1 hour. For document delivery workflows, increase to 24-72 hours.
146
- - **Data structure:** Ask the user what fields their document needs before defining the `data` schema. For typed use cases (invoices, reports), define a stricter input schema.
147
- - **Skill adaptation:** For beginners, show a complete example HTML template and explain what "template variables" are.
148
-
149
- ---
150
-
151
- **Last Updated:** 2026-02-26
1
+ ---
2
+ title: "Template: PDF Generator"
3
+ description: "PDF generation from structured data with platform storage upload -- render a PDF from a template and upload to platform storage"
4
+ loadWhen: "Applying the pdf-generator workflow template"
5
+ ---
6
+
7
+ **Category:** Documents
8
+
9
+ **Platform Tools:** `pdf` (render), `storage` (upload)
10
+
11
+ **Credentials Required:**
12
+
13
+ - None required (pdf and storage are platform services, not integrations)
14
+
15
+ ---
16
+
17
+ ## What This Workflow Does
18
+
19
+ Receives structured data, renders a PDF using an HTML template, uploads the result to platform storage, and returns a signed URL for download. Suitable for invoices, reports, certificates, contracts, and any document that needs to be generated on demand and delivered as a downloadable file.
20
+
21
+ ---
22
+
23
+ ## Input Schema
24
+
25
+ {/* doc-snippet:skip: illustrative excerpt -- shows the schema shape in isolation, omits the `import { z } from 'zod'` shown in Workflow Code Pattern below */}
26
+
27
+ ```typescript
28
+ z.object({
29
+ templateHtml: z.string(), // HTML template with {variable} placeholders
30
+ data: z.record(z.string(), z.unknown()), // Data to inject into the template
31
+ filename: z.string(), // Output filename (without .pdf extension)
32
+ expiresInSeconds: z.number().optional(), // Signed URL expiry (default: 3600)
33
+ })
34
+ ```
35
+
36
+ ## Output Schema
37
+
38
+ {/* doc-snippet:skip: illustrative excerpt -- shows the schema shape in isolation, omits the `import { z } from 'zod'` shown in Workflow Code Pattern below */}
39
+
40
+ ```typescript
41
+ z.object({
42
+ downloadUrl: z.string(), // Signed URL for the generated PDF
43
+ storageKey: z.string(), // Storage key for future reference
44
+ expiresAt: z.string(), // ISO timestamp when URL expires
45
+ })
46
+ ```
47
+
48
+ ---
49
+
50
+ ## Workflow Code Pattern
51
+
52
+ ```typescript
53
+ import type { WorkflowDefinition } from '@elevasis/sdk'
54
+ import { StepType } from '@elevasis/sdk'
55
+ import { platform } from '@elevasis/sdk/worker'
56
+ import { z } from 'zod'
57
+
58
+ const inputSchema = z.object({
59
+ templateHtml: z.string(),
60
+ data: z.record(z.string(), z.unknown()),
61
+ filename: z.string(),
62
+ expiresInSeconds: z.number().optional(),
63
+ })
64
+ const outputSchema = z.object({
65
+ downloadUrl: z.string(),
66
+ storageKey: z.string(),
67
+ expiresAt: z.string(),
68
+ })
69
+
70
+ type Input = z.infer<typeof inputSchema>
71
+
72
+ function renderTemplate(html: string, data: Record<string, unknown>): string {
73
+ return html.replace(/\{(\w+)\}/g, (_, key) => String(data[key] ?? ''))
74
+ }
75
+
76
+ export const pdfGenerator: WorkflowDefinition = {
77
+ config: {
78
+ resourceId: 'pdf-generator',
79
+ name: 'PDF Generator',
80
+ type: 'workflow',
81
+ description: 'Generates a PDF from HTML template and uploads to storage',
82
+ version: '1.0.0',
83
+ status: 'dev',
84
+ },
85
+ contract: { inputSchema, outputSchema },
86
+ steps: {
87
+ render: {
88
+ id: 'render',
89
+ name: 'Render PDF',
90
+ description: 'Render HTML template to PDF buffer',
91
+ inputSchema,
92
+ outputSchema: z.object({ buffer: z.string(), filename: z.string(), expiresInSeconds: z.number() }),
93
+ handler: async (input) => {
94
+ const { templateHtml, data, filename, expiresInSeconds } = input as Input
95
+ const html = renderTemplate(templateHtml, data)
96
+
97
+ const result = await platform.call({
98
+ tool: 'pdf',
99
+ method: 'renderToBuffer',
100
+ params: { html },
101
+ }) as { buffer: string } // base64-encoded buffer
102
+
103
+ return { buffer: result.buffer, filename, expiresInSeconds: expiresInSeconds ?? 3600 }
104
+ },
105
+ next: { type: StepType.LINEAR, target: 'upload' },
106
+ },
107
+ upload: {
108
+ id: 'upload',
109
+ name: 'Upload PDF',
110
+ description: 'Upload rendered PDF to platform storage and get signed URL',
111
+ inputSchema: z.object({ buffer: z.string(), filename: z.string(), expiresInSeconds: z.number() }),
112
+ outputSchema,
113
+ handler: async (input, context) => {
114
+ const { buffer, filename, expiresInSeconds } = input as { buffer: string; filename: string; expiresInSeconds: number }
115
+ const key = `documents/${filename}-${Date.now()}.pdf`
116
+
117
+ await platform.call({
118
+ tool: 'storage',
119
+ method: 'upload',
120
+ params: {
121
+ key,
122
+ content: buffer,
123
+ contentType: 'application/pdf',
124
+ },
125
+ })
126
+
127
+ const urlResult = await platform.call({
128
+ tool: 'storage',
129
+ method: 'createSignedUrl',
130
+ params: { key, expiresIn: expiresInSeconds },
131
+ }) as { signedUrl: string; expiresAt: string }
132
+
133
+ context.logger.info(`PDF generated and uploaded: ${filename} at ${key}`)
134
+ return { downloadUrl: urlResult.signedUrl, storageKey: key, expiresAt: urlResult.expiresAt }
135
+ },
136
+ next: null,
137
+ },
138
+ },
139
+ entryPoint: 'render',
140
+ }
141
+ ```
142
+
143
+ ---
144
+
145
+ ## Adaptation Notes
146
+
147
+ - **Template format:** The simple `{variable}` placeholder system handles most cases. For complex documents, suggest the user write a more complete HTML template with inline CSS.
148
+ - **Filename:** The template appends a timestamp to avoid collisions. Adapt naming to the user's convention (e.g., `invoice-{invoiceId}`).
149
+ - **Expiry:** Default is 1 hour. For document delivery workflows, increase to 24-72 hours.
150
+ - **Data structure:** Ask the user what fields their document needs before defining the `data` schema. For typed use cases (invoices, reports), define a stricter input schema.
151
+ - **Skill adaptation:** For beginners, show a complete example HTML template and explain what "template variables" are.
152
+
153
+ ---
154
+
155
+ **Last Updated:** 2026-02-26