@elevasis/sdk 1.45.0 → 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 (38) hide show
  1. package/dist/cli.cjs +36046 -31587
  2. package/dist/index.d.ts +833 -391
  3. package/dist/index.js +59 -59
  4. package/dist/node/index.d.ts +0 -84
  5. package/dist/node/index.js +2 -2
  6. package/dist/test-utils/index.d.ts +859 -331
  7. package/dist/test-utils/index.js +166 -134
  8. package/dist/worker/index.d.ts +897 -324
  9. package/dist/worker/index.js +68 -35
  10. package/package.json +4 -4
  11. package/reference/_navigation.md +11 -2
  12. package/reference/_reference-manifest.json +42 -0
  13. package/reference/core/exports.mdx +2 -0
  14. package/reference/packages/core/src/business/README.md +4 -1
  15. package/reference/packages/core/src/content/README.md +19 -0
  16. package/reference/packages/core/src/organization-model/README.md +148 -149
  17. package/reference/packages/core/src/organization-model/readiness/README.md +42 -0
  18. package/reference/packages/ui/src/features/README.md +28 -28
  19. package/reference/rules/shared-types.md +21 -0
  20. package/reference/scaffold/core/organization-graph.mdx +2 -3
  21. package/reference/scaffold/core/organization-model.mdx +2 -6
  22. package/reference/scaffold/operations/propagation-pipeline.md +15 -16
  23. package/reference/scaffold/operations/scaffold-maintenance.md +3 -2
  24. package/reference/scaffold/operations/workflow-recipes.md +2 -2
  25. package/reference/scaffold/recipes/customize-crm-actions.md +5 -5
  26. package/reference/scaffold/recipes/extend-content.md +265 -0
  27. package/reference/scaffold/recipes/extend-lead-gen.md +14 -16
  28. package/reference/scaffold/recipes/index.md +4 -1
  29. package/reference/scaffold/reference/contracts.md +18 -55
  30. package/reference/scaffold/reference/feature-registry.md +3 -0
  31. package/reference/scaffold/reference/glossary.md +1 -1
  32. package/reference/scaffold/ui/customization.md +2 -2
  33. package/reference/scaffold/ui/feature-shell.mdx +1 -3
  34. package/reference/sdk/cli-management.mdx +90 -5
  35. package/reference/sdk/cli.mdx +90 -13
  36. package/reference/sdk/framework/agent.mdx +6 -0
  37. package/reference/sdk/platform-tools/adapters-platform.mdx +3 -1
  38. package/reference/ui/exports.mdx +1 -0
@@ -3058,8 +3058,8 @@ function preview(text, n = 120) {
3058
3058
  // ../core/src/platform/utils/token-counter.ts
3059
3059
  var CHARS_PER_TOKEN = 3.5;
3060
3060
  function estimateTokens(text) {
3061
- const content = typeof text === "string" ? text : JSON.stringify(text);
3062
- const chars = content.length;
3061
+ const content2 = typeof text === "string" ? text : JSON.stringify(text);
3062
+ const chars = content2.length;
3063
3063
  return Math.ceil(chars / CHARS_PER_TOKEN);
3064
3064
  }
3065
3065
  function truncationCharBudget(maxTokens, noticeLength = 0) {
@@ -3099,7 +3099,7 @@ function buildUntrustedDataPolicy(securityLevel) {
3099
3099
  }
3100
3100
  function buildAgentMessages(systemPrompt, memory, currentInput, securityLevel, conversationHistory = []) {
3101
3101
  const policy = buildUntrustedDataPolicy(securityLevel);
3102
- const historyMessages = conversationHistory.map(({ role, content }) => ({ role, content }));
3102
+ const historyMessages = conversationHistory.map(({ role, content: content2 }) => ({ role, content: content2 }));
3103
3103
  if (historyMessages.length > 0) {
3104
3104
  historyMessages[historyMessages.length - 1].cacheBreakpoint = true;
3105
3105
  }
@@ -3613,11 +3613,11 @@ function safeStructuralPrefix(raw, cutAt) {
3613
3613
  const base = stripDanglingTail(raw.slice(0, cutPoint), stack[stack.length - 1] === "}");
3614
3614
  return base + [...stack].reverse().join("");
3615
3615
  }
3616
- function truncateContent(content, maxTokens) {
3617
- const estimated = estimateTokens(content);
3618
- if (estimated <= maxTokens) return { content };
3616
+ function truncateContent(content2, maxTokens) {
3617
+ const estimated = estimateTokens(content2);
3618
+ if (estimated <= maxTokens) return { content: content2 };
3619
3619
  const cutAt = truncationCharBudget(maxTokens, CLOSING_BRACKET_RESERVE);
3620
- const safeContent = safeStructuralPrefix(content, cutAt);
3620
+ const safeContent = safeStructuralPrefix(content2, cutAt);
3621
3621
  const omittedTokens = estimated - maxTokens;
3622
3622
  return { content: safeContent, truncated: { omittedTokens } };
3623
3623
  }
@@ -3713,9 +3713,9 @@ async function executeToolCall(iterationContext, action) {
3713
3713
  const validatedResult = tool.outputSchema.parse(rawResult);
3714
3714
  let boundedResult = validatedResult;
3715
3715
  if (tool.maxOutputTokens !== void 0) {
3716
- const { content, truncated } = truncateContent(JSON.stringify(validatedResult), tool.maxOutputTokens);
3716
+ const { content: content2, truncated } = truncateContent(JSON.stringify(validatedResult), tool.maxOutputTokens);
3717
3717
  if (truncated) {
3718
- boundedResult = content;
3718
+ boundedResult = content2;
3719
3719
  }
3720
3720
  }
3721
3721
  const toolEndTime = Date.now();
@@ -4024,7 +4024,7 @@ async function processMemory(memoryManager, response, logger, iteration) {
4024
4024
  if (!response.memoryOps) return;
4025
4025
  const { memoryOps } = response;
4026
4026
  if (memoryOps.set) {
4027
- for (const [key, content] of Object.entries(memoryOps.set)) {
4027
+ for (const [key, content2] of Object.entries(memoryOps.set)) {
4028
4028
  if (!validateMemoryKeyOwnership(key, logger, iteration)) {
4029
4029
  continue;
4030
4030
  }
@@ -4032,7 +4032,7 @@ async function processMemory(memoryManager, response, logger, iteration) {
4032
4032
  "memory-set",
4033
4033
  iteration,
4034
4034
  // Auto-stringify non-string values (arrays, objects, etc.)
4035
- () => memoryManager.set(key, typeof content === "string" ? content : JSON.stringify(content)),
4035
+ () => memoryManager.set(key, typeof content2 === "string" ? content2 : JSON.stringify(content2)),
4036
4036
  () => `Set: ${key}`
4037
4037
  );
4038
4038
  }
@@ -4152,13 +4152,13 @@ var MAX_TOOL_RESULT_TOKENS = 4e3;
4152
4152
 
4153
4153
  // ../core/src/execution/engine/agent/memory/manager.ts
4154
4154
  var ENVELOPE_FULL_RESULT_WINDOW = 3;
4155
- function parseIfJson(content) {
4156
- const trimmed = content.trim();
4157
- if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return content;
4155
+ function parseIfJson(content2) {
4156
+ const trimmed = content2.trim();
4157
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return content2;
4158
4158
  try {
4159
- return JSON.parse(content);
4159
+ return JSON.parse(content2);
4160
4160
  } catch {
4161
- return content;
4161
+ return content2;
4162
4162
  }
4163
4163
  }
4164
4164
  function isInTurnScope(entry, currentTurn) {
@@ -4221,8 +4221,8 @@ var MemoryManager = class {
4221
4221
  * @param key - Session memory key
4222
4222
  * @param content - String content from agent
4223
4223
  */
4224
- set(key, content, source = "model") {
4225
- const entryTokens = estimateTokens(content);
4224
+ set(key, content2, source = "model") {
4225
+ const entryTokens = estimateTokens(content2);
4226
4226
  let truncated;
4227
4227
  if (entryTokens > MAX_SINGLE_ENTRY_TOKENS) {
4228
4228
  const truncateTime = Date.now();
@@ -4234,13 +4234,13 @@ var MemoryManager = class {
4234
4234
  truncateTime,
4235
4235
  0
4236
4236
  );
4237
- const result = truncateContent(content, MAX_SINGLE_ENTRY_TOKENS);
4238
- content = result.content;
4237
+ const result = truncateContent(content2, MAX_SINGLE_ENTRY_TOKENS);
4238
+ content2 = result.content;
4239
4239
  truncated = result.truncated;
4240
4240
  }
4241
4241
  this.memory.sessionMemory[key] = {
4242
4242
  type: "context",
4243
- content,
4243
+ content: content2,
4244
4244
  timestamp: Date.now(),
4245
4245
  turnNumber: null,
4246
4246
  // Session memory entries are not turn-specific
@@ -4250,7 +4250,7 @@ var MemoryManager = class {
4250
4250
  ...truncated && { truncated },
4251
4251
  // Screened once, here, instead of by re-scanning the whole envelope on every iteration this
4252
4252
  // key gets re-sent for — see `MemoryEntry.warnings`.
4253
- warnings: sanitizeUserInput(content).warnings
4253
+ warnings: sanitizeUserInput(content2).warnings
4254
4254
  };
4255
4255
  }
4256
4256
  /**
@@ -4288,14 +4288,14 @@ var MemoryManager = class {
4288
4288
  iterationNumber: entry.iterationNumber
4289
4289
  });
4290
4290
  }
4291
- let content = entry.content;
4291
+ let content2 = entry.content;
4292
4292
  let truncated;
4293
4293
  if (entry.type === "tool-result" || entry.type === "error") {
4294
- const before = content;
4295
- const result = truncateContent(content, MAX_TOOL_RESULT_TOKENS);
4296
- content = result.content;
4294
+ const before = content2;
4295
+ const result = truncateContent(content2, MAX_TOOL_RESULT_TOKENS);
4296
+ content2 = result.content;
4297
4297
  truncated = result.truncated;
4298
- if (content !== before) {
4298
+ if (content2 !== before) {
4299
4299
  const truncateTime = Date.now();
4300
4300
  this.logger?.action(
4301
4301
  "memory-tool-result-truncate",
@@ -4309,12 +4309,12 @@ var MemoryManager = class {
4309
4309
  }
4310
4310
  this.memory.history.push({
4311
4311
  ...entry,
4312
- content,
4312
+ content: content2,
4313
4313
  timestamp: Date.now(),
4314
4314
  ...truncated && { truncated },
4315
4315
  // Screened once, here, instead of by re-scanning the whole accumulated envelope on every
4316
4316
  // iteration this entry gets re-sent for — see `MemoryEntry.warnings`.
4317
- warnings: sanitizeUserInput(content).warnings
4317
+ warnings: sanitizeUserInput(content2).warnings
4318
4318
  });
4319
4319
  this.autoCompact();
4320
4320
  }
@@ -6123,28 +6123,42 @@ z.object({
6123
6123
  limit: z.number().int(),
6124
6124
  offset: z.number().int()
6125
6125
  });
6126
- var AcqArtifactOwnerKindSchema = z.enum(["company", "contact", "deal", "list", "list_member"]);
6126
+ var AcqArtifactOwnerKindSchema = z.enum(["company", "contact", "deal", "list", "list_member", "organization"]);
6127
6127
  z.object({
6128
6128
  ownerKind: AcqArtifactOwnerKindSchema,
6129
- ownerId: UuidSchema
6129
+ ownerId: UuidSchema.optional()
6130
6130
  }).strict();
6131
+ var PipelineIdSchema = z.string().trim().min(1).max(255);
6131
6132
  z.object({
6132
6133
  ownerKind: AcqArtifactOwnerKindSchema,
6133
- ownerId: UuidSchema,
6134
+ // Nullable + optional: an org-owned artifact (ownerKind: 'organization') has no
6135
+ // single owning entity row. See the comment on AcqArtifactOwnerKindSchema above.
6136
+ ownerId: UuidSchema.nullable().optional(),
6134
6137
  kind: z.string().trim().min(1).max(255),
6135
6138
  content: z.record(z.string(), z.unknown()),
6136
- sourceExecutionId: UuidSchema.optional()
6139
+ sourceExecutionId: UuidSchema.optional(),
6140
+ // Nullable + optional: acquisition's own artifacts (audits, proposals, ICP docs) predate the
6141
+ // pipeline concept and have none. `getActiveArtifact` filters on it, so any artifact meant to
6142
+ // be resolvable as "the active document for pipeline X" MUST supply it -- artifacts-platform-tool
6143
+ // .mdx Step 3 defect 1.
6144
+ pipelineId: PipelineIdSchema.nullable().optional()
6137
6145
  }).strict();
6138
6146
  var AcqArtifactResponseSchema = z.object({
6139
6147
  id: z.string(),
6140
6148
  organizationId: z.string(),
6141
6149
  ownerKind: z.string(),
6142
- ownerId: z.string(),
6150
+ // Nullable as of content-pipeline-foundation D14: an org-owned artifact has no owning entity row.
6151
+ // CreateArtifactRequestSchema already accepted a null ownerId; this response schema not doing so
6152
+ // was Step 3 defect 2 -- an org-owned artifact inserted fine and then failed serialization.
6153
+ ownerId: z.string().nullable(),
6143
6154
  kind: z.string(),
6155
+ pipelineId: z.string().nullable(),
6144
6156
  content: z.record(z.string(), z.unknown()),
6145
6157
  sourceExecutionId: z.string().nullable(),
6146
6158
  createdBy: z.string().nullable(),
6147
6159
  createdAt: z.string(),
6160
+ updatedAt: z.string(),
6161
+ isActive: z.boolean(),
6148
6162
  version: z.number().int()
6149
6163
  });
6150
6164
  z.object({
@@ -6793,6 +6807,25 @@ var list = createAdapter("list", [
6793
6807
  "listPendingContactIds"
6794
6808
  ]);
6795
6809
 
6810
+ // src/worker/adapters/artifacts.ts
6811
+ var artifacts = createAdapter("artifacts", [
6812
+ "listArtifacts",
6813
+ "createArtifact",
6814
+ "getActive"
6815
+ ]);
6816
+
6817
+ // src/worker/adapters/content.ts
6818
+ var content = createAdapter("content", [
6819
+ "createItem",
6820
+ "getItem",
6821
+ "listItems",
6822
+ "updateItem",
6823
+ "createAttempt",
6824
+ "listAttempts",
6825
+ "createDistribution",
6826
+ "updateDistribution"
6827
+ ]);
6828
+
6796
6829
  // src/worker/adapters/pdf.ts
6797
6830
  var pdf = createAdapter("pdf", ["render", "renderToBuffer"]);
6798
6831
 
@@ -7352,4 +7385,4 @@ if (workerData != null && workerData.kind === "static") {
7352
7385
  })();
7353
7386
  }
7354
7387
 
7355
- export { ListBuilderResultSchema, ListBuilderResultsSchema, PlatformToolError, acqDb, approval, classifyPlatformToolError, createAdapter, createAnymailfinderAdapter, createApifyAdapter, createAttioAdapter, createClickUpAdapter, createDropboxAdapter, createGmailAdapter, createGoogleSheetsAdapter, createInstantlyAdapter, createMillionVerifierAdapter, createResendAdapter, createSignatureApiAdapter, createStripeAdapter, createTombaAdapter, crm, email, executeWorkflow, execution, generateHmacToken, list, listBuilderWorkflow, llm, notifications, pdf, platform, projects, scheduler, startWorker, storage };
7388
+ export { ListBuilderResultSchema, ListBuilderResultsSchema, PlatformToolError, acqDb, approval, artifacts, classifyPlatformToolError, content, createAdapter, createAnymailfinderAdapter, createApifyAdapter, createAttioAdapter, createClickUpAdapter, createDropboxAdapter, createGmailAdapter, createGoogleSheetsAdapter, createInstantlyAdapter, createMillionVerifierAdapter, createResendAdapter, createSignatureApiAdapter, createStripeAdapter, createTombaAdapter, crm, email, executeWorkflow, execution, generateHmacToken, list, listBuilderWorkflow, llm, notifications, pdf, platform, projects, scheduler, startWorker, storage };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/sdk",
3
- "version": "1.45.0",
3
+ "version": "1.46.0",
4
4
  "description": "SDK for building Elevasis organization resources",
5
5
  "type": "module",
6
6
  "bin": {
@@ -55,9 +55,9 @@
55
55
  "tsup": "^8.0.0",
56
56
  "typescript": "5.9.2",
57
57
  "zod": "^4.1.0",
58
- "@repo/core": "0.60.0",
59
- "@repo/eslint-config": "0.0.0",
60
- "@repo/typescript-config": "0.0.0"
58
+ "@repo/core": "0.61.0",
59
+ "@repo/typescript-config": "0.0.0",
60
+ "@repo/eslint-config": "0.0.0"
61
61
  },
62
62
  "scripts": {
63
63
  "lint": "eslint src --max-warnings 0",
@@ -4,7 +4,7 @@
4
4
 
5
5
  Auto-generated from the package reference manifests.
6
6
 
7
- Package entries indexed: 61.
7
+ Package entries indexed: 64.
8
8
 
9
9
  ## @elevasis/core / Auth
10
10
 
@@ -12,6 +12,12 @@ Package entries indexed: 61.
12
12
  | --- | --- | --- | --- |
13
13
  | Auth | `packages/core/src/README.md` | Published browser-safe auth contracts, AccessKeys, and Access Model primitives. | (not specified) |
14
14
 
15
+ ## @elevasis/core / Content
16
+
17
+ | Resource | Location | Description | When to Load |
18
+ | --- | --- | --- | --- |
19
+ | Content | `packages/core/src/content/README.md` | Published content pipeline API schemas: content items, the payload envelope, a content-keyed processing state, attempts, review, and distributions, plus platform-content typed interfaces. | (not specified) |
20
+
15
21
  ## @elevasis/core / Core
16
22
 
17
23
  | Resource | Location | Description | When to Load |
@@ -35,6 +41,7 @@ Package entries indexed: 61.
35
41
  | Resource | Location | Description | When to Load |
36
42
  | --- | --- | --- | --- |
37
43
  | Organization Model | `packages/core/src/organization-model/README.md` | Published organization-model schema, defaults, resolver, and types. | (not specified) |
44
+ | System Interface Readiness | `packages/core/src/organization-model/readiness/README.md` | Generic System Interface readiness engine, plus registerBuiltInReadinessProfile — the extension point for registering a readiness profile that carries real structural validation. | (not specified) |
38
45
 
39
46
  ## @elevasis/core / Testing
40
47
 
@@ -102,6 +109,7 @@ Package entries indexed: 61.
102
109
  | Features Notes | `packages/ui/src/features/README.md` | Published Notes panel view and supporting note components for shared right-panel integrations. | (not specified) |
103
110
  | Features Right Panel Host | `packages/ui/src/features/README.md` | Published right-panel host provider, layer, trigger, keyboard shortcut, store, and view contract. | (not specified) |
104
111
  | Features Public Agent Chat | `packages/ui/src/features/README.md` | Published public agent chat surface for downstream shells. | (not specified) |
112
+ | Features Content | `packages/ui/src/features/README.md` | Published, data-free content review card surface (ContentReviewCard and its sub-components) for downstream shells. | (not specified) |
105
113
 
106
114
  ## @elevasis/ui / Foundation
107
115
 
@@ -186,6 +194,7 @@ Universal scaffold documentation for all SDK projects. Source locations are co-l
186
194
  | Gate by System or Admin | `scaffold/recipes/gate-by-feature-or-admin.md` | Decision table and recipes for gating routes, sidebar entries, and UI elements with AccessGuard and the unified Access Model. |
187
195
  | Build and Extend CRM | `scaffold/recipes/extend-crm.md` | Map the CRM platform primitives available to SDK projects: shared UI pages, sidebar composition, data hooks, action definitions, workflow adapters, System Interfaces, and org-model extension boundaries. |
188
196
  | Build and Extend Lead Gen | `scaffold/recipes/extend-lead-gen.md` | Map the lead-gen platform primitives available to SDK projects: shared UI pages, provider-injected Organization Model config, data hooks, list/member state, artifacts, workflow adapters, System Interfaces, and tenant-owned extension boundaries. |
197
+ | Build and Extend Content | `scaffold/recipes/extend-content.md` | Map the content platform primitives available to SDK projects: pipeline and step catalogs, shared review/pipeline/distribution pages, data hooks, the content workflow adapter, artifacts as rules documents, and org-model extension boundaries. |
189
198
  | Customize CRM Actions | `scaffold/recipes/customize-crm-actions.md` | Add, hide, or replace CRM deal action buttons in a template-derived project, and override default platform action workflows with project-owned implementations. |
190
199
  | Customize Knowledge Browser | `scaffold/recipes/customize-knowledge-browser.md` | Author knowledge nodes and customize the Knowledge Browser in a template-derived project -- from zero-config authoring through sidebar composition, custom dispatchers, and direct query access. |
191
200
  | Query the Knowledge Graph | `scaffold/recipes/query-the-knowledge-graph.md` | Use the `knowledge:*` CLI subcommands on `elevasis-sdk` (external projects) and `elevasis` (monorepo) to browse, inspect, and traverse the OrganizationModel knowledge graph via six mount axes. |
@@ -287,7 +296,7 @@ Docs-site pages indexed: 38.
287
296
  | Human-in-the-Loop (HITL) Workflows | `sdk/human-in-the-loop.mdx` | How a workflow step opens an approval task, how it reaches the command queue, and how selecting an action resumes work -- the story that connects the approval adapter, checkpoint metadata, and the queue CLI. |
288
297
  | Elevasis SDK | `sdk/index.mdx` | Build and deploy workflows, agents, and resources with the Elevasis SDK |
289
298
  | Integration Adapters | `sdk/platform-tools/adapters-integration.mdx` | Auto-generated table of all 13 integration (credential-bound) adapters exported from @elevasis/sdk/worker, derived from static analysis of the adapter source files. |
290
- | Platform Adapters | `sdk/platform-tools/adapters-platform.mdx` | Auto-generated table of all 12 platform (singleton, no credential) adapters exported from @elevasis/sdk/worker, derived from static analysis of the adapter source files. |
299
+ | Platform Adapters | `sdk/platform-tools/adapters-platform.mdx` | Auto-generated table of all 14 platform (singleton, no credential) adapters exported from @elevasis/sdk/worker, derived from static analysis of the adapter source files. |
291
300
  | Platform Tools | `sdk/platform-tools/index.mdx` | Access 25 adapters (13 integration + 12 platform) from your SDK workflows -- typed adapters, credential security model, and working code examples |
292
301
  | Adapter Type Safety | `sdk/platform-tools/type-safety.mdx` | SDK worker adapter type safety patterns - required fields, discriminated unions, and intentionally loose types |
293
302
  | The Deployment Spec Pattern | `sdk/project-deployment-spec.mdx` | How projectDeploymentSpec and defineWorkflowConfig assemble the DeploymentSpec a scaffolded project actually ships, using operations/src/index.ts as the reference. |
@@ -15,6 +15,20 @@
15
15
  "referencePath": "packages/core/src/README.md",
16
16
  "publishedExportPath": "./dist/auth/index.js"
17
17
  },
18
+ {
19
+ "packageName": "@elevasis/core",
20
+ "packageDir": "packages/core",
21
+ "subpath": "./content",
22
+ "kind": "subpath",
23
+ "title": "Content",
24
+ "description": "Published content pipeline API schemas: content items, the payload envelope, a content-keyed processing state, attempts, review, and distributions, plus platform-content typed interfaces.",
25
+ "group": "Content",
26
+ "order": 1,
27
+ "sourcePath": "packages/core/src/content/index.ts",
28
+ "docPath": "packages/core/src/content/README.md",
29
+ "referencePath": "packages/core/src/content/README.md",
30
+ "publishedExportPath": "./dist/content/index.js"
31
+ },
18
32
  {
19
33
  "packageName": "@elevasis/core",
20
34
  "packageDir": "packages/core",
@@ -71,6 +85,20 @@
71
85
  "referencePath": "packages/core/src/organization-model/README.md",
72
86
  "publishedExportPath": "./dist/organization-model/index.js"
73
87
  },
88
+ {
89
+ "packageName": "@elevasis/core",
90
+ "packageDir": "packages/core",
91
+ "subpath": "./organization-model/readiness",
92
+ "kind": "subpath",
93
+ "title": "System Interface Readiness",
94
+ "description": "Generic System Interface readiness engine, plus registerBuiltInReadinessProfile — the extension point for registering a readiness profile that carries real structural validation.",
95
+ "group": "Organization Model",
96
+ "order": 2,
97
+ "sourcePath": "packages/core/src/organization-model/readiness/index.ts",
98
+ "docPath": "packages/core/src/organization-model/readiness/README.md",
99
+ "referencePath": "packages/core/src/organization-model/readiness/README.md",
100
+ "publishedExportPath": "./dist/organization-model/readiness/index.js"
101
+ },
74
102
  {
75
103
  "packageName": "@elevasis/core",
76
104
  "packageDir": "packages/core",
@@ -449,6 +477,20 @@
449
477
  "referencePath": "packages/ui/src/features/README.md",
450
478
  "publishedExportPath": "./dist/features/public-agent-chat/index.js"
451
479
  },
480
+ {
481
+ "packageName": "@elevasis/ui",
482
+ "packageDir": "packages/ui",
483
+ "subpath": "./features/content",
484
+ "kind": "subpath",
485
+ "title": "Features Content",
486
+ "description": "Published, data-free content review card surface (ContentReviewCard and its sub-components) for downstream shells.",
487
+ "group": "Features",
488
+ "order": 16,
489
+ "sourcePath": "packages/ui/src/features/content/index.ts",
490
+ "docPath": "packages/ui/src/features/README.md",
491
+ "referencePath": "packages/ui/src/features/README.md",
492
+ "publishedExportPath": "./dist/features/content/index.js"
493
+ },
452
494
  {
453
495
  "packageName": "@elevasis/ui",
454
496
  "packageDir": "packages/ui",
@@ -11,6 +11,8 @@ description: "Auto-generated catalog of all published @elevasis/core subpath exp
11
11
  | `@elevasis/core` | Core | Core | Published core wrapper for the curated contract surface. |
12
12
  | `@elevasis/core/auth` | Auth | Auth | Published browser-safe auth contracts, AccessKeys, and Access Model primitives. |
13
13
  | `@elevasis/core/organization-model` | Organization Model | Organization Model | Published organization-model schema, defaults, resolver, and types. |
14
+ | `@elevasis/core/organization-model/readiness` | System Interface Readiness | Organization Model | Generic System Interface readiness engine, plus registerBuiltInReadinessProfile — the extension point for registering a readiness profile that carries real structural validation. |
14
15
  | `@elevasis/core/knowledge` | Knowledge | Knowledge | Published knowledge query layer: bySystem/byKind/byOwner/governs/governedBy queries, parsePath, and output formatters. |
16
+ | `@elevasis/core/content` | Content | Content | Published content pipeline API schemas: content items, the payload envelope, a content-keyed processing state, attempts, review, and distributions, plus platform-content typed interfaces. |
15
17
  | `@elevasis/core/entities` | Entities | Entities | Published base entity contracts (Project, Milestone, Task, Deal, Company, Contact) generic over a metadata extension slot. |
16
18
  | `@elevasis/core/test-utils` | Test Utilities | Testing | Published test fixtures, mocks, and shared helpers for downstream automated tests. |
@@ -47,6 +47,9 @@ export type Deal = BaseDeal
47
47
 
48
48
  ## Recipe
49
49
 
50
- The full pattern is documented in the SDK scaffold bundle: `operations/node_modules/@elevasis/sdk/reference/scaffold/recipes/extend-a-base-entity.md`.
50
+ The full pattern is documented in the SDK scaffold bundle. Internally, read the workspace source at
51
+ `packages/sdk/docs/scaffold/recipes/extend-a-base-entity.md`; a tenant reads the published mirror at
52
+ `operations/node_modules/@elevasis/sdk/reference/scaffold/recipes/extend-a-base-entity.md`, which does
53
+ not resolve from the monorepo root.
51
54
 
52
55
  The canonical template demo lives at `external/_template/core/types/entities.ts`.
@@ -0,0 +1,19 @@
1
+ # @elevasis/core/content
2
+
3
+ Content pipeline API schemas and platform-content typed interfaces. Browser-safe (no Node APIs).
4
+
5
+ ## Surface
6
+
7
+ | Export | Purpose |
8
+ | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | `ContentItemResponseSchema`, `CreateContentItemRequestSchema`, `UpdateContentItemRequestSchema` | `content_items` transport shape. `processingState` is intentionally absent from create/update — factory-write-only. |
10
+ | `ContentProcessingStateSchema` | `{ stepKey: { status, data? } }`, keyed by `ContentStepKeySchema` — a content-specific key, not lead-gen's `LeadGenStageKeySchema`. |
11
+ | `ContentPayloadEnvelopeSchema` | The producer's immutable emission stored in `payload`. Never edited — `body` is the human's canonical text. |
12
+ | `ReviewContentItemRequestSchema` | Approve, or reject with a required `rejectReason`. Writes `reviewed_at` / `reviewed_by`. |
13
+ | `ContentItemAttemptResponseSchema`, `CreateContentItemAttemptRequestSchema` | `content_item_attempts` transport shape. No `attemptNumber` field on create — the API service assigns it inside the write. `stepKey` is producer-supplied and nullable. |
14
+ | `ContentDistributionResponseSchema`, `CreateContentDistributionRequestSchema`, `UpdateContentDistributionRequestSchema` | `content_distributions` transport shape, including the manual-publish fields (`publishMethod`, `platformPostId`, `platformUrl`). |
15
+ | `PlatformContent`, `YouTubeContent`, `LinkedInContent`, `InstagramContent`, `XContent`, `AnyPlatformContent`, `PlatformContentMap`, `Platform` | Typed interfaces for platform-specific content stored in `content_distributions.platform_content`. |
16
+
17
+ ## Step catalog reconciliation
18
+
19
+ `ContentStepKeySchema` is free text today — the content System's step catalog (`content:catalog/<pipeline>-steps`) is authored separately in `packages/elevasis/core/config/organization-model`. Closed-catalog membership is enforced by the caller/API layer via model-injected validators once that catalog lands, mirroring how `LeadGenStageKeySchema` and `CrmStageKeySchema` are validated today.