@elevasis/sdk 1.44.2 → 1.45.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 (245) hide show
  1. package/dist/cli.cjs +1001 -652
  2. package/dist/index.d.ts +1045 -509
  3. package/dist/index.js +748 -690
  4. package/dist/node/index.d.ts +105 -97
  5. package/dist/test-utils/index.d.ts +42 -28
  6. package/dist/test-utils/index.js +549 -732
  7. package/dist/worker/index.d.ts +12112 -0
  8. package/dist/worker/index.js +211 -186
  9. package/package.json +6 -9
  10. package/reference/_navigation.md +151 -21
  11. package/reference/_reference-manifest.json +186 -4
  12. package/reference/claude-config.md +8 -0
  13. package/reference/core/index.mdx +3 -3
  14. package/reference/examples/organization-model.ts +117 -111
  15. package/reference/index.mdx +4 -4
  16. package/reference/rules/active-change-index.md +40 -54
  17. package/reference/rules/agent-runtime.md +81 -0
  18. package/reference/rules/agent-start-here.md +71 -163
  19. package/reference/rules/deployment.md +33 -10
  20. package/reference/rules/error-handling.md +26 -0
  21. package/reference/rules/execution.md +13 -0
  22. package/reference/rules/frontend.md +10 -3
  23. package/reference/rules/observability.md +9 -1
  24. package/reference/rules/operations.md +26 -17
  25. package/reference/rules/organization-model.md +74 -88
  26. package/reference/rules/organization-os.md +71 -88
  27. package/reference/rules/package-taxonomy.md +11 -2
  28. package/reference/rules/platform.md +13 -7
  29. package/reference/rules/shared-types.md +15 -0
  30. package/reference/rules/task-tracking.md +30 -5
  31. package/reference/rules/ui.md +145 -3
  32. package/reference/rules/vibe-intents.md +271 -0
  33. package/reference/rules/vibe.md +17 -243
  34. package/reference/scaffold/core/organization-graph.mdx +111 -97
  35. package/reference/scaffold/core/organization-model.mdx +234 -214
  36. package/reference/scaffold/operations/propagation-pipeline.md +1 -1
  37. package/reference/scaffold/operations/scaffold-maintenance.md +19 -18
  38. package/reference/scaffold/operations/workflow-recipes.md +71 -19
  39. package/reference/scaffold/recipes/add-a-feature.md +156 -146
  40. package/reference/scaffold/recipes/add-a-resource.md +123 -117
  41. package/reference/scaffold/recipes/customize-crm-actions.md +25 -10
  42. package/reference/scaffold/recipes/customize-knowledge-browser.md +52 -117
  43. package/reference/scaffold/recipes/customize-organization-model.md +161 -149
  44. package/reference/scaffold/recipes/extend-a-base-entity.md +156 -140
  45. package/reference/scaffold/recipes/extend-crm.md +16 -11
  46. package/reference/scaffold/recipes/extend-lead-gen.md +25 -7
  47. package/reference/scaffold/recipes/gate-by-feature-or-admin.md +160 -118
  48. package/reference/scaffold/recipes/index.md +2 -2
  49. package/reference/scaffold/recipes/query-the-knowledge-graph.md +23 -23
  50. package/reference/scaffold/reference/contracts.md +12 -1
  51. package/reference/scaffold/reference/glossary.md +3 -3
  52. package/reference/scaffold/reference/system-interface-capabilities.md +5 -4
  53. package/reference/scaffold/ui/composition-extensibility.mdx +271 -232
  54. package/reference/scaffold/ui/feature-flags-and-gating.md +14 -6
  55. package/reference/scaffold/ui/feature-shell.mdx +279 -62
  56. package/reference/scaffold/ui/recipes.md +229 -197
  57. package/reference/sdk/cli-management.mdx +77 -29
  58. package/reference/sdk/concepts.mdx +2 -0
  59. package/reference/sdk/define-builders.mdx +76 -0
  60. package/reference/sdk/deployment/command-center.mdx +6 -2
  61. package/reference/sdk/deployment/execution-reference.mdx +64 -186
  62. package/reference/sdk/deployment/index.mdx +2 -0
  63. package/reference/sdk/exports.mdx +4 -4
  64. package/reference/sdk/framework/agent.mdx +49 -119
  65. package/reference/sdk/framework/index.mdx +46 -65
  66. package/reference/sdk/framework/project-structure.mdx +150 -205
  67. package/reference/sdk/framework/tutorial-system.mdx +2 -2
  68. package/reference/sdk/human-in-the-loop.mdx +152 -0
  69. package/reference/sdk/index.mdx +6 -7
  70. package/reference/sdk/platform-tools/index.mdx +12 -0
  71. package/reference/sdk/platform-tools/type-safety.mdx +4 -0
  72. package/reference/sdk/project-deployment-spec.mdx +131 -0
  73. package/reference/sdk/resources/index.mdx +23 -7
  74. package/reference/sdk/resources/patterns.mdx +54 -24
  75. package/reference/sdk/resources/types.mdx +7 -4
  76. package/reference/sdk/templates/data-enrichment.mdx +7 -3
  77. package/reference/sdk/templates/email-sender.mdx +139 -135
  78. package/reference/sdk/templates/lead-scorer.mdx +5 -1
  79. package/reference/sdk/templates/pdf-generator.mdx +155 -151
  80. package/reference/sdk/templates/recurring-job.mdx +195 -189
  81. package/reference/sdk/templates/text-classifier.mdx +4 -0
  82. package/reference/sdk/templates/web-scraper.mdx +139 -135
  83. package/reference/spine/spine-primer.md +135 -96
  84. package/reference/ui/index.mdx +14 -7
  85. package/dist/types/worker/adapters/anymailfinder.d.ts +0 -14
  86. package/dist/types/worker/adapters/apify.d.ts +0 -14
  87. package/dist/types/worker/adapters/approval.d.ts +0 -23
  88. package/dist/types/worker/adapters/attio.d.ts +0 -22
  89. package/dist/types/worker/adapters/clickup.d.ts +0 -22
  90. package/dist/types/worker/adapters/create-adapter.d.ts +0 -41
  91. package/dist/types/worker/adapters/crm.d.ts +0 -20
  92. package/dist/types/worker/adapters/dropbox.d.ts +0 -14
  93. package/dist/types/worker/adapters/email.d.ts +0 -25
  94. package/dist/types/worker/adapters/execution.d.ts +0 -22
  95. package/dist/types/worker/adapters/gmail.d.ts +0 -14
  96. package/dist/types/worker/adapters/google-sheets.d.ts +0 -14
  97. package/dist/types/worker/adapters/index.d.ts +0 -33
  98. package/dist/types/worker/adapters/instantly.d.ts +0 -14
  99. package/dist/types/worker/adapters/lead.d.ts +0 -28
  100. package/dist/types/worker/adapters/list.d.ts +0 -9
  101. package/dist/types/worker/adapters/llm.d.ts +0 -45
  102. package/dist/types/worker/adapters/millionverifier.d.ts +0 -14
  103. package/dist/types/worker/adapters/notification.d.ts +0 -28
  104. package/dist/types/worker/adapters/pdf.d.ts +0 -22
  105. package/dist/types/worker/adapters/projects.d.ts +0 -20
  106. package/dist/types/worker/adapters/resend.d.ts +0 -14
  107. package/dist/types/worker/adapters/scheduler.d.ts +0 -25
  108. package/dist/types/worker/adapters/signature-api.d.ts +0 -14
  109. package/dist/types/worker/adapters/storage.d.ts +0 -33
  110. package/dist/types/worker/adapters/stripe.d.ts +0 -14
  111. package/dist/types/worker/adapters/tomba.d.ts +0 -14
  112. package/dist/types/worker/index.d.ts +0 -60
  113. package/dist/types/worker/platform.d.ts +0 -90
  114. package/dist/types/worker/utils.d.ts +0 -9
  115. package/reference/claude-config/Overview.md +0 -230
  116. package/reference/claude-config/hooks/post-edit-validate.mjs +0 -98
  117. package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +0 -187
  118. package/reference/claude-config/hooks/tool-failure-recovery.mjs +0 -73
  119. package/reference/claude-config/registries/graph-skills.json +0 -4
  120. package/reference/claude-config/registries/knowledge-flags.json +0 -154
  121. package/reference/claude-config/registries/skill-coverage.json +0 -20
  122. package/reference/claude-config/rules/active-change-index.md +0 -22
  123. package/reference/claude-config/rules/agent-start-here.md +0 -22
  124. package/reference/claude-config/rules/deployment.md +0 -22
  125. package/reference/claude-config/rules/error-handling.md +0 -22
  126. package/reference/claude-config/rules/execution.md +0 -22
  127. package/reference/claude-config/rules/frontend.md +0 -22
  128. package/reference/claude-config/rules/observability.md +0 -22
  129. package/reference/claude-config/rules/operations.md +0 -22
  130. package/reference/claude-config/rules/organization-model.md +0 -22
  131. package/reference/claude-config/rules/organization-os.md +0 -22
  132. package/reference/claude-config/rules/package-taxonomy.md +0 -22
  133. package/reference/claude-config/rules/platform.md +0 -22
  134. package/reference/claude-config/rules/shared-types.md +0 -22
  135. package/reference/claude-config/rules/task-tracking.md +0 -22
  136. package/reference/claude-config/rules/topbar-actions.md +0 -70
  137. package/reference/claude-config/rules/ui.md +0 -22
  138. package/reference/claude-config/rules/vibe.md +0 -22
  139. package/reference/claude-config/scripts/statusline-command.js +0 -18
  140. package/reference/claude-config/settings.json +0 -30
  141. package/reference/claude-config/skills/client/SKILL.md +0 -201
  142. package/reference/claude-config/skills/deploy/SKILL.md +0 -159
  143. package/reference/claude-config/skills/dsp/SKILL.md +0 -66
  144. package/reference/claude-config/skills/elevasis/SKILL.md +0 -251
  145. package/reference/claude-config/skills/explore/SKILL.md +0 -78
  146. package/reference/claude-config/skills/git-sync/SKILL.md +0 -166
  147. package/reference/claude-config/skills/om/SKILL.md +0 -475
  148. package/reference/claude-config/skills/om/operations/build.md +0 -237
  149. package/reference/claude-config/skills/om/operations/codify-level-a.md +0 -109
  150. package/reference/claude-config/skills/om/operations/codify-level-b.md +0 -159
  151. package/reference/claude-config/skills/om/operations/customers.md +0 -114
  152. package/reference/claude-config/skills/om/operations/features.md +0 -88
  153. package/reference/claude-config/skills/om/operations/goals.md +0 -123
  154. package/reference/claude-config/skills/om/operations/identity.md +0 -97
  155. package/reference/claude-config/skills/om/operations/labels.md +0 -110
  156. package/reference/claude-config/skills/om/operations/offerings.md +0 -114
  157. package/reference/claude-config/skills/om/operations/roles.md +0 -104
  158. package/reference/claude-config/skills/om/operations/scaffold.md +0 -163
  159. package/reference/claude-config/skills/om/operations/techStack.md +0 -38
  160. package/reference/claude-config/skills/project/SKILL.md +0 -1114
  161. package/reference/claude-config/skills/run-ui/SKILL.md +0 -73
  162. package/reference/claude-config/skills/save/SKILL.md +0 -183
  163. package/reference/claude-config/skills/setup/SKILL.md +0 -290
  164. package/reference/claude-config/skills/status/SKILL.md +0 -59
  165. package/reference/claude-config/skills/submit-request/SKILL.md +0 -180
  166. package/reference/claude-config/skills/sync/SKILL.md +0 -47
  167. package/reference/claude-config/skills/tutorial/SKILL.md +0 -259
  168. package/reference/claude-config/skills/tutorial/progress-template.md +0 -74
  169. package/reference/claude-config/skills/tutorial/technical.md +0 -1303
  170. package/reference/claude-config/skills/tutorial/vibe-coder.md +0 -890
  171. package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +0 -27
  172. package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +0 -30
  173. package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +0 -73
  174. package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +0 -86
  175. package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +0 -55
  176. package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +0 -97
  177. package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +0 -112
  178. package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +0 -93
  179. package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +0 -58
  180. package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +0 -56
  181. package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +0 -71
  182. package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +0 -83
  183. package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +0 -59
  184. package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +0 -42
  185. package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +0 -60
  186. package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +0 -37
  187. package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +0 -34
  188. package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +0 -38
  189. package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +0 -32
  190. package/reference/claude-config/sync-notes/2026-05-09-command-system.md +0 -33
  191. package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +0 -69
  192. package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +0 -30
  193. package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +0 -45
  194. package/reference/claude-config/sync-notes/2026-05-15-om-skill-rename-and-write-family.md +0 -52
  195. package/reference/claude-config/sync-notes/2026-05-17-sdk-boundary-consolidation.md +0 -33
  196. package/reference/claude-config/sync-notes/2026-05-20-om-define-helpers.md +0 -32
  197. package/reference/claude-config/sync-notes/2026-05-22-access-model-and-right-panel.md +0 -43
  198. package/reference/claude-config/sync-notes/2026-05-22-lead-gen-tenant-config.md +0 -40
  199. package/reference/claude-config/sync-notes/2026-05-22-org-model-multi-file-split.md +0 -61
  200. package/reference/claude-config/sync-notes/2026-05-23-branding-names-to-identity.md +0 -49
  201. package/reference/claude-config/sync-notes/2026-05-23-lead-gen-manage-access.md +0 -31
  202. package/reference/claude-config/sync-notes/2026-05-23-om-deployment-drift-detection.md +0 -42
  203. package/reference/claude-config/sync-notes/2026-05-23-om-full-model-deploy-contract.md +0 -33
  204. package/reference/claude-config/sync-notes/2026-05-23-ui-sdk-package-fixes.md +0 -37
  205. package/reference/claude-config/sync-notes/2026-05-24-platform-invite-router-core-baseline.md +0 -28
  206. package/reference/claude-config/sync-notes/2026-05-24-system-interface-readiness.md +0 -43
  207. package/reference/claude-config/sync-notes/2026-05-25-invitation-login-loader.md +0 -26
  208. package/reference/claude-config/sync-notes/2026-05-25-om-topbar-requests.md +0 -33
  209. package/reference/claude-config/sync-notes/2026-05-25-system-interface-profile-registry-and-substrate.md +0 -35
  210. package/reference/claude-config/sync-notes/2026-05-25-tenant-om-scaffold-cli.md +0 -49
  211. package/reference/claude-config/sync-notes/2026-05-25-vibe-operate-intent.md +0 -47
  212. package/reference/claude-config/sync-notes/2026-05-28-om-snapshot-sdk-workflow-config.md +0 -33
  213. package/reference/claude-config/sync-notes/2026-05-30-client-source-and-om-profiles.md +0 -39
  214. package/reference/claude-config/sync-notes/2026-06-02-knowledge-nested-group-routing.md +0 -27
  215. package/reference/claude-config/sync-notes/2026-06-02-nest-projects-under-platform.md +0 -45
  216. package/reference/claude-config/sync-notes/2026-06-03-skill-autogen-and-client-skill.md +0 -34
  217. package/reference/claude-config/sync-notes/2026-06-04-scaffold-registry-lane-severity.md +0 -34
  218. package/reference/claude-config/sync-notes/2026-06-05-appearance-app-mode-decouple.md +0 -29
  219. package/reference/claude-config/sync-notes/2026-06-05-ontology-endpoint-rename-and-knowledge-browser-ui.md +0 -86
  220. package/reference/claude-config/sync-notes/2026-06-06-om-build-systems-scaffold.md +0 -47
  221. package/reference/claude-config/sync-notes/2026-06-06-om-item-copy-references.md +0 -50
  222. package/reference/claude-config/sync-notes/2026-06-08-knowledge-base-page-not-found-fix.md +0 -76
  223. package/reference/claude-config/sync-notes/2026-06-09-agent-sessions-public-agent-chat-route.md +0 -75
  224. package/reference/claude-config/sync-notes/2026-06-09-sdk-cli-load-org-model-resolution.md +0 -42
  225. package/reference/claude-config/sync-notes/2026-06-12-agent-grants-visualizer-operations.md +0 -30
  226. package/reference/claude-config/sync-notes/2026-06-14-session-ux-and-project-cli-json.md +0 -33
  227. package/reference/claude-config/sync-notes/2026-06-14-shared-session-conversation-view.md +0 -26
  228. package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +0 -46
  229. package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +0 -34
  230. package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +0 -52
  231. package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +0 -47
  232. package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +0 -75
  233. package/reference/claude-config/sync-notes/2026-07-23-agent-session-memory.md +0 -49
  234. package/reference/claude-config/sync-notes/2026-07-23-workos-org-marker.md +0 -50
  235. package/reference/claude-config/sync-notes/2026-07-24-claude-5-models-and-session-surface-fixes.md +0 -116
  236. package/reference/claude-config/sync-notes/2026-07-27-agent-strict-output-and-turn-drift.md +0 -73
  237. package/reference/claude-config/sync-notes/2026-07-28-agent-reply-is-its-own-field.md +0 -84
  238. package/reference/claude-config/sync-notes/2026-07-30-login-screen-and-member-provisioning-state.md +0 -114
  239. package/reference/claude-config/sync-notes/2026-08-02-auth-guard-defaults-and-truncation-fix.md +0 -122
  240. package/reference/claude-config/sync-notes/2026-08-03-cli-gateway-errors-and-request-timeout.md +0 -120
  241. package/reference/claude-config/sync-notes/README.md +0 -43
  242. package/reference/sdk/framework/interaction-guidance.mdx +0 -182
  243. package/reference/sdk/framework/memory.mdx +0 -326
  244. package/reference/sdk/framework/resource-documentation.mdx +0 -90
  245. package/reference/sdk/roadmap.mdx +0 -164
@@ -1,63 +1,73 @@
1
- ---
2
- title: System Shell & Provider Runtime
3
- description: Current system shell contract for Organization Model systems, manifests, route matching, sidebars, and breadcrumbs.
4
- ---
1
+ ---
2
+ title: System Shell & Provider Runtime
3
+ description: Current system shell contract for Organization Model systems, manifests, route matching, sidebars, and breadcrumbs.
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
- ## Overview
10
-
11
- The system shell derives app navigation from `OrganizationModel.systems`. System manifests provide implementation hooks such as icons and sidebars; they do not own structural navigation.
12
-
13
- ## Source Of Truth
14
-
15
- - `packages/core/src/organization-model/defaults.ts` -- default system list
16
- - `packages/core/src/organization-model/helpers.ts` -- `childrenOf`, `ancestorsOf`, `parentOf`, `topLevel`, `findByPath`
17
- - `packages/ui/src/features/registry/types.ts` -- `SystemModule`
18
- - `packages/ui/src/provider/ElevasisSystemsProvider.tsx` -- runtime resolver
19
- - `packages/ui/src/components/navigation/useBreadcrumbs.ts` -- breadcrumb derivation
20
-
21
- ## SystemModule
22
-
23
- ```ts
24
- export interface SystemModule {
25
- key: string
26
- systemId: string
27
- capabilityIds?: string[]
28
- icon?: SystemIconComponent
29
- sidebar?: SystemSidebarComponent
30
- organizationGraph?: { systemId: string }
31
- }
32
- ```
33
-
34
- `systemId` must match an Organization Model system ID. Structural fields such as route lists, nav labels, and nested links belong on `OrganizationModel.systems`.
35
-
36
- ## Shell Model
37
-
38
- `useElevasisSystems()` exposes `shellModel`:
39
-
40
- ```ts
41
- {
42
- systems,
43
- findByPath,
44
- findById,
45
- childrenOf,
46
- ancestorsOf,
47
- parentOf,
48
- topLevel,
49
- uiPositionFor,
50
- requiresAdminFor,
51
- devOnlyFor
52
- }
53
- ```
54
-
55
- Sidebar rendering walks `topLevel()` and `childrenOf(id)`. Breadcrumbs resolve `findByPath(location.pathname)` and then map `ancestorsOf(id)`.
56
-
57
- ## Access
58
-
59
- System access is keyed by Organization Model system ID. `requiresAdmin` and `devOnly` inherit from ancestor system nodes and are applied when deriving visible sidebar entries.
60
-
8
+
9
+ ## Overview
10
+
11
+ The system shell derives app navigation from `OrganizationModel.systems`. System manifests provide implementation hooks such as icons and sidebars; they do not own structural navigation.
12
+
13
+ ## Source Of Truth
14
+
15
+ - `packages/core/src/organization-model/defaults.ts` -- default system list
16
+ - `packages/core/src/organization-model/helpers.ts` -- `childrenOf`, `ancestorsOf`, `parentOf`, `topLevel`, `findByPath`
17
+ - `packages/ui/src/features/registry/types.ts` -- `SystemModule`
18
+ - `packages/ui/src/provider/ElevasisSystemsProvider.tsx` -- runtime resolver
19
+ - `packages/ui/src/components/navigation/useBreadcrumbs.ts` -- breadcrumb derivation
20
+
21
+ ## SystemModule
22
+
23
+ {/* doc-snippet:skip: shape excerpt from features/registry/types.ts -- SystemIconComponent and SystemSidebarComponent are shown unimported here for readability */}
24
+
25
+ ```ts
26
+ export interface SystemModule {
27
+ key: string
28
+ systemId?: string
29
+ routePrefixes?: string[]
30
+ capabilityIds?: string[]
31
+ icon?: SystemIconComponent
32
+ sidebar?: SystemSidebarComponent
33
+ sidebarWidth?: number | ((context: { currentPath: string }) => number)
34
+ organizationGraph?: OrganizationGraphSystemBridge
35
+ }
36
+
37
+ interface OrganizationGraphSystemBridge {
38
+ systemId?: string
39
+ }
40
+ ```
41
+
42
+ `systemId` must match an Organization Model system ID when present. Navigation-only app modules may omit `systemId` and use `routePrefixes` instead (see "Manifests for Navigation-Only Modules" below). `sidebarWidth` overrides the default 250px shell sidebar width. Structural fields such as route lists, nav labels, and nested links belong on `OrganizationModel.systems`.
43
+
44
+ ## Shell Model
45
+
46
+ `useElevasisSystems()` exposes `shellModel`:
47
+
48
+ {/* doc-snippet:skip: shape excerpt shown as a bare field list, not a standalone object literal or interface */}
49
+
50
+ ```ts
51
+ {
52
+ systems,
53
+ findByPath,
54
+ findById,
55
+ childrenOf,
56
+ ancestorsOf,
57
+ parentOf,
58
+ topLevel,
59
+ uiPositionFor,
60
+ requiresAdminFor,
61
+ devOnlyFor
62
+ }
63
+ ```
64
+
65
+ Sidebar rendering walks `topLevel()` and `childrenOf(id)`. Breadcrumbs resolve `findByPath(location.pathname)` and then map `ancestorsOf(id)`.
66
+
67
+ ## Access
68
+
69
+ System access is keyed by Organization Model system ID. `requiresAdmin` and `devOnly` inherit from ancestor system nodes and are applied when deriving visible sidebar entries.
70
+
61
71
  Routes still need guards:
62
72
 
63
73
  ```tsx
@@ -68,8 +78,215 @@ Routes still need guards:
68
78
  </ProtectedRoute>
69
79
  ```
70
80
 
71
- Use `AccessKeys.platformAdmin` with `AccessGuard` for pages that require platform-admin privileges.
72
-
73
- ## External Shells
74
-
75
- Host apps pass `SYSTEM_MANIFESTS` or their own `SystemModule[]` into `ElevasisSystemsProvider` and derive sidebar links locally from `shellModel`. There is no separate nav config file to keep in sync.
81
+ Use `AccessKeys.platformAdmin` with `AccessGuard` for pages that require platform-admin privileges. Use exported `AccessKeys` for permission-backed or diagnostic surfaces such as operations, monitoring, settings, and right-panel views.
82
+
83
+ ## Manifests for Navigation-Only Modules
84
+
85
+ Shared feature manifests may omit `systemId` and own `routePrefixes` instead when the module covers a navigation-only area rather than a semantic System. Route authorization still belongs to `AccessGuard`:
86
+
87
+ ```ts
88
+ // navigation-only module -- no systemId required
89
+ export const manifest = {
90
+ key: 'operations',
91
+ routePrefixes: ['/operations'],
92
+ capabilityIds: ['operations:view'],
93
+ }
94
+ ```
95
+
96
+ Manifest validation does not reject route-only modules. `ElevasisSystemsProvider` resolves surface route prefixes for app-area modules and uses `routePrefixes` for matching when `systemId` is absent. Access checks use System paths or `AccessKeys` constants, not manifest route prefixes.
97
+
98
+ ## Navigation Shape Decisions
99
+
100
+ | Decision | Current outcome |
101
+ | ----------------- | ------------------------------------------------------------------------------------------------------------- |
102
+ | Business | Navigation group only, not a System or URL namespace |
103
+ | Fake Systems | Dashboard, Finance, Operations, Monitoring, Knowledge, Settings, and Admin are demoted from canonical Systems |
104
+ | `platform` | Real canonical System owning cross-cutting diagnostics |
105
+ | `/clients` | Canonical route; legacy `/business/clients` routes redirect |
106
+ | Sidebar authoring | `navigation.sidebar` is the source of truth for shell navigation |
107
+
108
+ ## Composition
109
+
110
+ Host apps pass a system manifest list and a canonical organization model into the provider:
111
+
112
+ ```tsx
113
+ <ElevasisSystemsProvider systems={SYSTEM_MANIFESTS} organizationModel={canonicalOrganizationModel}>
114
+ <SystemShell>{children}</SystemShell>
115
+ </ElevasisSystemsProvider>
116
+ ```
117
+
118
+ Host apps still own route files, topbar behavior, app branding, and dashboard composition.
119
+
120
+ ## Topbar Action Substrate
121
+
122
+ The topbar is governed by the Organization Model through a `navigation.topbar` region that is parallel to `navigation.sidebar`. Each entry is a `TopbarActionNode` -- a leaf with no `path` or `surfaceType` -- and a UI registry binds each node's behavior. This mirrors the sidebar manifest pattern exactly: **OM owns data + visibility; the registry owns behavior.**
123
+
124
+ ### OM Schema -- `navigation.topbar`
125
+
126
+ Declared in `packages/core/src/organization-model/domains/navigation.ts`:
127
+
128
+ {/* doc-snippet:skip: shape excerpt from domains/navigation.ts -- z and the field schemas (ModelIdSchema, LabelSchema, etc.) are shown unimported here for readability */}
129
+
130
+ ```ts
131
+ // A topbar action node -- no path, no surfaceType
132
+ const TopbarActionNodeSchema = z.object({
133
+ id: ModelIdSchema, // stable key the registry binds to
134
+ label: LabelSchema, // accessible name / menu fallback
135
+ tooltip: DescriptionSchema.optional(),
136
+ icon: IconNameSchema.optional(), // flat token, resolved via icon registry
137
+ order: z.number().int().optional(),
138
+ enabled: z.boolean().default(true),
139
+ devOnly: z.boolean().optional(),
140
+ requiresAdmin: z.boolean().optional(),
141
+ targets: SidebarSurfaceTargetsSchema.optional()
142
+ })
143
+
144
+ // OrganizationModelNavigationSchema gets a topbar field alongside sidebar
145
+ const OrganizationModelNavigationSchema = z.object({
146
+ sidebar: SidebarNavigationSchema,
147
+ topbar: z.record(z.string(), TopbarActionNodeSchema).default({})
148
+ })
149
+ ```
150
+
151
+ The `topbar` field is an **append** -- `surfaceType`, surfaces, and the sidebar are untouched.
152
+
153
+ ### UI Registry -- `TopbarActionModule`
154
+
155
+ Defined in `packages/ui/src/features/registry/types.ts`:
156
+
157
+ {/* doc-snippet:skip: shape excerpt from features/registry/types.ts -- TablerIconComponent and ReactNode are shown unimported here for readability */}
158
+
159
+ ```ts
160
+ export interface ResolvedTopbarAction {
161
+ id: string
162
+ label: string
163
+ tooltip?: string
164
+ icon: TablerIconComponent // resolved from the OM token
165
+ order: number
166
+ }
167
+
168
+ export interface TopbarActionModule {
169
+ key: string // matches navigation.topbar[key].id
170
+ render: (ctx: { node: ResolvedTopbarAction }) => ReactNode
171
+ }
172
+ ```
173
+
174
+ The manifest map lives in `packages/ui/src/features/registry/manifests.ts`:
175
+
176
+ {/* doc-snippet:skip: shape excerpt from features/registry/manifests.ts -- TopbarActionModule and requestTopbarActionManifest are shown unimported here for readability */}
177
+
178
+ ```ts
179
+ export const TOPBAR_ACTION_MANIFESTS: Record<string, TopbarActionModule> = {
180
+ request: requestTopbarActionManifest
181
+ // docs, notifications, orgSwitcher, ... (migrated incrementally)
182
+ }
183
+ ```
184
+
185
+ ### Projection and Provider
186
+
187
+ `packages/ui/src/provider/topbarProjection.ts` mirrors `sidebarProjection.ts`:
188
+
189
+ - reads `navigation.topbar` from the resolved OM;
190
+ - drops items where `enabled === false`, `devOnly && !isDev`, or `requiresAdmin && !isPlatformAdmin`;
191
+ - resolves `icon` via `getSemanticIconComponent(node.icon)`;
192
+ - sorts by `order`, then id;
193
+ - joins each surviving OM node to its registered module by `node.id === module.key`; skips nodes with no module and modules with no OM node.
194
+
195
+ `ElevasisSystemsProvider` gains a `topbarActions?: TopbarActionModule[]` prop and exposes `getTopbarActions({ isPlatformAdmin, isDev })`. The provider **defaults `topbarActions` to `Object.values(TOPBAR_ACTION_MANIFESTS)`** when no explicit prop is passed -- so shell-based consumers (`ElevasisAuthenticatedShell`, tenants) get the OM-governed topbar with zero wiring. Pass an explicit array to override or extend.
196
+
197
+ This is an intentional asymmetry vs `systems`, which defaults to `[]` (tenant-assembled). Topbar behaviors are package-universal; sidebar systems are tenant-assembled.
198
+
199
+ ### Consumer Component -- `<TopbarActions />`
200
+
201
+ Shipped from `@elevasis/ui/layout`:
202
+
203
+ ```tsx
204
+ export function TopbarActions({ isPlatformAdmin, isDev }: { isPlatformAdmin?: boolean; isDev?: boolean }) {
205
+ const { getTopbarActions } = useElevasisSystems()
206
+ return (
207
+ <>
208
+ {getTopbarActions({ isPlatformAdmin, isDev }).map(({ node, render }) => (
209
+ <Fragment key={node.id}>{render({ node })}</Fragment>
210
+ ))}
211
+ </>
212
+ )
213
+ }
214
+ ```
215
+
216
+ `AppTopbar` drops `<TopbarActions />` in among its children. The theme switch and version `Code` remain hardcoded in `Topbar` -- they are not feature actions.
217
+
218
+ ### Governance
219
+
220
+ Because topbar items are OM nodes with the same gating flags as sidebar surfaces, toggling them requires no new mechanism:
221
+
222
+ - Toggle: set `enabled: false` to hide an item per tenant.
223
+ - Reorder: change `order`.
224
+ - Gate: `requiresAdmin` / `devOnly` restrict who sees it.
225
+ - Add: declare a new `navigation.topbar` entry and register a matching module.
226
+
227
+ ### Comparison Table
228
+
229
+ | Aspect | Sidebar | Topbar |
230
+ | ---------------- | ---------------------------------------- | ---------------------------------------- |
231
+ | OM region | `navigation.sidebar.primary` / `.bottom` | `navigation.topbar` |
232
+ | Node type | `SidebarSurfaceNode` (has `path`) | `TopbarActionNode` (no `path`) |
233
+ | Registry type | `SystemModule` | `TopbarActionModule` |
234
+ | Registry map | `SYSTEM_MANIFESTS` | `TOPBAR_ACTION_MANIFESTS` |
235
+ | Provider prop | `systems?: SystemModule[]` | `topbarActions?: TopbarActionModule[]` |
236
+ | Provider default | `[]` (tenant-assembled) | `Object.values(TOPBAR_ACTION_MANIFESTS)` |
237
+ | Context accessor | `getSidebarLinks(opts)` | `getTopbarActions(opts)` |
238
+ | Projection file | `sidebarProjection.ts` | `topbarProjection.ts` |
239
+ | UI consumer | `Sidebar` | `<TopbarActions />` |
240
+
241
+ ### File Locations
242
+
243
+ | Concern | Path |
244
+ | -------------------- | ----------------------------------------------------------------- |
245
+ | OM navigation schema | `packages/core/src/organization-model/domains/navigation.ts` |
246
+ | Registry types | `packages/ui/src/features/registry/types.ts` |
247
+ | Registry map | `packages/ui/src/features/registry/manifests.ts` |
248
+ | Provider | `packages/ui/src/provider/ElevasisSystemsProvider.tsx` |
249
+ | Projection | `packages/ui/src/provider/topbarProjection.ts` |
250
+ | Consumer component | `packages/ui/src/components/layout/topbar/` (`<TopbarActions />`) |
251
+ | CC root wiring | `apps/command-center/src/routes/__root.tsx` + `AppTopbar.tsx` |
252
+
253
+ ## External Shells
254
+
255
+ External templates pass `canonicalOrganizationModel` into `ElevasisSystemsProvider` and derive sidebar links locally from `shellModel`. There is no separate nav config file to keep in sync.
256
+
257
+ ### Operations Subshell and Manifest Mounting
258
+
259
+ The Operations area uses a dedicated manifest rather than a raw `SystemModule`. `packages/ui/src/features/operations/manifest.ts` exports `operationsManifest`, which supplies `OperationsSidebarRouter`. That router dispatches to route-specific sidebar components by URL prefix:
260
+
261
+ - `ResourcesSidebar` for `/operations/resources`
262
+ - `ExecutionLogsSidebar` for resource detail pages
263
+ - `CommandQueueSidebarConnected` for `/operations/command-queue`
264
+ - `SystemsSidebar` for `/operations/systems`
265
+ - `SessionsSidebar` for `/operations/sessions`
266
+
267
+ External project root routes must include `operationsManifest` in the manifest array passed to `ElevasisAuthenticatedShell`/`ElevasisSystemsProvider`. Omitting it means no Operations sidebar appears, even though the Operations routes and API/SSE props (`operationsApiUrl`, `operationsSSEManager`) are wired correctly. The canonical reference is `external/_template/ui/src/routes/__root.tsx`.
268
+
269
+ The direct fix is always to mount the published manifest rather than duplicate sidebar routing locally. Whether tenant navigation exposes `/operations/systems` or `/operations/sessions` is a product/OM decision separate from the missing-sidebar substrate bug.
270
+
271
+ `monitoringManifest` and `settingsManifest` follow the same pattern and should be mounted in the same pass when those surfaces are enabled for a project.
272
+
273
+ ## Ownership Boundaries
274
+
275
+ `ElevasisSystemsProvider` and `SystemShell` own system manifest registration, system-aware nav contribution, provider-scoped system context (`timeRange`, `operationsApiUrl`, `operationsSSEManager`), route-to-sidebar subshell dispatch, and shared shell/page/sidebar extraction for reusable systems.
276
+
277
+ They do **not** own TanStack file-based route registration, app-specific assistant context hooks, app-specific admin navigation, or project-specific branding and topbar behavior. Consumers keep thin route files and thin app-local wrappers that inject only genuinely app-specific behavior.
278
+
279
+ ## Shared-First Extraction
280
+
281
+ When migrating a system surface from app-local to shared:
282
+
283
+ 1. Move the reusable shell, sidebar, and page behavior into `packages/ui`.
284
+ 2. Leave only thin route glue in consumers.
285
+ 3. Keep assistant-context, tenant-guard, and app-specific branding glue local.
286
+ 4. Delete dead local wrappers after verification.
287
+
288
+ Do not leave a duplicate app-local shell after the shared version exists unless there is a documented app-specific divergence.
289
+
290
+ ## Router Standardization
291
+
292
+ Shared sidebars and shell components prefer `useRouterContext()` by default. Compatibility props such as `currentPath` or `onNavigate` are acceptable only to preserve published API compatibility. Where they remain, treat them as compatibility seams rather than the preferred usage path, default internally to router-context behavior, and do not remove them casually from published surfaces.