@elevasis/core 0.23.0 → 0.24.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 (241) hide show
  1. package/dist/index.d.ts +1326 -552
  2. package/dist/index.js +869 -154
  3. package/dist/knowledge/index.d.ts +487 -209
  4. package/dist/knowledge/index.js +104 -1
  5. package/dist/organization-model/index.d.ts +1326 -552
  6. package/dist/organization-model/index.js +869 -154
  7. package/dist/test-utils/index.d.ts +357 -72
  8. package/dist/test-utils/index.js +795 -142
  9. package/package.json +5 -5
  10. package/src/README.md +14 -14
  11. package/src/__tests__/publish.test.ts +24 -24
  12. package/src/__tests__/template-core-compatibility.test.ts +9 -12
  13. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2102 -2096
  14. package/src/_gen/__tests__/scaffold-contracts.test.ts +30 -30
  15. package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +217 -217
  16. package/src/auth/multi-tenancy/credentials/server/encryption.ts +69 -69
  17. package/src/auth/multi-tenancy/credentials/server/kek-loader.ts +37 -37
  18. package/src/auth/multi-tenancy/index.ts +26 -26
  19. package/src/auth/multi-tenancy/invitations/api-schemas.ts +104 -104
  20. package/src/auth/multi-tenancy/memberships/api-schemas.ts +143 -143
  21. package/src/auth/multi-tenancy/memberships/index.ts +26 -26
  22. package/src/auth/multi-tenancy/memberships/membership.ts +130 -130
  23. package/src/auth/multi-tenancy/organizations/__tests__/api-schemas.test.ts +194 -194
  24. package/src/auth/multi-tenancy/organizations/api-schemas.ts +136 -136
  25. package/src/auth/multi-tenancy/permissions.test.ts +42 -42
  26. package/src/auth/multi-tenancy/permissions.ts +123 -123
  27. package/src/auth/multi-tenancy/role-management/api-schemas.ts +78 -78
  28. package/src/auth/multi-tenancy/role-management/index.ts +16 -16
  29. package/src/auth/multi-tenancy/theme-presets.ts +45 -45
  30. package/src/auth/multi-tenancy/types.ts +57 -57
  31. package/src/auth/multi-tenancy/users/api-schemas.ts +165 -165
  32. package/src/business/README.md +2 -2
  33. package/src/business/acquisition/activity-events.test.ts +250 -250
  34. package/src/business/acquisition/activity-events.ts +93 -93
  35. package/src/business/acquisition/api-schemas.test.ts +1883 -1843
  36. package/src/business/acquisition/api-schemas.ts +1492 -1497
  37. package/src/business/acquisition/build-templates.test.ts +240 -240
  38. package/src/business/acquisition/build-templates.ts +98 -98
  39. package/src/business/acquisition/crm-next-action.test.ts +262 -262
  40. package/src/business/acquisition/crm-next-action.ts +220 -220
  41. package/src/business/acquisition/crm-priority.test.ts +216 -216
  42. package/src/business/acquisition/crm-priority.ts +349 -349
  43. package/src/business/acquisition/crm-state-actions.test.ts +153 -153
  44. package/src/business/acquisition/deal-ownership.test.ts +351 -351
  45. package/src/business/acquisition/deal-ownership.ts +120 -120
  46. package/src/business/acquisition/derive-actions.test.ts +129 -104
  47. package/src/business/acquisition/derive-actions.ts +74 -84
  48. package/src/business/acquisition/index.ts +171 -170
  49. package/src/business/acquisition/ontology-validation.ts +309 -0
  50. package/src/business/acquisition/stateful.ts +30 -30
  51. package/src/business/acquisition/types.ts +396 -396
  52. package/src/business/clients/api-schemas.test.ts +115 -115
  53. package/src/business/clients/api-schemas.ts +158 -158
  54. package/src/business/clients/index.ts +1 -1
  55. package/src/business/crm/api-schemas.ts +40 -40
  56. package/src/business/crm/index.ts +1 -1
  57. package/src/business/deals/api-schemas.ts +87 -87
  58. package/src/business/deals/index.ts +1 -1
  59. package/src/business/index.ts +5 -5
  60. package/src/business/projects/types.ts +144 -144
  61. package/src/commands/queue/types/task.ts +15 -15
  62. package/src/execution/core/runner-types.ts +61 -61
  63. package/src/execution/core/sse-executions.ts +7 -7
  64. package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -10
  65. package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -16
  66. package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -4
  67. package/src/execution/engine/agent/core/types.ts +25 -25
  68. package/src/execution/engine/agent/index.ts +6 -6
  69. package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -24
  70. package/src/execution/engine/index.ts +443 -443
  71. package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +298 -298
  72. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.test.ts +55 -55
  73. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +107 -107
  74. package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts +48 -48
  75. package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.ts +99 -99
  76. package/src/execution/engine/tools/integration/server/adapters/apollo/index.ts +1 -1
  77. package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +363 -363
  78. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +162 -162
  79. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +316 -316
  80. package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.test.ts +18 -18
  81. package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.ts +194 -194
  82. package/src/execution/engine/tools/integration/server/adapters/clickup/index.ts +7 -7
  83. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +204 -204
  84. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +105 -105
  85. package/src/execution/engine/tools/integration/server/adapters/google-calendar/google-calendar-adapter.ts +428 -428
  86. package/src/execution/engine/tools/integration/server/adapters/google-calendar/index.ts +2 -2
  87. package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
  88. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1474 -1474
  89. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +103 -103
  90. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.test.ts +88 -88
  91. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +141 -141
  92. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +76 -76
  93. package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +182 -182
  94. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +310 -310
  95. package/src/execution/engine/tools/integration/service.test.ts +239 -239
  96. package/src/execution/engine/tools/integration/service.ts +172 -172
  97. package/src/execution/engine/tools/integration/tool.ts +255 -255
  98. package/src/execution/engine/tools/lead-service-types.ts +1005 -1005
  99. package/src/execution/engine/tools/messages.ts +43 -43
  100. package/src/execution/engine/tools/platform/acquisition/company-tools.ts +7 -7
  101. package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +6 -6
  102. package/src/execution/engine/tools/platform/acquisition/list-tools.ts +6 -6
  103. package/src/execution/engine/tools/platform/acquisition/types.ts +280 -280
  104. package/src/execution/engine/tools/platform/email/types.ts +97 -97
  105. package/src/execution/engine/tools/registry.ts +704 -704
  106. package/src/execution/engine/tools/tool-maps.ts +831 -831
  107. package/src/execution/engine/tools/types.ts +234 -234
  108. package/src/execution/engine/workflow/types.ts +202 -202
  109. package/src/execution/external/__tests__/api-schemas.test.ts +127 -127
  110. package/src/execution/external/api-schemas.ts +40 -40
  111. package/src/execution/external/index.ts +1 -1
  112. package/src/index.ts +18 -18
  113. package/src/integrations/credentials/__tests__/api-schemas.test.ts +420 -420
  114. package/src/integrations/credentials/api-schemas.ts +146 -146
  115. package/src/integrations/credentials/schemas.ts +200 -200
  116. package/src/integrations/oauth/__tests__/provider-registry.test.ts +7 -7
  117. package/src/integrations/oauth/provider-registry.ts +74 -74
  118. package/src/integrations/oauth/server/credentials.ts +43 -43
  119. package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +327 -327
  120. package/src/integrations/webhook-endpoints/api-schemas.ts +103 -103
  121. package/src/integrations/webhook-endpoints/types.ts +58 -58
  122. package/src/knowledge/README.md +32 -32
  123. package/src/knowledge/__tests__/queries.test.ts +626 -535
  124. package/src/knowledge/format.ts +99 -99
  125. package/src/knowledge/index.ts +5 -5
  126. package/src/knowledge/published.ts +5 -5
  127. package/src/knowledge/queries.ts +269 -218
  128. package/src/operations/activities/api-schemas.ts +80 -80
  129. package/src/operations/activities/types.ts +64 -64
  130. package/src/organization-model/README.md +149 -149
  131. package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -210
  132. package/src/organization-model/__tests__/defaults.test.ts +168 -168
  133. package/src/organization-model/__tests__/domains/actions.test.ts +78 -56
  134. package/src/organization-model/__tests__/domains/customers.test.ts +299 -299
  135. package/src/organization-model/__tests__/domains/entities.test.ts +56 -56
  136. package/src/organization-model/__tests__/domains/goals.test.ts +493 -493
  137. package/src/organization-model/__tests__/domains/identity.test.ts +280 -280
  138. package/src/organization-model/__tests__/domains/navigation.test.ts +268 -268
  139. package/src/organization-model/__tests__/domains/offerings.test.ts +414 -414
  140. package/src/organization-model/__tests__/domains/policies.test.ts +323 -323
  141. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +293 -293
  142. package/src/organization-model/__tests__/domains/resources.test.ts +382 -283
  143. package/src/organization-model/__tests__/domains/roles.test.ts +463 -463
  144. package/src/organization-model/__tests__/domains/statuses.test.ts +246 -246
  145. package/src/organization-model/__tests__/domains/systems.test.ts +209 -209
  146. package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -361
  147. package/src/organization-model/__tests__/foundation.test.ts +77 -77
  148. package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -144
  149. package/src/organization-model/__tests__/graph.test.ts +1246 -887
  150. package/src/organization-model/__tests__/icons.test.ts +10 -1
  151. package/src/organization-model/__tests__/knowledge.test.ts +251 -15
  152. package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -438
  153. package/src/organization-model/__tests__/migration-helpers.test.ts +591 -591
  154. package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -103
  155. package/src/organization-model/__tests__/recursive-system-schema.test.ts +535 -506
  156. package/src/organization-model/__tests__/resolve.test.ts +274 -164
  157. package/src/organization-model/__tests__/schema.test.ts +834 -301
  158. package/src/organization-model/__tests__/surface-projection.test.ts +284 -284
  159. package/src/organization-model/catalogs/lead-gen.ts +144 -144
  160. package/src/organization-model/content-kinds/config.ts +36 -36
  161. package/src/organization-model/content-kinds/index.ts +76 -72
  162. package/src/organization-model/content-kinds/pipeline.ts +68 -68
  163. package/src/organization-model/content-kinds/registry.ts +44 -44
  164. package/src/organization-model/content-kinds/status.ts +71 -71
  165. package/src/organization-model/content-kinds/template.ts +83 -83
  166. package/src/organization-model/content-kinds/types.ts +117 -117
  167. package/src/organization-model/contracts.ts +27 -27
  168. package/src/organization-model/defaults.ts +40 -50
  169. package/src/organization-model/domains/actions.ts +333 -239
  170. package/src/organization-model/domains/customers.ts +78 -78
  171. package/src/organization-model/domains/entities.ts +144 -144
  172. package/src/organization-model/domains/goals.ts +83 -83
  173. package/src/organization-model/domains/knowledge.ts +117 -101
  174. package/src/organization-model/domains/navigation.ts +139 -139
  175. package/src/organization-model/domains/offerings.ts +71 -71
  176. package/src/organization-model/domains/policies.ts +102 -102
  177. package/src/organization-model/domains/projects.ts +14 -14
  178. package/src/organization-model/domains/prospecting.ts +395 -395
  179. package/src/organization-model/domains/resources.ts +167 -132
  180. package/src/organization-model/domains/roles.ts +96 -96
  181. package/src/organization-model/domains/sales.test.ts +218 -218
  182. package/src/organization-model/domains/sales.ts +380 -380
  183. package/src/organization-model/domains/shared.ts +63 -63
  184. package/src/organization-model/domains/statuses.ts +339 -339
  185. package/src/organization-model/domains/systems.ts +217 -172
  186. package/src/organization-model/foundation.ts +75 -75
  187. package/src/organization-model/graph/build.ts +1016 -888
  188. package/src/organization-model/graph/index.ts +4 -4
  189. package/src/organization-model/graph/link.ts +10 -10
  190. package/src/organization-model/graph/schema.ts +76 -70
  191. package/src/organization-model/graph/types.ts +73 -67
  192. package/src/organization-model/helpers.ts +289 -241
  193. package/src/organization-model/icons.ts +78 -66
  194. package/src/organization-model/index.ts +130 -128
  195. package/src/organization-model/migration-helpers.ts +247 -244
  196. package/src/organization-model/ontology.ts +661 -0
  197. package/src/organization-model/organization-graph.mdx +110 -90
  198. package/src/organization-model/organization-model.mdx +226 -219
  199. package/src/organization-model/published.ts +289 -235
  200. package/src/organization-model/resolve.ts +146 -91
  201. package/src/organization-model/schema.ts +790 -671
  202. package/src/organization-model/surface-projection.ts +212 -212
  203. package/src/organization-model/types.ts +177 -167
  204. package/src/platform/api/types.ts +38 -38
  205. package/src/platform/constants/versions.ts +3 -3
  206. package/src/platform/index.ts +23 -23
  207. package/src/platform/registry/__tests__/command-view.test.ts +10 -10
  208. package/src/platform/registry/__tests__/resource-link.test.ts +35 -35
  209. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +20 -20
  210. package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -245
  211. package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2053
  212. package/src/platform/registry/__tests__/validation.test.ts +1347 -1347
  213. package/src/platform/registry/command-view.ts +10 -10
  214. package/src/platform/registry/index.ts +103 -103
  215. package/src/platform/registry/resource-link.ts +32 -32
  216. package/src/platform/registry/resource-registry.ts +890 -890
  217. package/src/platform/registry/serialization.ts +295 -295
  218. package/src/platform/registry/serialized-types.ts +166 -166
  219. package/src/platform/registry/stats-types.ts +68 -68
  220. package/src/platform/registry/types.ts +425 -425
  221. package/src/platform/registry/validation.ts +745 -745
  222. package/src/platform/utils/__tests__/validation.test.ts +1084 -1084
  223. package/src/platform/utils/validation.ts +425 -425
  224. package/src/projects/api-schemas.test.ts +39 -39
  225. package/src/projects/api-schemas.ts +291 -291
  226. package/src/reference/_generated/contracts.md +2101 -2096
  227. package/src/reference/glossary.md +76 -76
  228. package/src/scaffold-registry/__tests__/index.test.ts +206 -206
  229. package/src/scaffold-registry/__tests__/schema.test.ts +166 -166
  230. package/src/scaffold-registry/index.ts +392 -392
  231. package/src/scaffold-registry/schema.ts +243 -243
  232. package/src/server.ts +289 -289
  233. package/src/supabase/database.types.ts +3153 -3153
  234. package/src/test-utils/README.md +37 -37
  235. package/src/test-utils/entities.ts +108 -108
  236. package/src/test-utils/fixtures/memberships.ts +82 -82
  237. package/src/test-utils/index.ts +12 -12
  238. package/src/test-utils/organization-model.ts +65 -65
  239. package/src/test-utils/published.ts +6 -6
  240. package/src/test-utils/rls/RLSTestContext.ts +588 -588
  241. package/src/test-utils/test-utils.test.ts +44 -44
@@ -1,203 +1,248 @@
1
- import { z, type ZodType } from 'zod'
2
- import { ActionRefSchema } from './actions'
3
- import {
4
- ColorTokenSchema,
5
- DescriptionSchema,
6
- IconNameSchema,
7
- LabelSchema,
8
- ModelIdSchema,
9
- PathSchema,
10
- ReferenceIdsSchema
11
- } from './shared'
1
+ import { z, type ZodType } from 'zod'
2
+ import { ActionRefSchema } from './actions'
3
+ import {
4
+ ColorTokenSchema,
5
+ DescriptionSchema,
6
+ IconNameSchema,
7
+ LabelSchema,
8
+ ModelIdSchema,
9
+ PathSchema,
10
+ ReferenceIdsSchema
11
+ } from './shared'
12
12
  import { ContentNodeSchema } from '../content-kinds/types'
13
+ import { OntologyScopeSchema, type OntologyScope } from '../ontology'
14
+
15
+ // ---------------------------------------------------------------------------
16
+ // Systems domain
17
+ // ---------------------------------------------------------------------------
18
+ //
19
+ // A System is a tenant-defined bounded context. It can carry UI presence,
20
+ // hierarchy, and governance metadata; non-UI systems simply omit `ui`.
21
+
22
+ export const SystemKindSchema = z
23
+ .enum(['product', 'operational', 'platform', 'diagnostic'])
24
+ .meta({ label: 'System kind', color: 'blue' })
25
+ export const SystemLifecycleSchema = z
26
+ .enum(['draft', 'beta', 'active', 'deprecated', 'archived'])
27
+ .meta({ label: 'Lifecycle', color: 'teal' })
28
+ /** @deprecated Use SystemLifecycleSchema. Accepted for one publish cycle. */
29
+ export const SystemStatusSchema = z.enum(['active', 'deprecated', 'archived']).meta({ label: 'Status', color: 'teal' })
30
+ export const SystemIdSchema = ModelIdSchema
31
+ /**
32
+ * Validates a dot-separated system path (e.g. "sales.lead-gen", "sales.crm").
33
+ * Each segment is lowercase, starts with a letter or digit, and may contain hyphens.
34
+ * This is the canonical form used in `resource.systemPath`.
35
+ */
36
+ export const SystemPathSchema = z
37
+ .string()
38
+ .trim()
39
+ .min(1)
40
+ .regex(
41
+ /^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)*$/,
42
+ 'must be a dotted lowercase path (e.g. "sales.lead-gen" or "sales.crm")'
43
+ )
44
+ export const UiPositionSchema = z.enum(['sidebar-primary', 'sidebar-bottom']).meta({ label: 'UI position' })
45
+ export const NodeIdPathSchema = SystemIdSchema
46
+ export const NodeIdStringSchema = z
47
+ .string()
48
+ .trim()
49
+ .min(1)
50
+ .max(200)
51
+ // D4: kind prefix allows hyphens (e.g. 'content-node'); id allows colons for
52
+ // qualified content-node references ('content-node:sales.crm:default-pipeline').
53
+ .regex(
54
+ /^[a-z][a-z-]*:([a-z0-9-]+)(\.[a-z0-9-]+)*(:[a-z0-9.-]+)*$/,
55
+ 'Node references must use kind:dotted-path (e.g. system:sales.crm or content-node:sales.crm:pipeline-id)'
56
+ )
57
+
58
+ export const SystemUiSchema = z.object({
59
+ path: PathSchema,
60
+ surfaces: ReferenceIdsSchema,
61
+ icon: IconNameSchema.optional(),
62
+ order: z.number().int().optional()
63
+ })
64
+
65
+ // ---------------------------------------------------------------------------
66
+ // Recursive SystemEntry schema.
67
+ //
68
+ // TypeScript cannot infer the type of a schema that references itself through
69
+ // z.lazy(). The standard Zod fix is to:
70
+ // 1. Declare the output type as an explicit interface BEFORE the schema.
71
+ // 2. Annotate the schema variable with `ZodType<SystemEntry>` so TS uses
72
+ // the declared interface instead of trying to infer through the cycle.
73
+ // ---------------------------------------------------------------------------
74
+
75
+ import type { ContentNode } from '../content-kinds/types'
13
76
 
14
- // ---------------------------------------------------------------------------
15
- // Systems domain
16
- // ---------------------------------------------------------------------------
17
- //
18
- // A System is a tenant-defined bounded context. It can carry UI presence,
19
- // hierarchy, and governance metadata; non-UI systems simply omit `ui`.
20
-
21
- export const SystemKindSchema = z
22
- .enum(['product', 'operational', 'platform', 'diagnostic'])
23
- .meta({ label: 'System kind', color: 'blue' })
24
- export const SystemLifecycleSchema = z
25
- .enum(['draft', 'beta', 'active', 'deprecated', 'archived'])
26
- .meta({ label: 'Lifecycle', color: 'teal' })
27
- /** @deprecated Use SystemLifecycleSchema. Accepted for one publish cycle. */
28
- export const SystemStatusSchema = z.enum(['active', 'deprecated', 'archived']).meta({ label: 'Status', color: 'teal' })
29
- export const SystemIdSchema = ModelIdSchema
30
- /**
31
- * Validates a dot-separated system path (e.g. "sales.lead-gen", "sales.crm").
32
- * Each segment is lowercase, starts with a letter or digit, and may contain hyphens.
33
- * This is the canonical form used in `resource.systemPath`.
34
- */
35
- export const SystemPathSchema = z
36
- .string()
37
- .trim()
38
- .min(1)
39
- .regex(
40
- /^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)*$/,
41
- 'must be a dotted lowercase path (e.g. "sales.lead-gen" or "sales.crm")'
42
- )
43
- export const UiPositionSchema = z.enum(['sidebar-primary', 'sidebar-bottom']).meta({ label: 'UI position' })
44
- export const NodeIdPathSchema = SystemIdSchema
45
- export const NodeIdStringSchema = z
46
- .string()
47
- .trim()
48
- .min(1)
49
- .max(200)
50
- // D4: kind prefix allows hyphens (e.g. 'content-node'); id allows colons for
51
- // qualified content-node references ('content-node:sales.crm:default-pipeline').
52
- .regex(
53
- /^[a-z][a-z-]*:([a-z0-9-]+)(\.[a-z0-9-]+)*(:[a-z0-9.-]+)*$/,
54
- 'Node references must use kind:dotted-path (e.g. system:sales.crm or content-node:sales.crm:pipeline-id)'
55
- )
56
-
57
- export const SystemUiSchema = z.object({
58
- path: PathSchema,
59
- surfaces: ReferenceIdsSchema,
60
- icon: IconNameSchema.optional(),
61
- order: z.number().int().optional()
62
- })
77
+ export type JsonPrimitive = string | number | boolean | null
78
+ export type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }
63
79
 
64
- // ---------------------------------------------------------------------------
65
- // Recursive SystemEntry schema.
66
- //
67
- // TypeScript cannot infer the type of a schema that references itself through
68
- // z.lazy(). The standard Zod fix is to:
69
- // 1. Declare the output type as an explicit interface BEFORE the schema.
70
- // 2. Annotate the schema variable with `ZodType<SystemEntry>` so TS uses
71
- // the declared interface instead of trying to infer through the cycle.
72
- // ---------------------------------------------------------------------------
80
+ export const JsonValueSchema: ZodType<JsonValue> = z.lazy(() =>
81
+ z.union([
82
+ z.string(),
83
+ z.number(),
84
+ z.boolean(),
85
+ z.null(),
86
+ z.array(JsonValueSchema),
87
+ z.record(z.string(), JsonValueSchema)
88
+ ])
89
+ )
73
90
 
74
- import type { ContentNode } from '../content-kinds/types'
91
+ export const SystemConfigSchema = z
92
+ .record(z.string().trim().min(1).max(200), JsonValueSchema)
93
+ .default({})
94
+ .optional()
75
95
 
76
96
  /** Explicit interface needed to annotate the recursive SystemEntrySchema. */
77
97
  export interface SystemEntry {
78
- id: string
79
- label?: string
80
- title?: string
81
- description?: string
82
- kind?: 'product' | 'operational' | 'platform' | 'diagnostic'
83
- parentSystemId?: string
84
- ui?: { path: string; surfaces: string[]; icon?: string; order?: number }
85
- lifecycle?: 'draft' | 'beta' | 'active' | 'deprecated' | 'archived'
86
- responsibleRoleId?: string
87
- governedByKnowledge?: string[]
88
- actions?: { actionId: string; intent: 'exposes' | 'consumes'; invocation?: unknown }[]
89
- policies?: string[]
90
- drivesGoals?: string[]
91
- /** @deprecated Use lifecycle. Accepted for one publish cycle. */
92
- status?: 'active' | 'deprecated' | 'archived'
93
- path?: string
94
- icon?: string
95
- color?: string
96
- uiPosition?: 'sidebar-primary' | 'sidebar-bottom'
97
- enabled?: boolean
98
+ id: string
99
+ label?: string
100
+ title?: string
101
+ description?: string
102
+ kind?: 'product' | 'operational' | 'platform' | 'diagnostic'
103
+ parentSystemId?: string
104
+ ui?: { path: string; surfaces: string[]; icon?: string; order?: number }
105
+ lifecycle?: 'draft' | 'beta' | 'active' | 'deprecated' | 'archived'
106
+ responsibleRoleId?: string
107
+ governedByKnowledge?: string[]
108
+ actions?: { actionId: string; intent: 'exposes' | 'consumes'; invocation?: unknown }[]
109
+ policies?: string[]
110
+ drivesGoals?: string[]
111
+ /** @deprecated Use lifecycle. Accepted for one publish cycle. */
112
+ status?: 'active' | 'deprecated' | 'archived'
113
+ path?: string
114
+ icon?: string
115
+ color?: string
116
+ uiPosition?: 'sidebar-primary' | 'sidebar-bottom'
117
+ enabled?: boolean
98
118
  devOnly?: boolean
99
119
  requiresAdmin?: boolean
100
120
  order: number
121
+ config?: Record<string, JsonValue>
122
+ ontology?: OntologyScope
123
+ systems?: Record<string, SystemEntry>
124
+ /**
125
+ * @deprecated Compatibility-only bridge for old tenant data and migration readers.
126
+ * Author new semantic catalogs in `ontology` and local settings in `config`.
127
+ */
101
128
  content?: Record<string, ContentNode>
102
129
  subsystems?: Record<string, SystemEntry>
103
130
  }
104
-
105
- export const SystemEntrySchema: ZodType<SystemEntry> = z
106
- .object({
107
- /** Stable tenant-defined system id (e.g. "sys.lead-gen" or "sales.crm"). */
108
- id: SystemIdSchema,
109
- /** Human-readable system label shown in UI, governance, and operations surfaces. */
110
- label: LabelSchema.optional(),
111
- /** @deprecated Use label. Accepted for pre-consolidation System declarations. */
112
- title: LabelSchema.optional(),
113
- /** One-paragraph purpose statement for the bounded context. */
114
- description: DescriptionSchema.optional(),
115
- /** Closed system shape enum; catalog values remain tenant-defined. */
116
- kind: SystemKindSchema.optional(),
117
- /** Optional self-reference for System hierarchy. */
118
- parentSystemId: SystemIdSchema.optional(),
119
- /** Optional UI presence. Systems without UI omit this. */
120
- ui: SystemUiSchema.optional(),
121
- /** Canonical lifecycle state. Replaces Feature.enabled/devOnly and System.status. */
122
- lifecycle: SystemLifecycleSchema.optional(),
123
- /** Optional role responsible for this system. */
124
- responsibleRoleId: ModelIdSchema.meta({ ref: 'role' }).optional(),
125
- /** Optional knowledge nodes that govern this system. */
126
- governedByKnowledge: z
127
- .array(ModelIdSchema.meta({ ref: 'knowledge' }))
128
- .default([])
129
- .optional(),
130
- /** Optional actions this system exposes or consumes. */
131
- actions: z.array(ActionRefSchema).optional(),
132
- /** Optional operational policies that apply to this system. */
133
- policies: z
134
- .array(ModelIdSchema.meta({ ref: 'policy' }))
135
- .default([])
136
- .optional(),
137
- /** Optional goals this system contributes to. */
138
- drivesGoals: z
139
- .array(ModelIdSchema.meta({ ref: 'goal' }))
140
- .default([])
141
- .optional(),
142
- /** @deprecated Use lifecycle. Accepted for one publish cycle. */
143
- status: SystemStatusSchema.optional(),
144
- /** @deprecated Use ui.path. Kept for one-cycle Feature compatibility. */
145
- path: PathSchema.optional(),
146
- /** @deprecated Use ui.icon. Kept for one-cycle Feature compatibility. */
147
- icon: IconNameSchema.optional(),
148
- /** @deprecated Feature color token, retained for one-cycle compatibility. */
149
- color: ColorTokenSchema.optional(),
150
- /** @deprecated UI placement hint, retained for one-cycle compatibility. */
151
- uiPosition: UiPositionSchema.optional(),
152
- /** @deprecated Use lifecycle. */
153
- enabled: z.boolean().optional(),
154
- /** @deprecated Use lifecycle: "beta". */
155
- devOnly: z.boolean().optional(),
131
+
132
+ export const SystemEntrySchema: ZodType<SystemEntry> = z
133
+ .object({
134
+ /** Stable tenant-defined system id (e.g. "sys.lead-gen" or "sales.crm"). */
135
+ id: SystemIdSchema,
136
+ /** Human-readable system label shown in UI, governance, and operations surfaces. */
137
+ label: LabelSchema.optional(),
138
+ /** @deprecated Use label. Accepted for pre-consolidation System declarations. */
139
+ title: LabelSchema.optional(),
140
+ /** One-paragraph purpose statement for the bounded context. */
141
+ description: DescriptionSchema.optional(),
142
+ /** Closed system shape enum; catalog values remain tenant-defined. */
143
+ kind: SystemKindSchema.optional(),
144
+ /** Optional self-reference for System hierarchy. */
145
+ parentSystemId: SystemIdSchema.optional(),
146
+ /** Optional UI presence. Systems without UI omit this. */
147
+ ui: SystemUiSchema.optional(),
148
+ /** Canonical lifecycle state. Replaces Feature.enabled/devOnly and System.status. */
149
+ lifecycle: SystemLifecycleSchema.optional(),
150
+ /** Optional role responsible for this system. */
151
+ responsibleRoleId: ModelIdSchema.meta({ ref: 'role' }).optional(),
152
+ /** Optional knowledge nodes that govern this system. */
153
+ governedByKnowledge: z
154
+ .array(ModelIdSchema.meta({ ref: 'knowledge' }))
155
+ .default([])
156
+ .optional(),
157
+ /** Optional actions this system exposes or consumes. */
158
+ actions: z.array(ActionRefSchema).optional(),
159
+ /** Optional operational policies that apply to this system. */
160
+ policies: z
161
+ .array(ModelIdSchema.meta({ ref: 'policy' }))
162
+ .default([])
163
+ .optional(),
164
+ /** Optional goals this system contributes to. */
165
+ drivesGoals: z
166
+ .array(ModelIdSchema.meta({ ref: 'goal' }))
167
+ .default([])
168
+ .optional(),
169
+ /** @deprecated Use lifecycle. Accepted for one publish cycle. */
170
+ status: SystemStatusSchema.optional(),
171
+ /** @deprecated Use ui.path. Kept for one-cycle Feature compatibility. */
172
+ path: PathSchema.optional(),
173
+ /** @deprecated Use ui.icon. Kept for one-cycle Feature compatibility. */
174
+ icon: IconNameSchema.optional(),
175
+ /** @deprecated Feature color token, retained for one-cycle compatibility. */
176
+ color: ColorTokenSchema.optional(),
177
+ /** @deprecated UI placement hint, retained for one-cycle compatibility. */
178
+ uiPosition: UiPositionSchema.optional(),
179
+ /** @deprecated Use lifecycle. */
180
+ enabled: z.boolean().optional(),
181
+ /** @deprecated Use lifecycle: "beta". */
182
+ devOnly: z.boolean().optional(),
156
183
  requiresAdmin: z.boolean().optional(),
157
184
  /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
158
185
  order: z.number(),
159
186
  /**
160
- * System-scoped operational data, co-located with the owning system.
161
- * Per L1, L3, L13: keyed by local NodeId (the key is the local id; qualified
162
- * id is `<system-path>:<local-id>`, computed by graph projection).
163
- * Per L14: every ContentNode carries both `kind` and `type`.
164
- * Per D2: unregistered (kind, type) pairs parse successfully.
187
+ * System-local JSON settings and defaults. Strongly typed OM fields,
188
+ * secrets, credentials, and runtime state stay outside this bucket.
189
+ */
190
+ config: SystemConfigSchema,
191
+ /**
192
+ * System-owned ontology declarations. `systems` is now the canonical child
193
+ * key; this scope holds the object, action, catalog, link, event, and
194
+ * shared contract records owned by this system.
165
195
  */
166
- content: z.record(z.string().trim().min(1).max(200), ContentNodeSchema).optional(),
196
+ ontology: OntologyScopeSchema.optional(),
167
197
  /**
168
- * Recursive child systems, authored via nesting (per L11).
169
- * The key is the local system id; the full path is computed by joining
170
- * ancestor keys with `.` (e.g. parent key `'sales'` + child key `'crm'` → `'sales.crm'`).
171
- * Per Phase 4: `id` and `parentSystemId` fields will be removed in favour of
172
- * position-derived paths. Both still exist on this schema for backward compat.
198
+ * @deprecated Compatibility-only bridge for old tenant content nodes and
199
+ * migration readers. New schema/catalog authoring belongs in ontology;
200
+ * new system-local settings belong in config. Bridge nodes are keyed by
201
+ * local NodeId and may still project to content-node:* graph IDs.
173
202
  */
203
+ content: z.record(z.string().trim().min(1).max(200), ContentNodeSchema).optional(),
204
+ /**
205
+ * Recursive child systems, authored via nesting (per L11).
206
+ * The key is the local system id; the full path is computed by joining
207
+ * ancestor keys with `.` (e.g. parent key `'sales'` + child key `'crm'` → `'sales.crm'`).
208
+ * Per Phase 4: `id` and `parentSystemId` fields will be removed in favour of
209
+ * position-derived paths. Both still exist on this schema for backward compat.
210
+ */
211
+ systems: z.lazy(() => z.record(z.string().trim().min(1).max(100), SystemEntrySchema)).optional(),
212
+ /** @deprecated Use systems. Accepted as a compatibility alias during the ontology bridge. */
174
213
  subsystems: z.lazy(() => z.record(z.string().trim().min(1).max(100), SystemEntrySchema)).optional()
175
214
  })
176
- .refine((system: SystemEntry) => system.label !== undefined || system.title !== undefined, {
177
- path: ['label'],
178
- message: 'System must provide label or title'
179
- })
215
+ .refine((system: SystemEntry) => system.label !== undefined || system.title !== undefined, {
216
+ path: ['label'],
217
+ message: 'System must provide label or title'
218
+ })
180
219
  .transform((system: SystemEntry) => {
181
- if (system.status === undefined) return system
220
+ const normalizedSystem =
221
+ system.systems !== undefined && system.subsystems === undefined ? { ...system, subsystems: system.systems } : system
182
222
 
183
- console.warn('[organization-model] System.status is deprecated; use System.lifecycle instead.')
184
- return system.lifecycle === undefined ? { ...system, lifecycle: system.status } : system
185
- })
223
+ if (normalizedSystem.status === undefined) return normalizedSystem
186
224
 
187
- export const SystemsDomainSchema = z
188
- .record(z.string(), SystemEntrySchema)
189
- .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
190
- message: 'Each system entry id must match its map key'
225
+ console.warn('[organization-model] System.status is deprecated; use System.lifecycle instead.')
226
+ return normalizedSystem.lifecycle === undefined
227
+ ? { ...normalizedSystem, lifecycle: normalizedSystem.status }
228
+ : normalizedSystem
191
229
  })
192
- .default({})
193
-
194
- export const DEFAULT_ORGANIZATION_MODEL_SYSTEMS: z.infer<typeof SystemsDomainSchema> = {}
195
-
196
- export type SystemId = z.infer<typeof SystemIdSchema>
230
+
231
+ export const SystemsDomainSchema = z
232
+ .record(z.string(), SystemEntrySchema)
233
+ .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
234
+ message: 'Each system entry id must match its map key'
235
+ })
236
+ .default({})
237
+
238
+ export const DEFAULT_ORGANIZATION_MODEL_SYSTEMS: z.infer<typeof SystemsDomainSchema> = {}
239
+
240
+ export type SystemId = z.infer<typeof SystemIdSchema>
197
241
  export type SystemKind = z.infer<typeof SystemKindSchema>
198
242
  export type SystemLifecycle = z.infer<typeof SystemLifecycleSchema>
199
243
  /** @deprecated Use SystemLifecycle. Accepted for one publish cycle. */
200
244
  export type SystemStatus = z.infer<typeof SystemStatusSchema>
245
+ export type SystemLocalConfig = z.infer<typeof SystemConfigSchema>
201
246
  // SystemEntry is declared as an explicit interface above the schema (required for
202
- // recursive z.lazy() type inference). Re-export omitted — the interface IS the type.
203
- export type SystemsDomain = z.infer<typeof SystemsDomainSchema>
247
+ // recursive z.lazy() type inference). Re-export omitted — the interface IS the type.
248
+ export type SystemsDomain = z.infer<typeof SystemsDomainSchema>
@@ -1,75 +1,75 @@
1
- import { resolveOrganizationModel } from './resolve'
2
- import type { OrganizationModelBuiltinIconToken } from './icons'
3
- import { projectOrganizationSurfaces, type OrganizationSurfaceProjection } from './surface-projection'
4
- import type { DeepPartial, OrganizationModel } from './types'
5
-
6
- export type FoundationSurfaceType = 'page' | 'dashboard' | 'graph' | 'detail' | 'list' | 'settings'
7
-
8
- export type FoundationSurfaceIcon = Extract<
9
- OrganizationModelBuiltinIconToken,
10
- | 'feature.dashboard'
11
- | 'feature.crm'
12
- | 'feature.lead-gen'
13
- | 'feature.projects'
14
- | 'feature.operations'
15
- | 'feature.settings'
16
- >
17
-
18
- export type FoundationNavigationSurface = Omit<OrganizationSurfaceProjection, 'icon' | 'surfaceType'> & {
19
- icon?: FoundationSurfaceIcon | OrganizationModelBuiltinIconToken | string
20
- surfaceType: FoundationSurfaceType
21
- }
22
-
23
- export interface FoundationOrganizationModel extends Omit<OrganizationModel, 'navigation'> {
24
- navigation: {
25
- defaultSurfaceId: string
26
- homeLabel: string
27
- quickAccessSurfaceIds: readonly string[]
28
- surfaces: FoundationNavigationSurface[]
29
- }
30
- }
31
-
32
- export interface FoundationBranding {
33
- organizationName: string
34
- productName: string
35
- shortName: string
36
- }
37
-
38
- export function createFoundationOrganizationModel(override: DeepPartial<OrganizationModel>): {
39
- canonical: OrganizationModel
40
- model: FoundationOrganizationModel
41
- homeLabel: string
42
- quickAccessSurfaceIds: readonly string[]
43
- getOrganizationSurface: (surfaceId: string) => FoundationNavigationSurface | undefined
44
- } {
45
- const canonical = resolveOrganizationModel(override)
46
- const navigationSurfaces: FoundationNavigationSurface[] = projectOrganizationSurfaces(canonical)
47
- const defaultSurface = navigationSurfaces.find((surface) => surface.path === '/') ?? navigationSurfaces[0]
48
- const homeLabel = defaultSurface?.label ?? 'Dashboard'
49
- const quickAccessSurfaceIds = navigationSurfaces
50
- .filter((surface) => surface.id !== defaultSurface?.id && surface.surfaceType !== 'settings')
51
- .slice(0, 4)
52
- .map((surface) => surface.id)
53
-
54
- const model: FoundationOrganizationModel = {
55
- ...canonical,
56
- navigation: {
57
- defaultSurfaceId: defaultSurface?.id ?? '',
58
- homeLabel,
59
- quickAccessSurfaceIds: [...quickAccessSurfaceIds],
60
- surfaces: navigationSurfaces
61
- }
62
- }
63
-
64
- function getOrganizationSurface(surfaceId: string): FoundationNavigationSurface | undefined {
65
- return model.navigation.surfaces.find((candidate) => candidate.id === surfaceId)
66
- }
67
-
68
- return {
69
- canonical,
70
- model,
71
- homeLabel,
72
- quickAccessSurfaceIds,
73
- getOrganizationSurface
74
- }
75
- }
1
+ import { resolveOrganizationModel } from './resolve'
2
+ import type { OrganizationModelBuiltinIconToken } from './icons'
3
+ import { projectOrganizationSurfaces, type OrganizationSurfaceProjection } from './surface-projection'
4
+ import type { DeepPartial, OrganizationModel } from './types'
5
+
6
+ export type FoundationSurfaceType = 'page' | 'dashboard' | 'graph' | 'detail' | 'list' | 'settings'
7
+
8
+ export type FoundationSurfaceIcon = Extract<
9
+ OrganizationModelBuiltinIconToken,
10
+ | 'feature.dashboard'
11
+ | 'feature.crm'
12
+ | 'feature.lead-gen'
13
+ | 'feature.projects'
14
+ | 'feature.operations'
15
+ | 'feature.settings'
16
+ >
17
+
18
+ export type FoundationNavigationSurface = Omit<OrganizationSurfaceProjection, 'icon' | 'surfaceType'> & {
19
+ icon?: FoundationSurfaceIcon | OrganizationModelBuiltinIconToken | string
20
+ surfaceType: FoundationSurfaceType
21
+ }
22
+
23
+ export interface FoundationOrganizationModel extends Omit<OrganizationModel, 'navigation'> {
24
+ navigation: {
25
+ defaultSurfaceId: string
26
+ homeLabel: string
27
+ quickAccessSurfaceIds: readonly string[]
28
+ surfaces: FoundationNavigationSurface[]
29
+ }
30
+ }
31
+
32
+ export interface FoundationBranding {
33
+ organizationName: string
34
+ productName: string
35
+ shortName: string
36
+ }
37
+
38
+ export function createFoundationOrganizationModel(override: DeepPartial<OrganizationModel>): {
39
+ canonical: OrganizationModel
40
+ model: FoundationOrganizationModel
41
+ homeLabel: string
42
+ quickAccessSurfaceIds: readonly string[]
43
+ getOrganizationSurface: (surfaceId: string) => FoundationNavigationSurface | undefined
44
+ } {
45
+ const canonical = resolveOrganizationModel(override)
46
+ const navigationSurfaces: FoundationNavigationSurface[] = projectOrganizationSurfaces(canonical)
47
+ const defaultSurface = navigationSurfaces.find((surface) => surface.path === '/') ?? navigationSurfaces[0]
48
+ const homeLabel = defaultSurface?.label ?? 'Dashboard'
49
+ const quickAccessSurfaceIds = navigationSurfaces
50
+ .filter((surface) => surface.id !== defaultSurface?.id && surface.surfaceType !== 'settings')
51
+ .slice(0, 4)
52
+ .map((surface) => surface.id)
53
+
54
+ const model: FoundationOrganizationModel = {
55
+ ...canonical,
56
+ navigation: {
57
+ defaultSurfaceId: defaultSurface?.id ?? '',
58
+ homeLabel,
59
+ quickAccessSurfaceIds: [...quickAccessSurfaceIds],
60
+ surfaces: navigationSurfaces
61
+ }
62
+ }
63
+
64
+ function getOrganizationSurface(surfaceId: string): FoundationNavigationSurface | undefined {
65
+ return model.navigation.surfaces.find((candidate) => candidate.id === surfaceId)
66
+ }
67
+
68
+ return {
69
+ canonical,
70
+ model,
71
+ homeLabel,
72
+ quickAccessSurfaceIds,
73
+ getOrganizationSurface
74
+ }
75
+ }