spine-framework 0.3.125 → 0.3.127

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 +169 -97
  6. package/.framework/cli/commands/generate.ts +82 -161
  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} +147 -54
  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 +222 -347
  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 +162 -14
  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 +687 -533
  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 +173 -145
  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 +192 -115
  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 +3 -3
  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,18 +1,23 @@
1
- /**
2
- * @module src/pages/admin/PromptConfigsPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Admin list page for LLM prompt configurations. Fetches all configs via
8
- * `/api/prompt-configs?action=list`, applies client-side search, category
9
- * filter, and sort. Highlights the default config with a star badge.
10
- * Renders inside `AdminListPage`. Row clicks navigate to
11
- * `/spine-framework/admin/configs/prompt-configs/:id`.
12
- *
13
- * @seeAlso src/pages/admin/PromptConfigDetailPage.tsx
14
- */
15
1
 
2
+
3
+
4
+
5
+
6
+ // CIL[BEGIN chunk_id="promptconfigspage_module_header_1783666257" type="module_header" identity="imports" parent="none"]
7
+ // CIL[DOC-MACRO purpose="Import React dependencies and UI components"]
8
+ // CIL[DOC-RESPONSIBILITY responsibility="Import all required modules for PromptConfigsPage component"]
9
+ // CIL[DOC-CONTEXT module="PromptConfigsPage" layer="ui" 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\",\"\\\"]"]
10
+ // CIL[DOC-CONTRACT inputs="none" outputs="React hooks, UI components, utilities" errors="Import errors" side_effects="Module loading"]
11
+ // CIL[DOC-MICRO logic_summary="Imports React, icons, UI components, and utility functions" notable_decisions="[]"]
12
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
13
+ // CIL[DOC-STABILITY stability="stable"]
14
+ // CIL[DOC-AUDIENCE audience="developer"]
15
+ // CIL[DOC-VECTOR type="context" content="Layer: ui. 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, \."]
16
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
17
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
18
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
19
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
20
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
16
21
  import React, { useState } from 'react'
17
22
  import { Plus, FileText, CheckCircle, Star, Cpu, MessageSquare } from 'lucide-react';
18
23
  import { LoadingSpinner } from '../../components/ui/LoadingSpinner'
@@ -22,7 +27,21 @@ import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
22
27
  import { formatDateTime } from '../../lib/utils'
23
28
  import { useApi } from '../../hooks/useApi'
24
29
  import { apiFetch } from '../../lib/api'
25
-
30
+ // CIL[END chunk_id="promptconfigspage_module_header_1783666257"]
31
+ // CIL[BEGIN chunk_id="promptconfigspage_interface_promptconfig_1783666257" type="interface" identity="PromptConfig" parent="none"]
32
+ // CIL[DOC-MACRO purpose="Define prompt configuration data structure"]
33
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for prompt configuration entities"]
34
+ // CIL[DOC-CONTEXT module="PromptConfigsPage" layer="types" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
35
+ // CIL[DOC-CONTRACT inputs="none" outputs="PromptConfig interface" errors="Type errors" side_effects="Type system"]
36
+ // CIL[DOC-MICRO logic_summary="Defines structure for AI prompt configurations with model settings" notable_decisions="[]"]
37
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
38
+ // CIL[DOC-STABILITY stability="stable"]
39
+ // CIL[DOC-VECTOR type="context" content="Layer: types. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, \."]
40
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
41
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
42
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
43
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
44
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
26
45
  interface PromptConfig {
27
46
  id: string
28
47
  name: string
@@ -42,7 +61,21 @@ interface PromptConfig {
42
61
  created_at: string
43
62
  updated_at: string
44
63
  }
45
-
64
+ // CIL[END chunk_id="promptconfigspage_interface_promptconfig_1783666257"]
65
+ // CIL[BEGIN chunk_id="promptconfigspage_function_promptconfigspage_1783666257" type="function" identity="PromptConfigsPage" parent="none"]
66
+ // CIL[DOC-MACRO purpose="Render the complete prompt configs interface"]
67
+ // CIL[DOC-RESPONSIBILITY responsibility="Main render logic for prompt configs page"]
68
+ // CIL[DOC-CONTEXT module="PromptConfigsPage" layer="ui" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\"]"]
69
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX structure" errors="Render errors" side_effects="DOM updates"]
70
+ // CIL[DOC-MICRO logic_summary="Renders AdminListPage with stats, filters, and prompt config table" notable_decisions="[]"]
71
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
72
+ // CIL[DOC-STABILITY stability="stable"]
73
+ // CIL[DOC-VECTOR type="context" content="Layer: ui. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx."]
74
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
75
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
76
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
77
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
78
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
46
79
  export function PromptConfigsPage() {
47
80
  const [searchTerm, setSearchTerm] = useState('')
48
81
  const [selectedStatus, setSelectedStatus] = useState('all')
@@ -50,6 +83,20 @@ export function PromptConfigsPage() {
50
83
  const [sortKey, setSortKey] = useState('name')
51
84
  const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')
52
85
 
86
+ // CIL[BEGIN chunk_id="promptconfigspage_hooks_1783666257" type="hooks" identity="useApi" parent="promptconfigspage_function_promptconfigspage_1783666257"]
87
+ // CIL[DOC-MACRO purpose="Fetch prompt configurations from API"]
88
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle useApi"]
89
+ // CIL[DOC-CONTEXT module="PromptConfigsPage" layer="data" related_files="[\"\\\"]"]
90
+ // CIL[DOC-CONTRACT inputs="none" outputs="prompt configs array" errors="API errors" side_effects="HTTP requests"]
91
+ // CIL[DOC-MICRO logic_summary="Uses useApi hook to fetch prompt configurations list" notable_decisions="[]"]
92
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
93
+ // CIL[DOC-STABILITY stability="stable"]
94
+ // CIL[DOC-VECTOR type="context" content="Layer: data. Direct callers: 0. Direct calls: 0. Related files: \."]
95
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
96
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
97
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
98
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
99
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
53
100
  const { data: promptConfigs, loading, error, refetch } = useApi<PromptConfig[]>(
54
101
  async () => {
55
102
  const response = await apiFetch('/api/prompt-configs?action=list')
@@ -59,7 +106,22 @@ export function PromptConfigsPage() {
59
106
  },
60
107
  { immediate: true }
61
108
  )
109
+ // CIL[END chunk_id="promptconfigspage_hooks_1783666257"]
62
110
 
111
+ // CIL[BEGIN chunk_id="promptconfigspage_filters_1783666257" type="filter_logic" identity="filteredPromptConfigs" parent="promptconfigspage_function_promptconfigspage_1783666257"]
112
+ // CIL[DOC-MACRO purpose="Filter and sort prompt configurations"]
113
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle filteredPromptConfigs"]
114
+ // CIL[DOC-CONTEXT module="PromptConfigsPage" layer="logic" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
115
+ // CIL[DOC-CONTRACT inputs="none" outputs="filtered configs" errors="none" side_effects="none"]
116
+ // CIL[DOC-MICRO logic_summary="Filters configs by search, status, and type; extracts unique types" notable_decisions="[]"]
117
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
118
+ // CIL[DOC-STABILITY stability="stable"]
119
+ // CIL[DOC-VECTOR type="context" content="Layer: logic. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, \."]
120
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
121
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
122
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
123
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
124
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
63
125
  const filteredPromptConfigs = (promptConfigs || []).filter(config => {
64
126
  const matchesSearch = config.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
65
127
  config.slug.toLowerCase().includes(searchTerm.toLowerCase()) ||
@@ -72,7 +134,22 @@ export function PromptConfigsPage() {
72
134
  })
73
135
 
74
136
  const promptTypes = Array.from(new Set((promptConfigs || []).map(c => c.prompt_type).filter(Boolean)))
137
+ // CIL[END chunk_id="promptconfigspage_filters_1783666257"]
75
138
 
139
+ // CIL[BEGIN chunk_id="promptconfigspage_handlers_1783666257" type="event_handlers" identity="handleSort" parent="promptconfigspage_function_promptconfigspage_1783666257"]
140
+ // CIL[DOC-MACRO purpose="Handle sorting and row click events"]
141
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle handleSort"]
142
+ // CIL[DOC-CONTEXT module="handleSort" layer="unknown" related_files="[]"]
143
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
144
+ // CIL[DOC-MICRO logic_summary="Implements handleSort" notable_decisions="[]"]
145
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
146
+ // CIL[DOC-STABILITY stability="stable"]
147
+ // CIL[DOC-VECTOR type="context" content="Layer: unknown. Direct callers: 0. Direct calls: 0. Related files: none."]
148
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
149
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
150
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
151
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
152
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
76
153
  const handleSort = (key: string) => {
77
154
  if (sortKey === key) {
78
155
  setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc')
@@ -102,7 +179,22 @@ export function PromptConfigsPage() {
102
179
 
103
180
  return 0
104
181
  })
182
+ // CIL[END chunk_id="promptconfigspage_handlers_1783666257"]
105
183
 
184
+ // CIL[BEGIN chunk_id="promptconfigspage_stats_1783666257" type="stats_config" identity="statsCards" parent="promptconfigspage_function_promptconfigspage_1783666257"]
185
+ // CIL[DOC-MACRO purpose="Configure statistics cards and filter options"]
186
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle statsCards"]
187
+ // CIL[DOC-CONTEXT module="statsCards" layer="unknown" related_files="[]"]
188
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
189
+ // CIL[DOC-MICRO logic_summary="Implements statsCards" notable_decisions="[]"]
190
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
191
+ // CIL[DOC-STABILITY stability="stable"]
192
+ // CIL[DOC-VECTOR type="context" content="Layer: unknown. Direct callers: 0. Direct calls: 0. Related files: none."]
193
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
194
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
195
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
196
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
197
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
106
198
  const statsCards = [
107
199
  {
108
200
  title: 'Total Prompts',
@@ -155,7 +247,22 @@ export function PromptConfigsPage() {
155
247
  onChange: (v: string) => setSelectedType(v)
156
248
  }
157
249
  ]
250
+ // CIL[END chunk_id="promptconfigspage_stats_1783666257"]
158
251
 
252
+ // CIL[BEGIN chunk_id="promptconfigspage_render_1783666257" type="render_logic" identity="return" parent="promptconfigspage_function_promptconfigspage_1783666257"]
253
+ // CIL[DOC-MACRO purpose="Render the complete prompt configs interface"]
254
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle return"]
255
+ // CIL[DOC-CONTEXT module="return" layer="unknown" related_files="[]"]
256
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
257
+ // CIL[DOC-MICRO logic_summary="Implements return" notable_decisions="[]"]
258
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
259
+ // CIL[DOC-STABILITY stability="stable"]
260
+ // CIL[DOC-VECTOR type="context" content="Layer: unknown. Direct callers: 0. Direct calls: 0. Related files: none."]
261
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
262
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
263
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
264
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
265
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
159
266
  return (
160
267
  <AdminListPage
161
268
  title="Prompt Configs"
@@ -290,3 +397,5 @@ export function PromptConfigsPage() {
290
397
  </AdminListPage>
291
398
  )
292
399
  }
400
+ // CIL[END chunk_id="promptconfigspage_render_1783666257"]
401
+ // CIL[END chunk_id="promptconfigspage_function_promptconfigspage_1783666257"]
@@ -1,13 +1,22 @@
1
- /**
2
- * @module src/pages/admin/ProperlyDesignedPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability testing
6
- *
7
- * A properly designed page that works within the Spine admin layout.
8
- * Demonstrates shadcn components in a real application context.
9
- */
10
1
 
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="properlydesignedpage_module_header_1783666257" type="module_header" identity="imports" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import React dependencies and UI components"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Import all required modules for ProperlyDesignedPage component"]
8
+ // CIL[DOC-CONTEXT module="ProperlyDesignedPage" layer="ui" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
9
+ // CIL[DOC-CONTRACT inputs="none" outputs="React hooks, UI components, utilities" errors="Import errors" side_effects="Module loading"]
10
+ // CIL[DOC-MICRO logic_summary="Imports React, comprehensive UI components, icons, and utility functions" notable_decisions="[]"]
11
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
12
+ // CIL[DOC-STABILITY stability="stable"]
13
+ // CIL[DOC-AUDIENCE audience="developer"]
14
+ // CIL[DOC-VECTOR type="context" content="Layer: ui. 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/components/ui/table-primitives.tsx, \."]
15
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
16
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
17
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
18
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
11
20
  import { useState } from 'react'
12
21
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'
13
22
  import { Button } from '../../components/ui/button'
@@ -77,13 +86,41 @@ import {
77
86
  TrendingUp,
78
87
  Activity
79
88
  } from 'lucide-react'
80
-
89
+ // CIL[END chunk_id="properlydesignedpage_module_header_1783666257"]
90
+ // CIL[BEGIN chunk_id="properlydesignedpage_function_properlydesignedpage_1783666257" type="function" identity="ProperlyDesignedPage" parent="none"]
91
+ // CIL[DOC-MACRO purpose="Render the complete dashboard interface"]
92
+ // CIL[DOC-RESPONSIBILITY responsibility="Main render logic for comprehensive dashboard page"]
93
+ // CIL[DOC-CONTEXT module="ProperlyDesignedPage" layer="ui" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
94
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX structure" errors="Render errors" side_effects="DOM updates"]
95
+ // CIL[DOC-MICRO logic_summary="Renders header, stats cards, search bar, tabs with multiple content sections" notable_decisions="[]"]
96
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
97
+ // CIL[DOC-STABILITY stability="stable"]
98
+ // CIL[DOC-VECTOR type="context" content="Layer: ui. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/ui/table-primitives.tsx, \."]
99
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
100
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
101
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
102
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
103
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
81
104
  export function ProperlyDesignedPage() {
82
105
  const [selectedTab, setSelectedTab] = useState('overview')
83
106
  const [searchQuery, setSearchQuery] = useState('')
84
107
  const [notifications, setNotifications] = useState(true)
85
108
  const [autoSave, setAutoSave] = useState(true)
86
109
 
110
+ // CIL[BEGIN chunk_id="properlydesignedpage_render_1783666257" type="render_logic" identity="return" parent="properlydesignedpage_function_properlydesignedpage_1783666257"]
111
+ // CIL[DOC-MACRO purpose="Render the complete dashboard interface"]
112
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle return"]
113
+ // CIL[DOC-CONTEXT module="ProperlyDesignedPage" layer="ui" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
114
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX structure" errors="Render errors" side_effects="DOM updates"]
115
+ // CIL[DOC-MICRO logic_summary="Renders header, stats cards, search bar, tabs with multiple content sections" notable_decisions="[]"]
116
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
117
+ // CIL[DOC-STABILITY stability="stable"]
118
+ // CIL[DOC-VECTOR type="context" content="Layer: ui. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/ui/table-primitives.tsx, \."]
119
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
120
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
121
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
122
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
123
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
87
124
  return (
88
125
  <div className="container mx-auto p-6 space-y-6">
89
126
  {/* Header Section */}
@@ -432,3 +469,5 @@ export function ProperlyDesignedPage() {
432
469
  </div>
433
470
  )
434
471
  }
472
+ // CIL[END chunk_id="properlydesignedpage_render_1783666257"]
473
+ // CIL[END chunk_id="properlydesignedpage_function_properlydesignedpage_1783666257"]
@@ -1,12 +1,23 @@
1
- /**
2
- * @module src/pages/admin/RoleDetailPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Create / view / edit page for a single role.
8
- */
9
1
 
2
+
3
+
4
+
5
+
6
+ // CIL[BEGIN chunk_id="roledetailpage_module_header_1783666257" type="module_header" identity="imports" parent="none"]
7
+ // CIL[DOC-MACRO purpose="Import React dependencies and UI components"]
8
+ // CIL[DOC-RESPONSIBILITY responsibility="Import all required modules for RoleDetailPage component"]
9
+ // CIL[DOC-CONTEXT module="RoleDetailPage" layer="ui" 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\",\"\\\"]"]
10
+ // CIL[DOC-CONTRACT inputs="none" outputs="React hooks, UI components, utilities" errors="Import errors" side_effects="Module loading"]
11
+ // CIL[DOC-MICRO logic_summary="Imports React, router, UI components, icons, and utility functions" notable_decisions="[]"]
12
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
13
+ // CIL[DOC-STABILITY stability="stable"]
14
+ // CIL[DOC-AUDIENCE audience="developer"]
15
+ // CIL[DOC-VECTOR type="context" content="Layer: ui. 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, \."]
16
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
17
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
18
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
19
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
20
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
10
21
  import { useState, useEffect } from 'react'
11
22
  import { useParams, useNavigate } from 'react-router-dom'
12
23
  import { Button } from '../../components/ui/button'
@@ -21,7 +32,22 @@ import { ArrowLeft, ShieldCheck, AlertCircle } from 'lucide-react'
21
32
  import { useApi } from '../../hooks/useApi'
22
33
  import { apiFetch } from '../../lib/api'
23
34
  import { formatDateTime } from '../../lib/utils'
24
-
35
+ import { PageInstructions } from '../../components/admin/PageInstructions'
36
+ // CIL[END chunk_id="roledetailpage_module_header_1783666257"]
37
+ // CIL[BEGIN chunk_id="roledetailpage_interface_role_1783666257" type="interface" identity="Role" parent="none"]
38
+ // CIL[DOC-MACRO purpose="Define role data structure"]
39
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for role entities"]
40
+ // CIL[DOC-CONTEXT module="RoleDetailPage" layer="types" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
41
+ // CIL[DOC-CONTRACT inputs="none" outputs="Role interface" errors="Type errors" side_effects="Type system"]
42
+ // CIL[DOC-MICRO logic_summary="Defines structure for role configuration with permissions and metadata" notable_decisions="[]"]
43
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
44
+ // CIL[DOC-STABILITY stability="stable"]
45
+ // CIL[DOC-VECTOR type="context" content="Layer: types. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
46
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
47
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
48
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
49
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
50
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
25
51
  interface Role {
26
52
  id: string
27
53
  name: string
@@ -34,7 +60,21 @@ interface Role {
34
60
  created_at: string
35
61
  updated_at: string
36
62
  }
37
-
63
+ // CIL[END chunk_id="roledetailpage_interface_role_1783666257"]
64
+ // CIL[BEGIN chunk_id="roledetailpage_function_roledetailpage_1783666257" type="function" identity="RoleDetailPage" parent="none"]
65
+ // CIL[DOC-MACRO purpose="Render the complete role management interface"]
66
+ // CIL[DOC-RESPONSIBILITY responsibility="Main render logic for role detail page"]
67
+ // CIL[DOC-CONTEXT module="RoleDetailPage" layer="ui" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\"]"]
68
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX structure" errors="Render errors" side_effects="DOM updates"]
69
+ // CIL[DOC-MICRO logic_summary="Renders loading states, error states, and role form with all fields" notable_decisions="[]"]
70
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
71
+ // CIL[DOC-STABILITY stability="stable"]
72
+ // CIL[DOC-VECTOR type="context" content="Layer: ui. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx."]
73
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
74
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
75
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
76
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
77
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
38
78
  export function RoleDetailPage() {
39
79
  const { id } = useParams<{ id: string }>()
40
80
  const navigate = useNavigate()
@@ -52,6 +92,20 @@ export function RoleDetailPage() {
52
92
  const [isSubmitting, setIsSubmitting] = useState(false)
53
93
  const [error, setError] = useState<string | null>(null)
54
94
 
95
+ // CIL[BEGIN chunk_id="roledetailpage_hooks_1783666257" type="hooks" identity="useApi" parent="roledetailpage_function_roledetailpage_1783666257"]
96
+ // CIL[DOC-MACRO purpose="Fetch role data and manage form state"]
97
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle useApi"]
98
+ // CIL[DOC-CONTEXT module="RoleDetailPage" layer="data" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
99
+ // CIL[DOC-CONTRACT inputs="none" outputs="role data, form state" errors="API errors" side_effects="HTTP requests, state updates"]
100
+ // CIL[DOC-MICRO logic_summary="Uses useApi hook to fetch role data and useEffect to sync form state" notable_decisions="[]"]
101
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
102
+ // CIL[DOC-STABILITY stability="stable"]
103
+ // CIL[DOC-VECTOR type="context" content="Layer: data. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
104
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
105
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
106
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
107
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
108
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
55
109
  const { data: role, loading, error: fetchError } = useApi<Role>(
56
110
  async () => {
57
111
  if (isCreateMode) return null
@@ -76,7 +130,22 @@ export function RoleDetailPage() {
76
130
  setPermissionsJson(JSON.stringify(role.permissions || {}, null, 2))
77
131
  }
78
132
  }, [role])
133
+ // CIL[END chunk_id="roledetailpage_hooks_1783666257"]
79
134
 
135
+ // CIL[BEGIN chunk_id="roledetailpage_handlers_1783666257" type="event_handlers" identity="handleSubmit" parent="roledetailpage_function_roledetailpage_1783666257"]
136
+ // CIL[DOC-MACRO purpose="Handle form submission for role creation/editing"]
137
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle handleSubmit"]
138
+ // CIL[DOC-CONTEXT module="RoleDetailPage" layer="logic" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
139
+ // CIL[DOC-CONTRACT inputs="none" outputs="API response, navigation" errors="Validation errors, API errors" side_effects="HTTP requests, navigation"]
140
+ // CIL[DOC-MICRO logic_summary="Validates form data, parses permissions, submits to API, handles errors" notable_decisions="[]"]
141
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
142
+ // CIL[DOC-STABILITY stability="stable"]
143
+ // CIL[DOC-VECTOR type="context" content="Layer: logic. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
144
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
145
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
146
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
147
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
148
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
80
149
  const handleSubmit = async (e: React.FormEvent) => {
81
150
  e.preventDefault()
82
151
  setIsSubmitting(true)
@@ -117,7 +186,22 @@ export function RoleDetailPage() {
117
186
  setIsSubmitting(false)
118
187
  }
119
188
  }
189
+ // CIL[END chunk_id="roledetailpage_handlers_1783666257"]
120
190
 
191
+ // CIL[BEGIN chunk_id="roledetailpage_render_1783666257" type="render_logic" identity="return" parent="roledetailpage_function_roledetailpage_1783666257"]
192
+ // CIL[DOC-MACRO purpose="Render the complete role management interface"]
193
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle return"]
194
+ // CIL[DOC-CONTEXT module="return" layer="unknown" related_files="[]"]
195
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
196
+ // CIL[DOC-MICRO logic_summary="Implements return" notable_decisions="[]"]
197
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
198
+ // CIL[DOC-STABILITY stability="stable"]
199
+ // CIL[DOC-VECTOR type="context" content="Layer: unknown. Direct callers: 0. Direct calls: 0. Related files: none."]
200
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
201
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
202
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
203
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
204
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
121
205
  if (loading) {
122
206
  return (
123
207
  <div className="space-y-6">
@@ -155,6 +239,40 @@ export function RoleDetailPage() {
155
239
  </h1>
156
240
  </div>
157
241
 
242
+ <PageInstructions
243
+ description="Define a role and set its permissions and metadata."
244
+ sections={[
245
+ { title: 'What this role controls', content: 'A role is a named permission set assigned to people. It controls which record types a person can create, read, update, delete, or admin, and whether the role can be assigned in the first place.' },
246
+ { title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
247
+ <li><strong>Name</strong> — string, required. The display label such as Sales Manager. Empty name blocks save.</li>
248
+ <li><strong>Slug</strong> — string, required. A unique URL-friendly identifier. Disabled after creation because permissions and references depend on it.</li>
249
+ <li><strong>Description</strong> — string. Optional context for other admins.</li>
250
+ <li><strong>System Role</strong> — checkbox, create-only. Marks a reserved role that cannot be deleted and is protected for core functions.</li>
251
+ <li><strong>Active</strong> — checkbox. Inactive roles cannot be assigned to people.</li>
252
+ <li><strong>Permissions (JSON)</strong> — JSON. Maps type slugs to arrays of allowed actions. Invalid JSON or wrong shape will cause save to fail.</li>
253
+ </ul> },
254
+ { title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
255
+ <li><strong>Actions per type</strong>: typical values are create, read, update, delete, and admin. Use the array format with a type slug mapped to an array: type_slug: ["read", "write"].</li>
256
+ <li><strong>System Role</strong>: can only be set during creation and prevents deletion later.</li>
257
+ </ul> },
258
+ { title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
259
+ <li>People assigned to this role receive the effective permissions immediately after the role is saved.</li>
260
+ <li>The admin-data API and runtime record UIs evaluate the role permissions for every create, read, update, and delete request.</li>
261
+ <li>Missing or malformed permissions can lock people out of records or grant unintended access.</li>
262
+ </ul> },
263
+ { title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
264
+ <li>In create mode, enter Name and Slug, then set Active and optionally System. Existing roles cannot change the slug.</li>
265
+ <li>Enter valid Permissions JSON mapping type slugs to action arrays.</li>
266
+ <li>Click Create Role or Update Role. Save fails if the name/slug are empty, the slug is changed, or the permissions JSON cannot be parsed.</li>
267
+ </ol> },
268
+ { title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
269
+ <li>Writing permissions as a flat list instead of an object of arrays.</li>
270
+ <li>Trying to change the slug after creation, which is disabled and will be ignored.</li>
271
+ <li>Forgetting to mark a role Active, which prevents assignment.</li>
272
+ </ul> },
273
+ ]}
274
+ />
275
+
158
276
  {error && (
159
277
  <Alert variant="destructive">
160
278
  <AlertCircle className="h-4 w-4" />
@@ -271,3 +389,5 @@ export function RoleDetailPage() {
271
389
  </div>
272
390
  )
273
391
  }
392
+ // CIL[END chunk_id="roledetailpage_render_1783666257"]
393
+ // CIL[END chunk_id="roledetailpage_function_roledetailpage_1783666257"]