spine-framework 0.3.124 → 0.3.126

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 (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,45 +1,61 @@
1
- /**
2
- * @module src/components/layout/Header
3
- * @audience installer
4
- * @layer frontend-component
5
- * @stability stable
6
- *
7
- * Sticky top bar rendered inside the main content area. Contains:
8
- * - **Mobile hamburger** (`Bars3Icon`) — visible below `lg` breakpoint;
9
- * calls `onMenuClick` to open the slide-over sidebar
10
- * - **Search input** — hidden on small screens (placeholder only; not wired)
11
- * - **Notification bell** — placeholder; not yet wired to a backend
12
- * - **User avatar + name** — derived from `user.full_name` / `user.email`
13
- *
14
- * @seeAlso src/components/layout/Layout.tsx (mounts this component)
15
- * @seeAlso src/types/auth.ts (User)
16
- */
17
1
 
18
- import { Menu, Bell, Search, User } from 'lucide-react';
19
- import { User } from '../../types/auth'
20
2
 
21
- /**
22
- * Props for `Header`.
23
- *
24
- * @prop onMenuClick - Callback to open the mobile sidebar
25
- * @prop user - Currently logged-in user (null while loading)
26
- */
3
+
4
+ // CIL[BEGIN chunk_id="header_moduleheader_1783929861" type="module_header" identity="imports" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import UI icons and User type for Header component"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide external dependencies for Header"]
7
+ // CIL[DOC-CONTEXT module="src/components/layout/Header" layer="frontend-component" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="Menu, Bell, MagnifyingGlassIcon, User" errors="none" side_effects="none"]
9
+ // CIL[DOC-MICRO logic_summary="Imports Lucide icons, Heroicons, and auth User type" notable_decisions="[]"]
10
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
11
+ // CIL[DOC-STABILITY stability="stable"]
12
+ // CIL[DOC-AUDIENCE audience="developer"]
13
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/components/layout/Sidebar.tsx, \."]
14
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
15
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
16
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
17
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
18
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
19
+ import { Menu, Bell } from 'lucide-react';
20
+ import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
21
+ import { User } from '../../types/auth'
22
+ // CIL[END chunk_id="header_moduleheader_1783929861"]
23
+ // CIL[BEGIN chunk_id="header_headerprops_1783929861" type="interface" identity="HeaderProps" parent="none"]
24
+ // CIL[DOC-MACRO purpose="Define props interface for Header component"]
25
+ // CIL[DOC-RESPONSIBILITY responsibility="Specify Header component contract"]
26
+ // CIL[DOC-CONTEXT module="src/components/layout/Header" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
27
+ // CIL[DOC-CONTRACT inputs="none" outputs="HeaderProps interface" errors="none" side_effects="none"]
28
+ // CIL[DOC-MICRO logic_summary="Interface with menu callback and optional user data" notable_decisions="[]"]
29
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
30
+ // CIL[DOC-STABILITY stability="stable"]
31
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
32
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
33
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
34
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
35
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
36
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
27
37
  interface HeaderProps {
28
38
  onMenuClick: () => void
29
39
  user: User | null
30
40
  }
31
-
32
- /**
33
- * Sticky top bar.
34
- *
35
- * @param props - `HeaderProps`
36
- * @returns Header element with menu toggle, search, notifications, and avatar
37
- * @sideEffects none (delegates menu open to `onMenuClick`)
38
- */
41
+ // CIL[END chunk_id="header_headerprops_1783929861"]
42
+ // CIL[BEGIN chunk_id="header_header_1783929861" type="function" identity="Header" parent="none"]
43
+ // CIL[DOC-MACRO purpose="Render sticky header with menu, search, notifications, and user avatar"]
44
+ // CIL[DOC-RESPONSIBILITY responsibility="Display top navigation bar with user controls"]
45
+ // CIL[DOC-CONTEXT module="src/components/layout/Header" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
46
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX header element" errors="none" side_effects="Calls onMenuClick when menu button clicked"]
47
+ // CIL[DOC-MICRO logic_summary="Responsive layout with mobile menu button, search input, notification bell, and user avatar" notable_decisions="[]"]
48
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
49
+ // CIL[DOC-STABILITY stability="stable"]
50
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, \."]
51
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
52
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
53
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
54
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
55
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
39
56
  export function Header({ onMenuClick, user }: HeaderProps) {
40
57
  return (
41
58
  <header className="sticky top-0 z-20 flex h-14 shrink-0 items-center gap-4 border-b border-slate-200 bg-white/80 backdrop-blur-md px-4 sm:px-6 lg:pl-72 lg:pr-8">
42
- {/* Logo + Mobile hamburger — only visible below lg */}
43
59
  <div className="flex items-center gap-3">
44
60
  <button
45
61
  onClick={onMenuClick}
@@ -50,12 +66,9 @@ export function Header({ onMenuClick, user }: HeaderProps) {
50
66
  </button>
51
67
  </div>
52
68
 
53
- {/* Spacer */}
54
69
  <div className="flex-1" />
55
70
 
56
- {/* Right actions */}
57
71
  <div className="flex items-center gap-3">
58
- {/* Search */}
59
72
  <div className="relative hidden sm:block">
60
73
  <MagnifyingGlassIcon className="pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-400" />
61
74
  <input
@@ -65,7 +78,6 @@ export function Header({ onMenuClick, user }: HeaderProps) {
65
78
  />
66
79
  </div>
67
80
 
68
- {/* Notifications */}
69
81
  <button
70
82
  className="relative rounded-lg p-2 text-slate-400 hover:bg-slate-100 hover:text-slate-600 transition-colors"
71
83
  aria-label="Notifications"
@@ -73,7 +85,6 @@ export function Header({ onMenuClick, user }: HeaderProps) {
73
85
  <Bell className="h-5 w-5" />
74
86
  </button>
75
87
 
76
- {/* User avatar */}
77
88
  <div className="flex items-center gap-2 pl-2 border-l border-slate-200">
78
89
  <div className="flex h-7 w-7 items-center justify-center rounded-full bg-navy text-xs font-medium text-white">
79
90
  {user?.full_name?.charAt(0) || user?.email?.charAt(0) || '?'}
@@ -86,3 +97,4 @@ export function Header({ onMenuClick, user }: HeaderProps) {
86
97
  </header>
87
98
  )
88
99
  }
100
+ // CIL[END chunk_id="header_header_1783929861"]
@@ -1,39 +1,58 @@
1
- /**
2
- * @module src/components/layout/Layout
3
- * @audience installer
4
- * @layer frontend-component
5
- * @stability stable
6
- *
7
- * Root app shell providing the two-pane admin layout:
8
- * - **Desktop (`lg+`):** fixed 60-wide `<Sidebar>` on the left, scrollable
9
- * main content area padded with `lg:pl-60`.
10
- * - **Mobile (`< lg`):** top bar with hamburger button that opens a
11
- * slide-over `<Sidebar>` with a backdrop overlay.
12
- *
13
- * `isActive` is computed from the current `location.pathname` and passed
14
- * to `SidebarContent` for active-link highlighting.
15
- *
16
- * @seeAlso src/components/layout/Sidebar.tsx
17
- * @seeAlso src/contexts/AuthContext.tsx (provides `user` and `logout`)
18
- */
19
1
 
2
+
3
+
4
+ // CIL[BEGIN chunk_id="layout_moduleheader_1783929861" type="module_header" identity="imports" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import React hooks and layout components for main app shell"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide dependencies for Layout component"]
7
+ // CIL[DOC-CONTEXT module="src/components/layout/Layout" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="React, useState, Sidebar, SidebarContent, useAuth, useLocation" errors="none" side_effects="none"]
9
+ // CIL[DOC-MICRO logic_summary="Imports React, local Sidebar components, auth context, and router" notable_decisions="[]"]
10
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
11
+ // CIL[DOC-STABILITY stability="stable"]
12
+ // CIL[DOC-AUDIENCE audience="developer"]
13
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/layout/Sidebar.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
14
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
15
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
16
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
17
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
18
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
20
19
  import React, { useState } from 'react'
21
20
  import { Sidebar, SidebarContent } from './Sidebar'
22
21
  import { useAuth } from '../../contexts/AuthContext'
23
22
  import { useLocation } from 'react-router-dom'
24
-
25
- /** Props for `Layout`. */
23
+ // CIL[END chunk_id="layout_moduleheader_1783929861"]
24
+ // CIL[BEGIN chunk_id="layout_layoutprops_1783929861" type="interface" identity="LayoutProps" parent="none"]
25
+ // CIL[DOC-MACRO purpose="Define props interface for Layout component"]
26
+ // CIL[DOC-RESPONSIBILITY responsibility="Specify Layout component contract"]
27
+ // CIL[DOC-CONTEXT module="src/components/layout/Layout" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
28
+ // CIL[DOC-CONTRACT inputs="none" outputs="LayoutProps interface" errors="none" side_effects="none"]
29
+ // CIL[DOC-MICRO logic_summary="Interface accepting React children for main content area" notable_decisions="[]"]
30
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
31
+ // CIL[DOC-STABILITY stability="stable"]
32
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, \."]
33
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
34
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
35
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
36
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
37
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
26
38
  interface LayoutProps {
27
39
  children: React.ReactNode
28
40
  }
29
-
30
- /**
31
- * Root two-pane admin shell.
32
- *
33
- * @param props - `LayoutProps`
34
- * @returns Full-page layout with sidebar + main content area
35
- * @sideEffects none (sidebar open state is local)
36
- */
41
+ // CIL[END chunk_id="layout_layoutprops_1783929861"]
42
+ // CIL[BEGIN chunk_id="layout_layout_1783929861" type="function" identity="Layout" parent="none"]
43
+ // CIL[DOC-MACRO purpose="Render responsive two-pane admin layout with sidebar and main content"]
44
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide root app shell with mobile/desktop sidebar behavior"]
45
+ // CIL[DOC-CONTEXT module="src/components/layout/Layout" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
46
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX layout with sidebar" errors="none" side_effects="Manages sidebar open state and navigation highlighting"]
47
+ // CIL[DOC-MICRO logic_summary="Responsive layout with mobile overlay sidebar and fixed desktop sidebar" notable_decisions="[]"]
48
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
49
+ // CIL[DOC-STABILITY stability="stable"]
50
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/layout/Sidebar.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
51
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
52
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
53
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
54
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
55
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
37
56
  export function Layout({ children }: LayoutProps) {
38
57
  const [sidebarOpen, setSidebarOpen] = useState(false)
39
58
  const { user, logout } = useAuth()
@@ -44,7 +63,6 @@ export function Layout({ children }: LayoutProps) {
44
63
 
45
64
  return (
46
65
  <div className="min-h-screen bg-[#F2F3F8] flex lg:top-0">
47
- {/* Mobile overlay */}
48
66
  {sidebarOpen && (
49
67
  <>
50
68
  <div
@@ -55,7 +73,6 @@ export function Layout({ children }: LayoutProps) {
55
73
  </>
56
74
  )}
57
75
 
58
- {/* Desktop sidebar — visible at lg+ */}
59
76
  <aside className="hidden lg:flex lg:fixed lg:inset-y-0 lg:left-0 lg:z-30 lg:w-60 lg:flex-col lg:shrink-0 bg-white border-r border-slate-200 lg:top-0">
60
77
  <SidebarContent
61
78
  isActive={isActive}
@@ -65,7 +82,6 @@ export function Layout({ children }: LayoutProps) {
65
82
  />
66
83
  </aside>
67
84
 
68
- {/* Mobile sidebar with menu button */}
69
85
  <div className="lg:hidden flex items-center justify-between p-4 bg-white border-b border-slate-200">
70
86
  <button
71
87
  onClick={() => setSidebarOpen(true)}
@@ -82,7 +98,6 @@ export function Layout({ children }: LayoutProps) {
82
98
  </div>
83
99
  </div>
84
100
 
85
- {/* Main content area */}
86
101
  <div className="flex-1 flex flex-col min-w-0 lg:pl-60">
87
102
  <main className="flex-1 py-6 px-4 sm:px-6 lg:px-8 xl:px-12">
88
103
  <div className="max-w-6xl mx-auto">
@@ -93,3 +108,4 @@ export function Layout({ children }: LayoutProps) {
93
108
  </div>
94
109
  )
95
110
  }
111
+ // CIL[END chunk_id="layout_layout_1783929861"]
@@ -1,3 +1,25 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+ // CIL[BEGIN chunk_id="sidebar_moduleheader_1783929861" type="module_header" identity="imports" parent="none"]
9
+ // CIL[DOC-MACRO purpose="Import React hooks, router, auth, UI components and navigation icons"]
10
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide all dependencies for sidebar navigation system"]
11
+ // CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
12
+ // CIL[DOC-CONTRACT inputs="none" outputs="React hooks, router, auth, UI components, icons" errors="none" side_effects="none"]
13
+ // CIL[DOC-MICRO logic_summary="Imports useState, Link, useLocation, useAuth, Popover components and 20+ Lucide icons" notable_decisions="[]"]
14
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
15
+ // CIL[DOC-STABILITY stability="stable"]
16
+ // CIL[DOC-AUDIENCE audience="developer"]
17
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
18
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
19
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
20
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
21
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
22
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1
23
  import { useState } from 'react'
2
24
  import { Link, useLocation } from 'react-router-dom'
3
25
  import { useAuth } from '../../contexts/AuthContext'
@@ -21,17 +43,48 @@ import {
21
43
  User,
22
44
  MoreVertical,
23
45
  ShieldCheck,
24
- Key,
46
+ Key,
47
+ Truck,
25
48
  FlaskConical,
26
49
  BarChart3,
27
- Bell
50
+ Bell,
51
+ Cpu,
52
+ BookOpen
28
53
  } from 'lucide-react'
29
-
54
+ // CIL[END chunk_id="sidebar_moduleheader_1783929861"]
55
+ // CIL[BEGIN chunk_id="sidebar_sidebarprops_1783929861" type="interface" identity="SidebarProps" parent="none"]
56
+ // CIL[DOC-MACRO purpose="Define props interface for mobile overlay Sidebar component"]
57
+ // CIL[DOC-RESPONSIBILITY responsibility="Specify Sidebar component contract for mobile overlay"]
58
+ // CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
59
+ // CIL[DOC-CONTRACT inputs="none" outputs="SidebarProps interface" errors="none" side_effects="none"]
60
+ // CIL[DOC-MICRO logic_summary="Interface with open state and close callback for mobile sidebar" notable_decisions="[]"]
61
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
62
+ // CIL[DOC-STABILITY stability="stable"]
63
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, \."]
64
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
65
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
66
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
67
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
68
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
30
69
  interface SidebarProps {
31
70
  open: boolean
32
71
  onClose: () => void
33
72
  }
34
-
73
+ // CIL[END chunk_id="sidebar_sidebarprops_1783929861"]
74
+ // CIL[BEGIN chunk_id="sidebar_constants_1783929861" type="constants" identity="navigation" parent="none"]
75
+ // CIL[DOC-MACRO purpose="Define navigation arrays for sidebar menu sections and links"]
76
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide navigation structure for admin interface"]
77
+ // CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
78
+ // CIL[DOC-CONTRACT inputs="none" outputs="navigation constants arrays" errors="none" side_effects="none"]
79
+ // CIL[DOC-MICRO logic_summary="Main nav, configs, observability, and runtime entity navigation arrays with icons" notable_decisions="[]"]
80
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
81
+ // CIL[DOC-STABILITY stability="stable"]
82
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
83
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
84
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
85
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
86
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
87
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
35
88
  const navigation = [
36
89
  { name: 'Dashboard', href: '/spine-framework/admin/configs/types', icon: Home },
37
90
  ]
@@ -44,7 +97,6 @@ const configsNavigation = [
44
97
  { divider: true },
45
98
  { name: 'AI Agents', href: '/spine-framework/admin/configs/ai-agents', icon: Sparkles },
46
99
  { name: 'Prompt Configs', href: '/spine-framework/admin/configs/prompts', icon: FileText },
47
- { name: 'Embeddings', href: '/spine-framework/admin/configs/embeddings', icon: FileText },
48
100
  { divider: true },
49
101
  { name: 'Pipelines', href: '/spine-framework/admin/configs/pipelines', icon: RefreshCw },
50
102
  { name: 'Triggers', href: '/spine-framework/admin/configs/triggers', icon: Zap },
@@ -52,6 +104,7 @@ const configsNavigation = [
52
104
  { divider: true },
53
105
  { name: 'Integrations', href: '/spine-framework/admin/configs/integrations', icon: LinkIcon },
54
106
  { name: 'API Keys', href: '/spine-framework/admin/configs/api-keys', icon: Key },
107
+ { name: 'Deliveries', href: '/spine-framework/admin/configs/deliveries', icon: Truck },
55
108
  ] as const
56
109
 
57
110
  const observabilityNavigation = [
@@ -61,7 +114,6 @@ const observabilityNavigation = [
61
114
  { name: 'Logs', href: '/spine-framework/admin/observability/logs', icon: FileText },
62
115
  ]
63
116
 
64
- // Database entities that should be shown in runtime navigation
65
117
  const runtimeEntities = [
66
118
  { name: 'Items', href: '/spine-framework/admin/runtime/items', icon: Box },
67
119
  { name: 'Accounts', href: '/spine-framework/admin/runtime/accounts', icon: Building2 },
@@ -69,14 +121,46 @@ const runtimeEntities = [
69
121
  { name: 'Person Types', href: '/spine-framework/admin/runtime/person-types', icon: Users },
70
122
  ]
71
123
 
124
+ const kbEngineNavigation = [
125
+ { name: 'Knowledge Base', href: '/spine-framework/admin/kb/kb-spine-public', icon: BookOpen },
126
+ { name: 'Embeddings', href: '/spine-framework/admin/kb/embeddings', icon: Cpu },
127
+ ]
128
+ // CIL[END chunk_id="sidebar_constants_1783929861"]
129
+ // CIL[BEGIN chunk_id="sidebar_classnames_1783929861" type="function" identity="classNames" parent="none"]
130
+ // CIL[DOC-MACRO purpose="Utility function to combine CSS class names, filtering falsy values"]
131
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide CSS class name concatenation utility"]
132
+ // CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
133
+ // CIL[DOC-CONTRACT inputs="none" outputs="concatenated class string" errors="none" side_effects="none"]
134
+ // CIL[DOC-MICRO logic_summary="Filters Boolean values and joins with spaces for Tailwind CSS" notable_decisions="[]"]
135
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
136
+ // CIL[DOC-STABILITY stability="stable"]
137
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 2. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/025_retype_threads_messages.sql, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, \."]
138
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 2. Total affected: 2."]
139
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
140
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
141
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
142
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
72
143
  function classNames(...classes: (string | false | undefined)[]) {
73
144
  return classes.filter(Boolean).join(' ')
74
145
  }
75
-
146
+ // CIL[END chunk_id="sidebar_classnames_1783929861"]
147
+ // CIL[BEGIN chunk_id="sidebar_sidebar_1783929861" type="function" identity="Sidebar" parent="none"]
148
+ // CIL[DOC-MACRO purpose="Render mobile overlay sidebar with backdrop and close functionality"]
149
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide mobile sidebar overlay with backdrop and close button"]
150
+ // CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
151
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX overlay sidebar" errors="none" side_effects="Calls onClose when backdrop or close button clicked"]
152
+ // CIL[DOC-MICRO logic_summary="Conditional overlay with backdrop, close button, and SidebarContent" notable_decisions="[]"]
153
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
154
+ // CIL[DOC-STABILITY stability="stable"]
155
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, \."]
156
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
157
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
158
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
159
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
160
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
76
161
  export function Sidebar({ open, onClose }: SidebarProps) {
77
162
  return (
78
163
  <>
79
- {/* Mobile sidebar */}
80
164
  <div className={classNames(open && 'fixed inset-0 z-40 flex')}>
81
165
  {open && (
82
166
  <div className="fixed inset-0 z-40 flex">
@@ -108,23 +192,53 @@ export function Sidebar({ open, onClose }: SidebarProps) {
108
192
  </>
109
193
  )
110
194
  }
111
-
195
+ // CIL[END chunk_id="sidebar_sidebar_1783929861"]
196
+ // CIL[BEGIN chunk_id="sidebar_sidebarcontentprops_1783929861" type="interface" identity="SidebarContentProps" parent="none"]
197
+ // CIL[DOC-MACRO purpose="Define props interface for SidebarContent navigation component"]
198
+ // CIL[DOC-RESPONSIBILITY responsibility="Specify SidebarContent component contract"]
199
+ // CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[]"]
200
+ // CIL[DOC-CONTRACT inputs="none" outputs="SidebarContentProps interface" errors="none" side_effects="none"]
201
+ // CIL[DOC-MICRO logic_summary="Interface with optional navigation click callback" notable_decisions="[]"]
202
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
203
+ // CIL[DOC-STABILITY stability="stable"]
204
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: none."]
205
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
206
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
207
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
208
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
209
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
112
210
  interface SidebarContentProps {
113
211
  onNavClick?: () => void
114
212
  }
115
-
213
+ // CIL[END chunk_id="sidebar_sidebarcontentprops_1783929861"]
214
+ // CIL[BEGIN chunk_id="sidebar_sidebarcontent_1783929861" type="function" identity="SidebarContent" parent="none"]
215
+ // CIL[DOC-MACRO purpose="Render main sidebar navigation with collapsible sections and user menu"]
216
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide complete sidebar navigation with admin sections and user controls"]
217
+ // CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[]"]
218
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX navigation with collapsible sections" errors="none" side_effects="Manages section state, calls logout, triggers navigation"]
219
+ // CIL[DOC-MICRO logic_summary="Collapsible admin sections (configs, data, observability) with role-based access and user popover" notable_decisions="[]"]
220
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
221
+ // CIL[DOC-STABILITY stability="stable"]
222
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: none."]
223
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
224
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
225
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
226
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
227
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
116
228
  export function SidebarContent({ onNavClick }: SidebarContentProps) {
117
229
  const location = useLocation()
118
230
  const { user, logout } = useAuth()
119
231
  const isSystemAdmin = user?.roles?.includes('system_admin')
120
232
 
121
- // Collapsible sections state
122
233
  const [configsOpen, setConfigsOpen] = useState(() =>
123
234
  location.pathname.includes('/admin/configs')
124
235
  )
125
236
  const [runtimeOpen, setRuntimeOpen] = useState(() =>
126
237
  location.pathname.includes('/admin/runtime')
127
238
  )
239
+ const [kbEngineOpen, setKbEngineOpen] = useState(() =>
240
+ location.pathname.includes('/admin/kb')
241
+ )
128
242
  const [observabilityOpen, setObservabilityOpen] = useState(() =>
129
243
  location.pathname.includes('/admin/observability')
130
244
  )
@@ -135,7 +249,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
135
249
 
136
250
  return (
137
251
  <nav className="mt-5 flex flex-1 flex-col px-2">
138
- {/* Main nav */}
139
252
  <div className="space-y-1">
140
253
  {navigation.map((item) => (
141
254
  <Link
@@ -161,7 +274,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
161
274
  ))}
162
275
  </div>
163
276
 
164
- {/* Configs Section */}
165
277
  {isSystemAdmin && (
166
278
  <>
167
279
  <div className="mt-6">
@@ -209,7 +321,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
209
321
  )}
210
322
  </div>
211
323
 
212
- {/* Runtime Section */}
213
324
  <div className="mt-4">
214
325
  <button
215
326
  onClick={() => setRuntimeOpen(!runtimeOpen)}
@@ -251,7 +362,47 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
251
362
  )}
252
363
  </div>
253
364
 
254
- {/* Observability Section */}
365
+ <div className="mt-4">
366
+ <button
367
+ onClick={() => setKbEngineOpen(!kbEngineOpen)}
368
+ className="flex w-full items-center justify-between px-2 py-2 text-sm font-medium text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground rounded-md"
369
+ >
370
+ <span>KB Engine</span>
371
+ {kbEngineOpen ? (
372
+ <ChevronDown className="h-4 w-4" />
373
+ ) : (
374
+ <ChevronRight className="h-4 w-4" />
375
+ )}
376
+ </button>
377
+
378
+ {kbEngineOpen && (
379
+ <div className="mt-1 space-y-1">
380
+ {kbEngineNavigation.map((item) => (
381
+ <Link
382
+ key={item.name}
383
+ to={item.href}
384
+ onClick={onNavClick}
385
+ className={classNames(
386
+ isActive(item.href)
387
+ ? 'bg-sidebar-accent text-sidebar-accent-foreground'
388
+ : 'text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
389
+ 'group flex items-center rounded-md px-2 py-2 text-sm font-medium pl-4'
390
+ )}
391
+ >
392
+ <item.icon
393
+ className={classNames(
394
+ isActive(item.href) ? 'text-sidebar-accent-foreground' : 'text-sidebar-foreground',
395
+ 'mr-3 h-4 w-4 flex-shrink-0'
396
+ )}
397
+ aria-hidden="true"
398
+ />
399
+ {item.name}
400
+ </Link>
401
+ ))}
402
+ </div>
403
+ )}
404
+ </div>
405
+
255
406
  <div className="mt-4">
256
407
  <button
257
408
  onClick={() => setObservabilityOpen(!observabilityOpen)}
@@ -295,7 +446,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
295
446
  </>
296
447
  )}
297
448
 
298
- {/* User section */}
299
449
  <div className="mt-auto border-t border-sidebar-border pt-4">
300
450
  <Popover>
301
451
  <PopoverTrigger asChild>
@@ -327,3 +477,4 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
327
477
  </nav>
328
478
  )
329
479
  }
480
+ // CIL[END chunk_id="sidebar_sidebarcontent_1783929861"]
@@ -1,3 +1,20 @@
1
+
2
+
3
+ // CIL[BEGIN chunk_id="DataDetailHeader_module_header_1783929048" type="module_header" identity="imports_and_types" parent="none"]
4
+ // CIL[DOC-MACRO purpose="Import dependencies and define detail header component types"]
5
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage imports and interface for detail header"]
6
+ // CIL[DOC-CONTEXT module="runtime" layer="frontend-component" related_files="[\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
7
+ // CIL[DOC-CONTRACT inputs="none" outputs="types" errors="none" side_effects="none"]
8
+ // CIL[DOC-MICRO logic_summary="Imports React, UI components, defines DataDetailHeaderProps" notable_decisions="[]"]
9
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
10
+ // CIL[DOC-STABILITY stability="stable"]
11
+ // CIL[DOC-AUDIENCE audience="developer"]
12
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/table-primitives.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/migrations/015_simplify_apps_table.sql, \."]
13
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
14
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
15
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
16
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
17
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1
18
  import React from 'react'
2
19
  import { Button } from '../ui/button'
3
20
  import * as Icons from 'lucide-react'
@@ -15,7 +32,21 @@ interface DataDetailHeaderProps {
15
32
  saving?: boolean
16
33
  deleting?: boolean
17
34
  }
18
-
35
+ // CIL[END chunk_id="DataDetailHeader_module_header_1783929048"]
36
+ // CIL[BEGIN chunk_id="DataDetailHeader_datadetailheader_1783929048" type="function" identity="DataDetailHeader" parent="none"]
37
+ // CIL[DOC-MACRO purpose="Render entity detail header with edit/save/delete buttons"]
38
+ // CIL[DOC-RESPONSIBILITY responsibility="Display header with title, icon, and action buttons"]
39
+ // CIL[DOC-CONTEXT module="runtime" layer="frontend-component" related_files="[\".framework/src/components/ui/table-primitives.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
40
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX header" errors="none" side_effects="calls callbacks"]
41
+ // CIL[DOC-MICRO logic_summary="Renders icon, title, and conditional edit/save/delete buttons" notable_decisions="[]"]
42
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
43
+ // CIL[DOC-STABILITY stability="stable"]
44
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/table-primitives.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
45
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
46
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
47
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
48
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
49
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
19
50
  export function DataDetailHeader({
20
51
  entity,
21
52
  icon,
@@ -75,3 +106,4 @@ export function DataDetailHeader({
75
106
  </div>
76
107
  )
77
108
  }
109
+ // CIL[END chunk_id="DataDetailHeader_datadetailheader_1783929048"]