@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.
- package/dist/cli.cjs +35026 -30226
- package/dist/index.d.ts +1786 -808
- package/dist/index.js +789 -739
- package/dist/node/index.d.ts +105 -181
- package/dist/node/index.js +2 -2
- package/dist/test-utils/index.d.ts +901 -359
- package/dist/test-utils/index.js +587 -824
- package/dist/worker/index.d.ts +12685 -0
- package/dist/worker/index.js +188 -216
- package/package.json +4 -7
- package/reference/_navigation.md +161 -22
- package/reference/_reference-manifest.json +228 -4
- package/reference/claude-config.md +8 -0
- package/reference/core/exports.mdx +2 -0
- package/reference/core/index.mdx +3 -3
- package/reference/examples/organization-model.ts +117 -111
- package/reference/index.mdx +4 -4
- package/reference/packages/core/src/business/README.md +4 -1
- package/reference/packages/core/src/content/README.md +19 -0
- package/reference/packages/core/src/organization-model/README.md +148 -149
- package/reference/packages/core/src/organization-model/readiness/README.md +42 -0
- package/reference/packages/ui/src/features/README.md +28 -28
- package/reference/rules/active-change-index.md +40 -54
- package/reference/rules/agent-runtime.md +81 -0
- package/reference/rules/agent-start-here.md +71 -163
- package/reference/rules/deployment.md +33 -10
- package/reference/rules/error-handling.md +26 -0
- package/reference/rules/execution.md +13 -0
- package/reference/rules/frontend.md +10 -3
- package/reference/rules/observability.md +9 -1
- package/reference/rules/operations.md +26 -17
- package/reference/rules/organization-model.md +74 -88
- package/reference/rules/organization-os.md +71 -88
- package/reference/rules/package-taxonomy.md +11 -2
- package/reference/rules/platform.md +13 -7
- package/reference/rules/shared-types.md +36 -0
- package/reference/rules/task-tracking.md +30 -5
- package/reference/rules/ui.md +145 -3
- package/reference/rules/vibe-intents.md +271 -0
- package/reference/rules/vibe.md +17 -243
- package/reference/scaffold/core/organization-graph.mdx +112 -99
- package/reference/scaffold/core/organization-model.mdx +231 -215
- package/reference/scaffold/operations/propagation-pipeline.md +16 -17
- package/reference/scaffold/operations/scaffold-maintenance.md +22 -20
- package/reference/scaffold/operations/workflow-recipes.md +72 -20
- package/reference/scaffold/recipes/add-a-feature.md +156 -146
- package/reference/scaffold/recipes/add-a-resource.md +123 -117
- package/reference/scaffold/recipes/customize-crm-actions.md +28 -13
- package/reference/scaffold/recipes/customize-knowledge-browser.md +52 -117
- package/reference/scaffold/recipes/customize-organization-model.md +161 -149
- package/reference/scaffold/recipes/extend-a-base-entity.md +156 -140
- package/reference/scaffold/recipes/extend-content.md +265 -0
- package/reference/scaffold/recipes/extend-crm.md +16 -11
- package/reference/scaffold/recipes/extend-lead-gen.md +37 -21
- package/reference/scaffold/recipes/gate-by-feature-or-admin.md +160 -118
- package/reference/scaffold/recipes/index.md +6 -3
- package/reference/scaffold/recipes/query-the-knowledge-graph.md +23 -23
- package/reference/scaffold/reference/contracts.md +30 -56
- package/reference/scaffold/reference/feature-registry.md +3 -0
- package/reference/scaffold/reference/glossary.md +4 -4
- package/reference/scaffold/reference/system-interface-capabilities.md +5 -4
- package/reference/scaffold/ui/composition-extensibility.mdx +271 -232
- package/reference/scaffold/ui/customization.md +2 -2
- package/reference/scaffold/ui/feature-flags-and-gating.md +14 -6
- package/reference/scaffold/ui/feature-shell.mdx +277 -62
- package/reference/scaffold/ui/recipes.md +229 -197
- package/reference/sdk/cli-management.mdx +166 -33
- package/reference/sdk/cli.mdx +90 -13
- package/reference/sdk/concepts.mdx +2 -0
- package/reference/sdk/define-builders.mdx +76 -0
- package/reference/sdk/deployment/command-center.mdx +6 -2
- package/reference/sdk/deployment/execution-reference.mdx +64 -186
- package/reference/sdk/deployment/index.mdx +2 -0
- package/reference/sdk/exports.mdx +4 -4
- package/reference/sdk/framework/agent.mdx +52 -116
- package/reference/sdk/framework/index.mdx +46 -65
- package/reference/sdk/framework/project-structure.mdx +150 -205
- package/reference/sdk/framework/tutorial-system.mdx +2 -2
- package/reference/sdk/human-in-the-loop.mdx +152 -0
- package/reference/sdk/index.mdx +6 -7
- package/reference/sdk/platform-tools/adapters-platform.mdx +3 -1
- package/reference/sdk/platform-tools/index.mdx +12 -0
- package/reference/sdk/platform-tools/type-safety.mdx +4 -0
- package/reference/sdk/project-deployment-spec.mdx +131 -0
- package/reference/sdk/resources/index.mdx +21 -7
- package/reference/sdk/resources/patterns.mdx +54 -24
- package/reference/sdk/resources/types.mdx +7 -4
- package/reference/sdk/templates/data-enrichment.mdx +7 -3
- package/reference/sdk/templates/email-sender.mdx +139 -135
- package/reference/sdk/templates/lead-scorer.mdx +5 -1
- package/reference/sdk/templates/pdf-generator.mdx +155 -151
- package/reference/sdk/templates/recurring-job.mdx +195 -189
- package/reference/sdk/templates/text-classifier.mdx +4 -0
- package/reference/sdk/templates/web-scraper.mdx +139 -135
- package/reference/spine/spine-primer.md +135 -96
- package/reference/ui/exports.mdx +1 -0
- package/reference/ui/index.mdx +14 -7
- package/dist/types/worker/adapters/anymailfinder.d.ts +0 -14
- package/dist/types/worker/adapters/apify.d.ts +0 -14
- package/dist/types/worker/adapters/approval.d.ts +0 -23
- package/dist/types/worker/adapters/attio.d.ts +0 -22
- package/dist/types/worker/adapters/clickup.d.ts +0 -22
- package/dist/types/worker/adapters/create-adapter.d.ts +0 -41
- package/dist/types/worker/adapters/crm.d.ts +0 -20
- package/dist/types/worker/adapters/dropbox.d.ts +0 -14
- package/dist/types/worker/adapters/email.d.ts +0 -25
- package/dist/types/worker/adapters/execution.d.ts +0 -22
- package/dist/types/worker/adapters/gmail.d.ts +0 -14
- package/dist/types/worker/adapters/google-sheets.d.ts +0 -14
- package/dist/types/worker/adapters/index.d.ts +0 -33
- package/dist/types/worker/adapters/instantly.d.ts +0 -14
- package/dist/types/worker/adapters/lead.d.ts +0 -28
- package/dist/types/worker/adapters/list.d.ts +0 -9
- package/dist/types/worker/adapters/llm.d.ts +0 -45
- package/dist/types/worker/adapters/millionverifier.d.ts +0 -14
- package/dist/types/worker/adapters/notification.d.ts +0 -28
- package/dist/types/worker/adapters/pdf.d.ts +0 -22
- package/dist/types/worker/adapters/projects.d.ts +0 -20
- package/dist/types/worker/adapters/resend.d.ts +0 -14
- package/dist/types/worker/adapters/scheduler.d.ts +0 -25
- package/dist/types/worker/adapters/signature-api.d.ts +0 -14
- package/dist/types/worker/adapters/storage.d.ts +0 -33
- package/dist/types/worker/adapters/stripe.d.ts +0 -14
- package/dist/types/worker/adapters/tomba.d.ts +0 -14
- package/dist/types/worker/index.d.ts +0 -60
- package/dist/types/worker/platform.d.ts +0 -90
- package/dist/types/worker/utils.d.ts +0 -9
- package/reference/claude-config/Overview.md +0 -230
- package/reference/claude-config/hooks/post-edit-validate.mjs +0 -98
- package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +0 -187
- package/reference/claude-config/hooks/tool-failure-recovery.mjs +0 -73
- package/reference/claude-config/registries/graph-skills.json +0 -4
- package/reference/claude-config/registries/knowledge-flags.json +0 -154
- package/reference/claude-config/registries/skill-coverage.json +0 -20
- package/reference/claude-config/rules/active-change-index.md +0 -22
- package/reference/claude-config/rules/agent-start-here.md +0 -22
- package/reference/claude-config/rules/deployment.md +0 -22
- package/reference/claude-config/rules/error-handling.md +0 -22
- package/reference/claude-config/rules/execution.md +0 -22
- package/reference/claude-config/rules/frontend.md +0 -22
- package/reference/claude-config/rules/observability.md +0 -22
- package/reference/claude-config/rules/operations.md +0 -22
- package/reference/claude-config/rules/organization-model.md +0 -22
- package/reference/claude-config/rules/organization-os.md +0 -22
- package/reference/claude-config/rules/package-taxonomy.md +0 -22
- package/reference/claude-config/rules/platform.md +0 -22
- package/reference/claude-config/rules/shared-types.md +0 -22
- package/reference/claude-config/rules/task-tracking.md +0 -22
- package/reference/claude-config/rules/topbar-actions.md +0 -70
- package/reference/claude-config/rules/ui.md +0 -22
- package/reference/claude-config/rules/vibe.md +0 -22
- package/reference/claude-config/scripts/statusline-command.js +0 -18
- package/reference/claude-config/settings.json +0 -30
- package/reference/claude-config/skills/client/SKILL.md +0 -201
- package/reference/claude-config/skills/deploy/SKILL.md +0 -159
- package/reference/claude-config/skills/dsp/SKILL.md +0 -66
- package/reference/claude-config/skills/elevasis/SKILL.md +0 -251
- package/reference/claude-config/skills/explore/SKILL.md +0 -78
- package/reference/claude-config/skills/git-sync/SKILL.md +0 -166
- package/reference/claude-config/skills/om/SKILL.md +0 -475
- package/reference/claude-config/skills/om/operations/build.md +0 -237
- package/reference/claude-config/skills/om/operations/codify-level-a.md +0 -109
- package/reference/claude-config/skills/om/operations/codify-level-b.md +0 -159
- package/reference/claude-config/skills/om/operations/customers.md +0 -114
- package/reference/claude-config/skills/om/operations/features.md +0 -88
- package/reference/claude-config/skills/om/operations/goals.md +0 -123
- package/reference/claude-config/skills/om/operations/identity.md +0 -97
- package/reference/claude-config/skills/om/operations/labels.md +0 -110
- package/reference/claude-config/skills/om/operations/offerings.md +0 -114
- package/reference/claude-config/skills/om/operations/roles.md +0 -104
- package/reference/claude-config/skills/om/operations/scaffold.md +0 -163
- package/reference/claude-config/skills/om/operations/techStack.md +0 -38
- package/reference/claude-config/skills/project/SKILL.md +0 -1114
- package/reference/claude-config/skills/run-ui/SKILL.md +0 -73
- package/reference/claude-config/skills/save/SKILL.md +0 -183
- package/reference/claude-config/skills/setup/SKILL.md +0 -290
- package/reference/claude-config/skills/status/SKILL.md +0 -59
- package/reference/claude-config/skills/submit-request/SKILL.md +0 -180
- package/reference/claude-config/skills/sync/SKILL.md +0 -47
- package/reference/claude-config/skills/tutorial/SKILL.md +0 -259
- package/reference/claude-config/skills/tutorial/progress-template.md +0 -74
- package/reference/claude-config/skills/tutorial/technical.md +0 -1303
- package/reference/claude-config/skills/tutorial/vibe-coder.md +0 -890
- package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +0 -27
- package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +0 -30
- package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +0 -73
- package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +0 -86
- package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +0 -55
- package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +0 -97
- package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +0 -112
- package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +0 -93
- package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +0 -58
- package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +0 -56
- package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +0 -71
- package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +0 -83
- package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +0 -59
- package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +0 -42
- package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +0 -60
- package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +0 -37
- package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +0 -34
- package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +0 -38
- package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +0 -32
- package/reference/claude-config/sync-notes/2026-05-09-command-system.md +0 -33
- package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +0 -69
- package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +0 -30
- package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +0 -45
- package/reference/claude-config/sync-notes/2026-05-15-om-skill-rename-and-write-family.md +0 -52
- package/reference/claude-config/sync-notes/2026-05-17-sdk-boundary-consolidation.md +0 -33
- package/reference/claude-config/sync-notes/2026-05-20-om-define-helpers.md +0 -32
- package/reference/claude-config/sync-notes/2026-05-22-access-model-and-right-panel.md +0 -43
- package/reference/claude-config/sync-notes/2026-05-22-lead-gen-tenant-config.md +0 -40
- package/reference/claude-config/sync-notes/2026-05-22-org-model-multi-file-split.md +0 -61
- package/reference/claude-config/sync-notes/2026-05-23-branding-names-to-identity.md +0 -49
- package/reference/claude-config/sync-notes/2026-05-23-lead-gen-manage-access.md +0 -31
- package/reference/claude-config/sync-notes/2026-05-23-om-deployment-drift-detection.md +0 -42
- package/reference/claude-config/sync-notes/2026-05-23-om-full-model-deploy-contract.md +0 -33
- package/reference/claude-config/sync-notes/2026-05-23-ui-sdk-package-fixes.md +0 -37
- package/reference/claude-config/sync-notes/2026-05-24-platform-invite-router-core-baseline.md +0 -28
- package/reference/claude-config/sync-notes/2026-05-24-system-interface-readiness.md +0 -43
- package/reference/claude-config/sync-notes/2026-05-25-invitation-login-loader.md +0 -26
- package/reference/claude-config/sync-notes/2026-05-25-om-topbar-requests.md +0 -33
- package/reference/claude-config/sync-notes/2026-05-25-system-interface-profile-registry-and-substrate.md +0 -35
- package/reference/claude-config/sync-notes/2026-05-25-tenant-om-scaffold-cli.md +0 -49
- package/reference/claude-config/sync-notes/2026-05-25-vibe-operate-intent.md +0 -47
- package/reference/claude-config/sync-notes/2026-05-28-om-snapshot-sdk-workflow-config.md +0 -33
- package/reference/claude-config/sync-notes/2026-05-30-client-source-and-om-profiles.md +0 -39
- package/reference/claude-config/sync-notes/2026-06-02-knowledge-nested-group-routing.md +0 -27
- package/reference/claude-config/sync-notes/2026-06-02-nest-projects-under-platform.md +0 -45
- package/reference/claude-config/sync-notes/2026-06-03-skill-autogen-and-client-skill.md +0 -34
- package/reference/claude-config/sync-notes/2026-06-04-scaffold-registry-lane-severity.md +0 -34
- package/reference/claude-config/sync-notes/2026-06-05-appearance-app-mode-decouple.md +0 -29
- package/reference/claude-config/sync-notes/2026-06-05-ontology-endpoint-rename-and-knowledge-browser-ui.md +0 -86
- package/reference/claude-config/sync-notes/2026-06-06-om-build-systems-scaffold.md +0 -47
- package/reference/claude-config/sync-notes/2026-06-06-om-item-copy-references.md +0 -50
- package/reference/claude-config/sync-notes/2026-06-08-knowledge-base-page-not-found-fix.md +0 -76
- package/reference/claude-config/sync-notes/2026-06-09-agent-sessions-public-agent-chat-route.md +0 -75
- package/reference/claude-config/sync-notes/2026-06-09-sdk-cli-load-org-model-resolution.md +0 -42
- package/reference/claude-config/sync-notes/2026-06-12-agent-grants-visualizer-operations.md +0 -30
- package/reference/claude-config/sync-notes/2026-06-14-session-ux-and-project-cli-json.md +0 -33
- package/reference/claude-config/sync-notes/2026-06-14-shared-session-conversation-view.md +0 -26
- package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +0 -46
- package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +0 -34
- package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +0 -52
- package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +0 -47
- package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +0 -75
- package/reference/claude-config/sync-notes/2026-07-23-agent-session-memory.md +0 -49
- package/reference/claude-config/sync-notes/2026-07-23-workos-org-marker.md +0 -50
- package/reference/claude-config/sync-notes/2026-07-24-claude-5-models-and-session-surface-fixes.md +0 -116
- package/reference/claude-config/sync-notes/2026-07-27-agent-strict-output-and-turn-drift.md +0 -73
- package/reference/claude-config/sync-notes/2026-07-28-agent-reply-is-its-own-field.md +0 -84
- package/reference/claude-config/sync-notes/2026-07-30-login-screen-and-member-provisioning-state.md +0 -114
- package/reference/claude-config/sync-notes/2026-08-02-auth-guard-defaults-and-truncation-fix.md +0 -122
- package/reference/claude-config/sync-notes/2026-08-03-agent-prose-escape-normalization.md +0 -88
- package/reference/claude-config/sync-notes/2026-08-03-cli-gateway-errors-and-request-timeout.md +0 -120
- package/reference/claude-config/sync-notes/README.md +0 -43
- package/reference/sdk/framework/interaction-guidance.mdx +0 -182
- package/reference/sdk/framework/memory.mdx +0 -326
- package/reference/sdk/framework/resource-documentation.mdx +0 -90
- package/reference/sdk/roadmap.mdx +0 -164
|
@@ -34,7 +34,7 @@ Lead gen is a layered platform surface, not one component. Shared packages own s
|
|
|
34
34
|
| User wants | Start here | Notes |
|
|
35
35
|
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
36
36
|
| Change lead-gen System availability, labels, quick access, stage catalogs, build templates, workflow actions, resources, topology, or API readiness | `core/config/organization-model.ts` | Treat this as Organization OS work. Tenant projects own these values. Mark `sales.lead-gen.apiInterface` active only when scoped resources and ontology are ready for API-backed lead-gen actions. |
|
|
37
|
-
| Add lead-gen sidebar nav or a lead-gen route | `@elevasis/ui/features/lead-gen` and `operations/node_modules/@elevasis/sdk/reference/scaffold/ui/customization.md`
|
|
37
|
+
| Add lead-gen sidebar nav or a lead-gen route | `@elevasis/ui/features/lead-gen` and `operations/node_modules/@elevasis/sdk/reference/scaffold/ui/customization.md` | Prefer manifest/sidebar composition. Do not fork shared source first. |
|
|
38
38
|
| Wrap a shared lead-gen page with project chrome | `LeadGenOverviewPage`, `LeadGenListsPage`, `LeadGenListDetailPage`, `ListBuilderPage`, `LeadGenCompaniesPage`, `LeadGenContactsPage` | Keep route files thin and put project-specific behavior in local feature modules. |
|
|
39
39
|
| Build a custom campaign/list workspace | `ListBuilderPage`, `useLists`, `useList`, `useListProgress`, `useListExecutions`, `useWorkflowExecution`, `useExecutionSSE` from `@elevasis/ui` | Use the shared builder when possible; otherwise compose hooks for platform data and workflow execution. |
|
|
40
40
|
| Add or change list-builder workflow buttons/forms | `ui/src/config/listActions.ts` plus `ElevasisUIProvider listActions={listActions}` / `createElevasisApp({ listActions })` | The shared UI owns the registry contract. The project owns workflow ids, action keys, Zod schemas, layouts, and default inputs. |
|
|
@@ -209,7 +209,7 @@ Available field component variants: `textinput`, `textarea`, `numberinput`, `swi
|
|
|
209
209
|
```tsx
|
|
210
210
|
import * as z from 'zod'
|
|
211
211
|
import { leadGenManifest, type ListBuilderRegistry } from '@elevasis/ui/features/lead-gen'
|
|
212
|
-
import type { StepConfigLayout } from '@elevasis/ui/components
|
|
212
|
+
import type { StepConfigLayout } from '@elevasis/ui/components'
|
|
213
213
|
import { ElevasisSystemsProvider, ElevasisUIProvider } from '@elevasis/ui/provider'
|
|
214
214
|
import { organizationModel, resourceDescriptors } from '@core/config/organization-model'
|
|
215
215
|
|
|
@@ -349,21 +349,26 @@ Use `useArtifacts({ ownerKind, ownerId })` for durable JSON artifacts like audit
|
|
|
349
349
|
|
|
350
350
|
Inside deployed workflows, use worker adapters instead of browser hooks or direct database access:
|
|
351
351
|
|
|
352
|
-
External projects should define workflow input/output schemas in `@
|
|
352
|
+
External projects should define reusable workflow input/output schemas in `@core/types` (the `@core/*` tsconfig path resolves to the project's own `core/` directory); the example below assumes those shared schemas already exist. There is no `@shared/*` alias in a template-family project — do not write one.
|
|
353
|
+
|
|
354
|
+
**Do not hand-bind the OM Resource descriptor on each workflow.** `projectDeploymentSpec` in `operations/src/index.ts` takes a `getWorkflowResourceDescriptor` resolver and binds `config.resource`, `config.resourceId`, and `config.type` for every workflow centrally. It looks the descriptor up by the `config.resourceId` you author and then **overwrites `resource` and `type` unconditionally** — so setting them per workflow is dead code that reads as a contract and drifts from the model without any error. Author `resourceId` and let the spec bind the rest.
|
|
355
|
+
|
|
356
|
+
<!-- doc-snippet:skip: illustrative excerpt -- `@core/types` resolves to the project's own `core/types/` module via the `@core/*` tsconfig path, `resourceDescriptors` names the project's own resource-descriptors export, and `z` (zod) is shown unimported -->
|
|
353
357
|
|
|
354
358
|
```ts
|
|
355
359
|
// operations/src/sales/qualify-list.ts
|
|
356
360
|
import type { WorkflowDefinition } from '@elevasis/sdk'
|
|
357
361
|
import { acqDb, list } from '@elevasis/sdk/worker'
|
|
358
|
-
import { qualifyListInputSchema, qualifyListOutputSchema } from '@
|
|
362
|
+
import { qualifyListInputSchema, qualifyListOutputSchema } from '@core/types'
|
|
359
363
|
import { resourceDescriptors } from '@core/config/organization-model'
|
|
360
364
|
|
|
361
365
|
export const qualifyListWorkflow: WorkflowDefinition = {
|
|
362
366
|
config: {
|
|
363
|
-
|
|
367
|
+
// `resourceId` is the only descriptor field you author -- it is the lookup key
|
|
368
|
+
// `projectDeploymentSpec` resolves against your OM. See the note below.
|
|
364
369
|
resourceId: resourceDescriptors.qualifyList.id,
|
|
365
370
|
name: 'Qualify List',
|
|
366
|
-
|
|
371
|
+
description: 'Marks list contacts as verified based on qualification checks.',
|
|
367
372
|
version: '1.0.0',
|
|
368
373
|
status: 'dev',
|
|
369
374
|
},
|
|
@@ -372,10 +377,12 @@ export const qualifyListWorkflow: WorkflowDefinition = {
|
|
|
372
377
|
qualify: {
|
|
373
378
|
id: 'qualify',
|
|
374
379
|
name: 'Qualify',
|
|
380
|
+
description: 'Fetches list contacts and marks each verified.',
|
|
375
381
|
inputSchema: qualifyListInputSchema,
|
|
376
382
|
outputSchema: qualifyListOutputSchema,
|
|
377
383
|
next: null,
|
|
378
|
-
handler: async (
|
|
384
|
+
handler: async (rawInput, context) => {
|
|
385
|
+
const input = rawInput as z.infer<typeof qualifyListInputSchema>
|
|
379
386
|
const config = await list.getConfig({ listId: input.listId })
|
|
380
387
|
const contacts = await acqDb.listContacts({ listId: input.listId, limit: 100, offset: 0 })
|
|
381
388
|
|
|
@@ -453,14 +460,10 @@ Practical consequence: you can rename systems, restructure ontology, swap export
|
|
|
453
460
|
|
|
454
461
|
### Declaring an OM Readiness Contract
|
|
455
462
|
|
|
456
|
-
When you define a custom `readinessProfile` id (any string that is not one of the built-in presets `sales.lead-gen.api`, `sales.crm.api`, `sales.lead-gen.crm-handoff`), you must also provide a `readinessContract` on the `apiInterface` so the platform can validate structural readiness without hardcoded constants.
|
|
463
|
+
When you define a custom `readinessProfile` id (any string that is not one of the built-in presets `sales.lead-gen.api`, `sales.crm.api`, `sales.lead-gen.crm-handoff`), you must also provide a `readinessContract` on the `apiInterface` so the platform can validate structural readiness without hardcoded constants. This is mandatory — there is no `registerReadinessProfile` call that lets a custom system skip declaring a `readinessContract`. `registerReadinessProfile` (below) only records that an id has been chosen; it registers no validation logic and does not change how `computeInterfaceReadiness` treats the system, so it is optional and has no effect on whether the contract is required.
|
|
457
464
|
|
|
458
465
|
```ts
|
|
459
466
|
// core/config/organization-model.ts
|
|
460
|
-
import { registerReadinessProfile } from '@elevasis/sdk'
|
|
461
|
-
|
|
462
|
-
// Register the profile id at startup so the platform recognizes it
|
|
463
|
-
registerReadinessProfile('acme.prospecting.api')
|
|
464
467
|
|
|
465
468
|
export const organizationModel = {
|
|
466
469
|
// ...
|
|
@@ -490,28 +493,32 @@ export const organizationModel = {
|
|
|
490
493
|
}
|
|
491
494
|
```
|
|
492
495
|
|
|
493
|
-
`readinessContract.requiredObjects` and `requiredCatalogs` are arrays of ontology IDs owned by this system. The platform validates that each declared object type exists in the OM and that each declared catalog type has at least one entry.
|
|
496
|
+
`readinessContract.requiredObjects` and `requiredCatalogs` are arrays of ontology IDs owned by this system. The platform validates that each declared object type exists in the OM and that each declared catalog type has at least one entry. `requiredCatalogs` must declare at least one entry — an empty contract asserts nothing and is rejected.
|
|
494
497
|
|
|
495
|
-
Built-in profile ids (`sales.lead-gen.api`, etc.) derive their requirements from platform code.
|
|
498
|
+
Built-in profile ids (`sales.lead-gen.api`, etc.) derive their requirements from platform code. **A `readinessContract` declared alongside a built-in profile is ignored outright — not merely unnecessary.** The readiness engine branches on the profile: a registered built-in runs its own validator, and the authored contract is read only on the `else` branch, so anything you declare next to a built-in profile validates nothing and silently drifts from what the platform actually enforces. Real projects have shipped full contracts this way believing they were enforced.
|
|
496
499
|
|
|
497
|
-
|
|
500
|
+
Note that the determinant is the **profile**, not the system. A custom system using a built-in profile still gets the built-in's requirements and still ignores an authored contract; a custom profile id is what makes `readinessContract` required (and it is required — a custom profile without one fails readiness with `missing-readiness-contract`).
|
|
501
|
+
|
|
502
|
+
The `lookupReadinessProfile`, `registerReadinessProfile`, and `isBuiltInReadinessProfile` functions are exported from `@elevasis/sdk` alongside the `SystemApiInterfaceReadinessContract`, `ReadinessProfileKind`, and `ReadinessProfileEntry` types. `registerReadinessProfile(profileId)` only acknowledges a custom id for introspection (`lookupReadinessProfile` then resolves it as `kind: 'custom'` instead of `undefined`) — it cannot make `isBuiltInReadinessProfile` return `true` and it is never a substitute for a `readinessContract`. The actual extension point for platform-code-driven readiness (no `readinessContract` needed) is `registerBuiltInReadinessProfile`, exported from `@elevasis/core/organization-model/readiness` — it takes real structural validation logic, not just an id.
|
|
498
503
|
|
|
499
504
|
### Export Channel as Tenant Business Config
|
|
500
505
|
|
|
501
506
|
The export channel — ClickUp, CSV/XLSX file, platform push, or a custom destination — is an action + credential choice declared in your tenant OM. The platform owns the list-builder workflow primitive and the file storage adapters; you own which workflow id handles export and which credential it uses.
|
|
502
507
|
|
|
508
|
+
<!-- doc-snippet:skip: illustrative excerpt -- `@core/types` resolves to the project's own `core/types/` module via the `@core/*` tsconfig path, and `buildCsvFromContacts` is a tenant-authored helper this recipe does not define -->
|
|
509
|
+
|
|
503
510
|
```ts
|
|
504
511
|
// operations/src/sales/prospecting/export-list.ts
|
|
505
512
|
import type { WorkflowDefinition } from '@elevasis/sdk'
|
|
506
|
-
import { list, storage } from '@elevasis/sdk/worker'
|
|
507
|
-
import { exportListInputSchema, exportListOutputSchema } from '@
|
|
513
|
+
import { acqDb, list, storage } from '@elevasis/sdk/worker'
|
|
514
|
+
import { exportListInputSchema, exportListOutputSchema } from '@core/types'
|
|
515
|
+
import { resourceDescriptors } from '@core/config/organization-model'
|
|
508
516
|
|
|
509
517
|
export const exportListWorkflow: WorkflowDefinition = {
|
|
510
518
|
config: {
|
|
511
|
-
resource: resourceDescriptors.exportList,
|
|
512
519
|
resourceId: resourceDescriptors.exportList.id,
|
|
513
520
|
name: 'Export List',
|
|
514
|
-
|
|
521
|
+
description: 'Exports list contacts to a CSV file in project storage.',
|
|
515
522
|
version: '1.0.0',
|
|
516
523
|
status: 'prod'
|
|
517
524
|
},
|
|
@@ -520,10 +527,13 @@ export const exportListWorkflow: WorkflowDefinition = {
|
|
|
520
527
|
export: {
|
|
521
528
|
id: 'export',
|
|
522
529
|
name: 'Export',
|
|
530
|
+
description: 'Fetches list contacts, builds a CSV, and uploads it to storage.',
|
|
523
531
|
inputSchema: exportListInputSchema,
|
|
524
532
|
outputSchema: exportListOutputSchema,
|
|
525
533
|
next: null,
|
|
526
|
-
handler: async (
|
|
534
|
+
handler: async (rawInput, context) => {
|
|
535
|
+
const input = rawInput as z.infer<typeof exportListInputSchema>
|
|
536
|
+
|
|
527
537
|
// Fetch contacts from the acquisition substrate
|
|
528
538
|
const contacts = await acqDb.listContacts({ listId: input.listId, limit: 5000, offset: 0 })
|
|
529
539
|
|
|
@@ -560,6 +570,8 @@ The `ListTelemetry.stageCounts` field is now a `Record<string, number>` — one
|
|
|
560
570
|
|
|
561
571
|
To define custom stages, author them in the `catalogTypes` scope of your lead-gen system:
|
|
562
572
|
|
|
573
|
+
<!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
|
|
574
|
+
|
|
563
575
|
```ts
|
|
564
576
|
ontology: {
|
|
565
577
|
catalogTypes: {
|
|
@@ -582,6 +594,8 @@ ontology: {
|
|
|
582
594
|
|
|
583
595
|
**`readinessTarget` — declaring the pipeline objective.** To tell the platform which stage is the "ready / next-focus" milestone for your pipeline, mark exactly one catalog entry with `readinessTarget: true`:
|
|
584
596
|
|
|
597
|
+
<!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
|
|
598
|
+
|
|
585
599
|
```ts
|
|
586
600
|
entries: {
|
|
587
601
|
'sourced': { label: 'Sourced', order: 10 },
|
|
@@ -597,6 +611,8 @@ The `LeadGenOverviewPage` uses this field to derive a "contacts ready for \<stag
|
|
|
597
611
|
|
|
598
612
|
Point the `listBuilderWorkflow` factory at your tenant resource and step handlers. The factory validates `stageKey` inputs against your catalog at construction time, not at runtime:
|
|
599
613
|
|
|
614
|
+
<!-- doc-snippet:skip: illustrative excerpt -- `resourceDescriptors` names the project's own resource-descriptors export, and `sourceCompaniesStep`/`enrichCompaniesStep`/`qualifyCompaniesStep` are the reader's own step handlers, not defined in this excerpt -->
|
|
615
|
+
|
|
600
616
|
```ts
|
|
601
617
|
// operations/src/sales/prospecting/list-builder.ts
|
|
602
618
|
import { listBuilderWorkflow } from '@elevasis/sdk/worker'
|
|
@@ -619,7 +635,7 @@ Register this workflow in `DeploymentSpec.workflows` alongside the export workfl
|
|
|
619
635
|
Run the checks for the surfaces you touched:
|
|
620
636
|
|
|
621
637
|
```bash
|
|
622
|
-
pnpm -C ui run check
|
|
638
|
+
pnpm -C ui run check-types
|
|
623
639
|
pnpm -C operations run check
|
|
624
640
|
pnpm -C operations exec elevasis-sdk check
|
|
625
641
|
```
|
|
@@ -1,121 +1,163 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Gate by System or Admin
|
|
3
|
-
description: Decision table and recipes for gating routes, sidebar entries, and UI elements
|
|
4
|
-
---
|
|
1
|
+
---
|
|
2
|
+
title: Gate by System or Admin
|
|
3
|
+
description: Decision table and recipes for gating routes, sidebar entries, and UI elements with AccessGuard and the unified Access Model.
|
|
4
|
+
---
|
|
5
5
|
<!-- @generated by packages/sdk/scripts/copy-reference-docs.mjs -- DO NOT EDIT -->
|
|
6
6
|
<!-- Regenerate: pnpm scaffold:sync -->
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
# Gate by System or Admin
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
| Surface is
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
8
|
+
|
|
9
|
+
# Gate by System or Admin
|
|
10
|
+
|
|
11
|
+
There is one gating surface: `AccessGuard` from `@elevasis/ui/auth`. It resolves an access key against the Access Model, which composes Organization Model System lifecycle, role permissions, organization membership scope, diagnostic allowlists, and platform-admin bypass.
|
|
12
|
+
|
|
13
|
+
`SystemGuard` and `AdminGuard` are retired. They are not exported by `@elevasis/ui`, so code importing them does not compile. Use `AccessGuard` with the right access key instead.
|
|
14
|
+
|
|
15
|
+
## Decide the access key
|
|
16
|
+
|
|
17
|
+
| Scenario | `accessKey` to pass |
|
|
18
|
+
| --------------------------------------------------------------- | ------------------------------------------------------- |
|
|
19
|
+
| Surface is an OM System that an organization can turn on or off | the System path, e.g. `"analytics"` |
|
|
20
|
+
| Surface performs writes only some roles may do | `{ systemPath: 'analytics', action: 'manage' }` |
|
|
21
|
+
| Surface is platform-admin only | `AccessKeys.platformAdmin` |
|
|
22
|
+
| Surface is backed by an existing role permission | the matching constant, e.g. `AccessKeys.operationsRead` |
|
|
23
|
+
|
|
24
|
+
A string key is shorthand for `{ systemPath: <string>, action: 'view' }`. `AccessKeys` is exported from `@elevasis/ui/auth`, `@elevasis/ui/hooks`, and `@elevasis/core/auth`.
|
|
25
|
+
|
|
26
|
+
## System gate in the org model
|
|
27
|
+
|
|
28
|
+
Add or update the system in the id-keyed `systems` map in `core/config/organization-model.ts`.
|
|
29
|
+
|
|
30
|
+
<!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
systems: {
|
|
34
|
+
analytics: {
|
|
35
|
+
id: 'analytics',
|
|
36
|
+
order: 10,
|
|
37
|
+
label: 'Analytics',
|
|
38
|
+
lifecycle: 'active',
|
|
39
|
+
path: '/analytics',
|
|
40
|
+
uiPosition: 'sidebar-primary'
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`lifecycle` is the gate:
|
|
46
|
+
|
|
47
|
+
- `'active'` allows access.
|
|
48
|
+
- `'beta'` allows access only when the runtime enables beta access or runs in development mode.
|
|
49
|
+
- `'draft'`, `'deprecated'`, and `'archived'` deny.
|
|
50
|
+
|
|
51
|
+
Dotted IDs such as `analytics.reports` inherit lifecycle and shell placement from their ancestors unless they declare their own value.
|
|
52
|
+
|
|
53
|
+
## Route-level system gate
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
import { AccessGuard, ProtectedRoute } from '@elevasis/ui/auth'
|
|
57
|
+
import { createFileRoute, Outlet } from '@tanstack/react-router'
|
|
58
|
+
|
|
59
|
+
export const Route = createFileRoute('/analytics')({ component: AnalyticsLayout })
|
|
60
|
+
|
|
61
|
+
function AnalyticsLayout() {
|
|
62
|
+
return (
|
|
63
|
+
<ProtectedRoute>
|
|
64
|
+
<AccessGuard accessKey="analytics">
|
|
65
|
+
<Outlet />
|
|
66
|
+
</AccessGuard>
|
|
67
|
+
</ProtectedRoute>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The sidebar is derived from `OrganizationModel.systems`; hiding a node there is display behavior only. Keep route guards in place for direct URL access.
|
|
73
|
+
|
|
74
|
+
## Admin-only route
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
import { AccessGuard, AccessKeys, ProtectedRoute } from '@elevasis/ui/auth'
|
|
78
|
+
import { createFileRoute, Outlet } from '@tanstack/react-router'
|
|
79
|
+
|
|
80
|
+
export const Route = createFileRoute('/admin')({ component: AdminLayout })
|
|
81
|
+
|
|
82
|
+
function AdminLayout() {
|
|
83
|
+
return (
|
|
84
|
+
<ProtectedRoute>
|
|
85
|
+
<AccessGuard accessKey={AccessKeys.platformAdmin}>
|
|
86
|
+
<Outlet />
|
|
87
|
+
</AccessGuard>
|
|
88
|
+
</ProtectedRoute>
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`AccessKeys.platformAdmin` is satisfied only by a platform admin; no role permission grants it. Pair the route guard with the system node:
|
|
94
|
+
|
|
95
|
+
<!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
systems: {
|
|
99
|
+
admin: {
|
|
100
|
+
id: 'admin',
|
|
101
|
+
order: 20,
|
|
102
|
+
label: 'Admin',
|
|
103
|
+
lifecycle: 'active',
|
|
104
|
+
path: '/admin',
|
|
105
|
+
uiPosition: 'sidebar-bottom',
|
|
106
|
+
requiresAdmin: true
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
`requiresAdmin` hides the sidebar entry from non-admins. It is display state projected onto the shell, not enforcement, so the route guard is still required.
|
|
112
|
+
|
|
113
|
+
## Gate a single element
|
|
114
|
+
|
|
115
|
+
Use `useAccess` when the decision changes one control rather than a whole route.
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
import { AccessKeys, useAccess } from '@elevasis/ui/hooks'
|
|
119
|
+
|
|
120
|
+
function CreateListButton() {
|
|
121
|
+
const canManage = useAccess(AccessKeys.leadGenManage)
|
|
122
|
+
|
|
123
|
+
return <Button disabled={!canManage.allowed}>New list</Button>
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`useAccess` returns the access answer plus `isReady`, `isPlatformAdmin`, and the resolved `permissions` array. Check `isReady` before treating `allowed: false` as a denial — it is also false while membership and permissions are still loading.
|
|
128
|
+
|
|
129
|
+
## Fallbacks and redirects
|
|
130
|
+
|
|
131
|
+
`AccessGuard` accepts `fallback`, `loadingFallback`, and `redirectTo` alongside `accessKey`. `fallback` may be a node or a function receiving the access answer, so a denial can explain itself.
|
|
132
|
+
|
|
133
|
+
```tsx
|
|
134
|
+
<AccessGuard
|
|
135
|
+
accessKey="analytics"
|
|
136
|
+
loadingFallback={<Loader />}
|
|
137
|
+
fallback={(answer) => <NoAccess reason={answer.reason} />}
|
|
138
|
+
redirectTo="/"
|
|
139
|
+
>
|
|
140
|
+
<AnalyticsPage />
|
|
141
|
+
</AccessGuard>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Per-member overrides are retired
|
|
145
|
+
|
|
146
|
+
Per-member system toggles stored on membership config no longer exist. Narrow access two ways instead:
|
|
147
|
+
|
|
148
|
+
- turn the System off for the whole organization with `lifecycle`, or
|
|
149
|
+
- require a role permission by gating on a `manage` action or an `AccessKeys` constant, so only members whose assigned roles grant that permission pass.
|
|
150
|
+
|
|
151
|
+
## Verify
|
|
152
|
+
|
|
153
|
+
Check the state matrix:
|
|
154
|
+
|
|
155
|
+
| System lifecycle | Role permission | Platform admin | Expected result |
|
|
156
|
+
| ---------------- | --------------------- | ----------------------------- | ---------------------------------------------- |
|
|
157
|
+
| `active` | not required | any | Route accessible, sidebar visible |
|
|
158
|
+
| `beta` | not required | non-admin, production runtime | Route denied, sidebar hidden |
|
|
159
|
+
| `draft` | not required | non-admin | Route denied, sidebar hidden |
|
|
160
|
+
| `active` | required, not granted | non-admin | Manage action denied, view still allowed |
|
|
161
|
+
| any | any | admin | Allowed with `reason: 'platform-admin-bypass'` |
|
|
162
|
+
|
|
163
|
+
If a route denies unexpectedly, read `answer.restrictedBy` and `answer.reason` from `useAccess` — they name the layer that denied, so you can tell a lifecycle problem from a missing role permission.
|
|
@@ -17,13 +17,13 @@ Before starting, read [glossary.md](../reference/glossary.md) to disambiguate ov
|
|
|
17
17
|
## Recipes
|
|
18
18
|
|
|
19
19
|
**[Add an OM-Backed System](add-a-feature.md)**
|
|
20
|
-
You want a new system with cohesive Organization Model semantics, executable resources, and optional UI. Covers Systems, System-owned ontology and config, Resource descriptors with `title`, `description`, `resource.ontology.actions`, `primaryAction`, `codeRefs`, OM topology, runtime assembly, manifests, routes, guards, tests, and
|
|
20
|
+
You want a new system with cohesive Organization Model semantics, executable resources, and optional UI. Covers Systems, System-owned ontology and config, Resource descriptors with `title`, `description`, `resource.ontology.actions`, `primaryAction`, `codeRefs`, OM topology, runtime assembly, manifests, routes, guards, tests, and the migration off retired `System.content`.
|
|
21
21
|
|
|
22
22
|
**[Add a Resource](add-a-resource.md)**
|
|
23
23
|
You want a new workflow or agent deployed to the platform. Covers OM Resource descriptor authoring, descriptor-backed `WorkflowDefinition` binding, `DeploymentSpec` assembly, relationship declarations, and CLI verification.
|
|
24
24
|
|
|
25
25
|
**[Gate by System or Admin](gate-by-feature-or-admin.md)**
|
|
26
|
-
You want to restrict a route, nav item, or UI element by
|
|
26
|
+
You want to restrict a route, nav item, or UI element by System or by role. Covers the access-key decision table, the single `AccessGuard` surface and `useAccess` hook, System `lifecycle` as the org-level gate, `AccessKeys.platformAdmin` for admin-only routes, guard fallbacks and redirects, and why the retired `SystemGuard` / `AdminGuard` pair must not be reintroduced.
|
|
27
27
|
|
|
28
28
|
**[Build and Extend CRM](extend-crm.md)**
|
|
29
29
|
You want to build on the shared CRM without forking it: add CRM routes, compose sidebars/pages, use deal/company/contact hooks, mutate CRM data from workflows, or understand which contracts and adapters form the extension surface.
|
|
@@ -31,6 +31,9 @@ You want to build on the shared CRM without forking it: add CRM routes, compose
|
|
|
31
31
|
**[Build and Extend Lead Gen](extend-lead-gen.md)**
|
|
32
32
|
You want to build on the shared lead-gen system without forking it: add lead-gen routes, compose sidebars/pages, use list/company/contact/artifact hooks, mutate list data from workflows, or understand which contracts and adapters form the extension surface.
|
|
33
33
|
|
|
34
|
+
**[Build and Extend Content](extend-content.md)**
|
|
35
|
+
You want to build on the shared content system without forking it: add a pipeline, produce a step from a workflow, customize the review screen, store rules documents, or track distributions. Covers the catalog-driven pipeline model (a pipeline is data, not code), the `content:catalog/{pipeline}-steps` binding, attempt authoring with `stepKey`, artifacts as versioned governing documents with their two silent write constraints, review-page slots and primitives, and the `apiInterface` readiness rules.
|
|
36
|
+
|
|
34
37
|
**[Customize CRM Actions](customize-crm-actions.md)**
|
|
35
38
|
You want to add, hide, or replace CRM deal action buttons, configure the shared `crmActions` provider path, or call a project-owned workflow from custom UI when server-side action dispatch constraints require it. Covers `ActionDef`, the caller-supplied `crmActions` catalog, provider wiring, and the current v1 boundary for custom action dispatch.
|
|
36
39
|
|
|
@@ -45,6 +48,6 @@ You want to browse, inspect, or traverse the OrganizationModel knowledge graph f
|
|
|
45
48
|
## Reference docs these recipes link into
|
|
46
49
|
|
|
47
50
|
- [glossary.md](../reference/glossary.md) -- term disambiguation for System, Resource, systemId, Topology, Settings asymmetry
|
|
48
|
-
- [contracts.md](../reference/contracts.md) -- TypeScript shapes: `SystemModule`, `OrganizationModel`, CRM deal types, lead-gen list/member/artifact types, `CrmToolMap`, `LeadToolMap`, `ListToolMap`, `ActionDef`
|
|
51
|
+
- [contracts.md](../reference/contracts.md) -- TypeScript shapes: `SystemModule`, `OrganizationModel`, CRM deal types, lead-gen list/member/artifact types, content item/attempt/distribution types, `CrmToolMap`, `LeadToolMap`, `ListToolMap`, `ContentToolMap`, `ActionDef`
|
|
49
52
|
- [feature-flags-and-gating.md](../ui/feature-flags-and-gating.md) -- full three-concept gating model
|
|
50
53
|
- [workflow-recipes.md](../operations/workflow-recipes.md) -- workflow anatomy, adapters, trigger patterns
|