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,3 +1,21 @@
1
+
2
+
3
+
4
+ // CIL[BEGIN chunk_id="main_module_header_1783672456" type="module_header" identity="imports" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import React and app dependencies"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Import all required modules for app bootstrap"]
7
+ // CIL[DOC-CONTEXT module="main" layer="frontend-entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="React components" errors="none" side_effects="none"]
9
+ // CIL[DOC-MICRO logic_summary="Imports React, routing, state management, and app components" 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-entry. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
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"]
1
19
  import React from 'react'
2
20
  import ReactDOM from 'react-dom/client'
3
21
  import { BrowserRouter } from 'react-router-dom'
@@ -5,8 +23,21 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
5
23
  import App from './App'
6
24
  import { AuthProvider } from './contexts/AuthContext'
7
25
  import './index.css'
8
-
9
- // Create a client
26
+ // CIL[END chunk_id="main_module_header_1783672456"]
27
+ // CIL[BEGIN chunk_id="main_queryclient_1783672456" type="variable" identity="queryClient" parent="none"]
28
+ // CIL[DOC-MACRO purpose="Configure React Query client"]
29
+ // CIL[DOC-RESPONSIBILITY responsibility="Create and configure query client instance"]
30
+ // CIL[DOC-CONTEXT module="main" layer="frontend-entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
31
+ // CIL[DOC-CONTRACT inputs="none" outputs="QueryClient instance" errors="none" side_effects="none"]
32
+ // CIL[DOC-MICRO logic_summary="Creates QueryClient with retry and refetch options" notable_decisions="[]"]
33
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
34
+ // CIL[DOC-STABILITY stability="stable"]
35
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-entry. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
36
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
37
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
38
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
39
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
10
41
  const queryClient = new QueryClient({
11
42
  defaultOptions: {
12
43
  queries: {
@@ -15,7 +46,21 @@ const queryClient = new QueryClient({
15
46
  },
16
47
  },
17
48
  })
18
-
49
+ // CIL[END chunk_id="main_queryclient_1783672456"]
50
+ // CIL[BEGIN chunk_id="main_render_1783672456" type="function" identity="render" parent="none"]
51
+ // CIL[DOC-MACRO purpose="Render React app to DOM"]
52
+ // CIL[DOC-RESPONSIBILITY responsibility="Bootstrap React application"]
53
+ // CIL[DOC-CONTEXT module="main" layer="frontend-entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
54
+ // CIL[DOC-CONTRACT inputs="none" outputs="DOM render" errors="none" side_effects="DOM manipulation"]
55
+ // CIL[DOC-MICRO logic_summary="Creates root and renders app with providers" notable_decisions="[]"]
56
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
57
+ // CIL[DOC-STABILITY stability="stable"]
58
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-entry. Direct callers: 2. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, \."]
59
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 2. Total affected: 2."]
60
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
61
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
62
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
63
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
19
64
  ReactDOM.createRoot(document.getElementById('root')!).render(
20
65
  <QueryClientProvider client={queryClient}>
21
66
  <BrowserRouter>
@@ -25,3 +70,4 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
25
70
  </BrowserRouter>
26
71
  </QueryClientProvider>,
27
72
  )
73
+ // CIL[END chunk_id="main_render_1783672456"]
@@ -1,36 +1,63 @@
1
- /**
2
- * @module src/pages/DashboardPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Admin home page. On mount, fetches all active item types (`kind=item`)
8
- * from `/api/types` and then fans out parallel requests to
9
- * `/api/admin-data?action=stats&entity=items&type_slug=…` to collect
10
- * per-type item counts (capped at 8 types). Renders:
11
- * - **Entity overview grid** — one stat card per type + a "Configuration"
12
- * shortcut card
13
- * - **Quick Actions row** — "New <Type>" buttons for the first 4 types plus
14
- * a "Configure Types" shortcut
15
- *
16
- * @seeAlso src/contexts/AuthContext.tsx (provides current user)
17
- * @seeAlso src/lib/api.ts (apiFetch)
18
- */
19
1
 
2
+
3
+
4
+ // CIL[BEGIN chunk_id="dashboardpage_module_header_1783672456" type="module_header" identity="imports" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import React and dashboard dependencies"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Import dashboard components and hooks"]
7
+ // CIL[DOC-CONTEXT module="DashboardPage" layer="frontend-page" 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/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="React hooks and components" errors="none" side_effects="none"]
9
+ // CIL[DOC-MICRO logic_summary="Imports React, hooks, routing, and icons" 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-page. 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/RolesPage.tsx, .framework/functions/_shared/principal.ts, \."]
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, useEffect } from 'react'
21
20
  import { useAuth } from '../contexts/AuthContext'
22
21
  import { useApi } from '../hooks/useApi'
23
22
  import { apiFetch } from '../lib/api'
24
23
  import { useNavigate } from 'react-router-dom'
25
- import { Box, UserGroupIcon, FileText, BarChart3, Settings, Plus } from 'lucide-react';
26
-
24
+ import { Box, UserGroupIcon, FileText, BarChart3, Settings, Plus, CubeIcon } from 'lucide-react';
25
+ // CIL[END chunk_id="dashboardpage_module_header_1783672456"]
26
+ // CIL[BEGIN chunk_id="dashboardpage_typestat_1783672456" type="interface" identity="TypeStat" parent="none"]
27
+ // CIL[DOC-MACRO purpose="Define type statistics interface"]
28
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for dashboard stats"]
29
+ // CIL[DOC-CONTEXT module="DashboardPage" layer="frontend-page" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/db.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
30
+ // CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
31
+ // CIL[DOC-MICRO logic_summary="Interface for entity type statistics" notable_decisions="[]"]
32
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
33
+ // CIL[DOC-STABILITY stability="stable"]
34
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/db.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
35
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
36
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
37
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
38
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
39
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
27
40
  interface TypeStat {
28
41
  name: string
29
42
  count: number
30
43
  slug: string
31
44
  icon: any
32
45
  }
33
-
46
+ // CIL[END chunk_id="dashboardpage_typestat_1783672456"]
47
+ // CIL[BEGIN chunk_id="dashboardpage_dashboardpage_1783672456" type="function" identity="DashboardPage" parent="none"]
48
+ // CIL[DOC-MACRO purpose="Render admin dashboard"]
49
+ // CIL[DOC-RESPONSIBILITY responsibility="Display entity overview and quick actions"]
50
+ // CIL[DOC-CONTEXT module="DashboardPage" layer="frontend-page" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
51
+ // CIL[DOC-CONTRACT inputs="none" outputs="Dashboard JSX" errors="Network errors" side_effects="API calls, navigation"]
52
+ // CIL[DOC-MICRO logic_summary="Fetches type stats, displays overview cards and actions" notable_decisions="[]"]
53
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
54
+ // CIL[DOC-STABILITY stability="stable"]
55
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
56
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
57
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
58
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
59
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
60
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
34
61
  export function DashboardPage() {
35
62
  const { user } = useAuth()
36
63
  const navigate = useNavigate()
@@ -47,11 +74,10 @@ export function DashboardPage() {
47
74
  useEffect(() => {
48
75
  const fetchStats = async () => {
49
76
  try {
50
- // Fetch active types with their counts
51
77
  const typesResponse = await apiFetch('/api/types?kind=item&is_active=true')
52
78
  if (typesResponse.ok) {
53
79
  const response = await typesResponse.json()
54
- const types = response.data || response // Handle both wrapped and unwrapped responses
80
+ const types = response.data || response
55
81
 
56
82
  if (!Array.isArray(types)) {
57
83
  console.error('Expected array of types, got:', types)
@@ -59,7 +85,6 @@ export function DashboardPage() {
59
85
  return
60
86
  }
61
87
 
62
- // Get counts for each type
63
88
  const statsPromises = types.map(async (type: any) => {
64
89
  const countResponse = await apiFetch(`/api/admin-data?action=stats&entity=items&type_slug=${type.slug}`)
65
90
  if (countResponse.ok) {
@@ -68,14 +93,14 @@ export function DashboardPage() {
68
93
  name: type.name,
69
94
  count: countData.count || 0,
70
95
  slug: type.slug,
71
- icon: CubeIcon // Default icon, could be enhanced to use type.icon
96
+ icon: CubeIcon
72
97
  }
73
98
  }
74
99
  return null
75
100
  })
76
101
 
77
102
  const resolvedStats = await Promise.all(statsPromises)
78
- const validStats = resolvedStats.filter((s): s is NonNullable<typeof s> => s !== null).slice(0, 8) // Limit to 8 types
103
+ const validStats = resolvedStats.filter((s): s is NonNullable<typeof s> => s !== null).slice(0, 8)
79
104
  setTypeStats(validStats)
80
105
  }
81
106
  } catch (error) {
@@ -106,7 +131,6 @@ export function DashboardPage() {
106
131
 
107
132
  return (
108
133
  <div className="space-y-6">
109
- {/* Type Stats */}
110
134
  <div>
111
135
  <h2 className="text-lg font-semibold text-slate-900 mb-4">Entity Overview</h2>
112
136
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
@@ -131,7 +155,6 @@ export function DashboardPage() {
131
155
  )
132
156
  })}
133
157
 
134
- {/* Quick Actions Card */}
135
158
  <div
136
159
  className="rounded-xl border border-slate-200 bg-white p-5 hover:shadow-md transition-shadow cursor-pointer"
137
160
  onClick={() => navigate('/spine-framework/admin/configs/types')}
@@ -149,7 +172,6 @@ export function DashboardPage() {
149
172
  </div>
150
173
  </div>
151
174
 
152
- {/* Quick Actions */}
153
175
  <div className="rounded-xl border border-slate-200 bg-white p-6">
154
176
  <h3 className="text-sm font-semibold text-slate-900 mb-4">
155
177
  Quick Actions
@@ -179,3 +201,4 @@ export function DashboardPage() {
179
201
  </div>
180
202
  )
181
203
  }
204
+ // CIL[END chunk_id="dashboardpage_dashboardpage_1783672456"]
@@ -1,17 +1,38 @@
1
- /**
2
- * @module src/pages/NotFoundPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Generic 404 page rendered by the catch-all route. Displays a large
8
- * "404" heading and a link back to the sign-in page.
9
- */
10
1
 
2
+
3
+ // CIL[BEGIN chunk_id="notfoundpage_module_header_1783672456" type="module_header" identity="imports" parent="none"]
4
+ // CIL[DOC-MACRO purpose="Import React and components"]
5
+ // CIL[DOC-RESPONSIBILITY responsibility="Import required dependencies"]
6
+ // CIL[DOC-CONTEXT module="NotFoundPage" layer="frontend-page" 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\",\"\\\"]"]
7
+ // CIL[DOC-CONTRACT inputs="none" outputs="React components" errors="none" side_effects="none"]
8
+ // CIL[DOC-MICRO logic_summary="Imports React, Link, and Home icon" 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-page. 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, \."]
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"]
11
18
  import React from 'react'
12
19
  import { Link } from 'react-router-dom'
13
20
  import { Home } from 'lucide-react';
14
-
21
+ // CIL[END chunk_id="notfoundpage_module_header_1783672456"]
22
+ // CIL[BEGIN chunk_id="notfoundpage_notfoundpage_1783672456" type="function" identity="NotFoundPage" parent="none"]
23
+ // CIL[DOC-MACRO purpose="Render 404 error page"]
24
+ // CIL[DOC-RESPONSIBILITY responsibility="Display not found error with navigation"]
25
+ // CIL[DOC-CONTEXT module="NotFoundPage" layer="frontend-page" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
26
+ // CIL[DOC-CONTRACT inputs="none" outputs="404 page JSX" errors="none" side_effects="none"]
27
+ // CIL[DOC-MICRO logic_summary="Shows 404 message and login link" notable_decisions="[]"]
28
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
29
+ // CIL[DOC-STABILITY stability="stable"]
30
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-page. 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/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
31
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
32
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
33
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
34
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
35
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
15
36
  export function NotFoundPage() {
16
37
  return (
17
38
  <div className="min-h-screen bg-slate-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8">
@@ -37,3 +58,4 @@ export function NotFoundPage() {
37
58
  </div>
38
59
  )
39
60
  }
61
+ // CIL[END chunk_id="notfoundpage_notfoundpage_1783672456"]
@@ -1,18 +1,37 @@
1
- /**
2
- * @module src/pages/SetupPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Shown at the root path when no apps are installed or no users have been
8
- * created yet. Guides the developer through the initial setup steps.
9
- * Replaces the old /dashboard fallback — the framework has no opinion
10
- * about what lives at / once apps are installed.
11
- */
12
1
 
2
+
3
+ // CIL[BEGIN chunk_id="setuppage_module_header_1783672456" type="module_header" identity="imports" parent="none"]
4
+ // CIL[DOC-MACRO purpose="Import React and routing"]
5
+ // CIL[DOC-RESPONSIBILITY responsibility="Import required components"]
6
+ // CIL[DOC-CONTEXT module="SetupPage" layer="frontend-page" 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\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
7
+ // CIL[DOC-CONTRACT inputs="none" outputs="React components" errors="none" side_effects="none"]
8
+ // CIL[DOC-MICRO logic_summary="Imports React and Link for setup page" 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-page. 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, .framework/functions/_shared/principal.ts, \."]
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"]
13
18
  import React from 'react'
14
19
  import { Link } from 'react-router-dom'
15
-
20
+ // CIL[END chunk_id="setuppage_module_header_1783672456"]
21
+ // CIL[BEGIN chunk_id="setuppage_setuppage_1783672456" type="function" identity="SetupPage" parent="none"]
22
+ // CIL[DOC-MACRO purpose="Render setup instructions page"]
23
+ // CIL[DOC-RESPONSIBILITY responsibility="Show initial setup guide"]
24
+ // CIL[DOC-CONTEXT module="SetupPage" layer="frontend-page" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
25
+ // CIL[DOC-CONTRACT inputs="none" outputs="Setup page JSX" errors="none" side_effects="none"]
26
+ // CIL[DOC-MICRO logic_summary="Displays setup steps and login link" notable_decisions="[]"]
27
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
28
+ // CIL[DOC-STABILITY stability="stable"]
29
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-page. 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/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
30
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
31
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
32
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
33
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
34
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
16
35
  export function SetupPage() {
17
36
  return (
18
37
  <div className="min-h-screen flex items-center justify-center bg-slate-50 py-12 px-4 sm:px-6 lg:px-8">
@@ -64,3 +83,4 @@ export function SetupPage() {
64
83
  </div>
65
84
  )
66
85
  }
86
+ // CIL[END chunk_id="setuppage_setuppage_1783672456"]
@@ -1,6 +1,22 @@
1
- /**
2
- * @module src/pages/admin/AIAgentDetailPage
3
- */
1
+
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="aiagentdetailpage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import dependencies for AIAgentDetailPage component"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, routing, API hooks, and UI components"]
8
+ // CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
9
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
10
+ // CIL[DOC-MICRO logic_summary="Imports React state management, routing, API hooks, UI components" 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: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.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"]
4
20
  import { useState, useEffect } from 'react'
5
21
  import { useParams, useNavigate } from 'react-router-dom'
6
22
  import { useApi } from '../../hooks/useApi'
@@ -15,29 +31,74 @@ import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/ca
15
31
  import { Skeleton } from '../../components/ui/skeleton'
16
32
  import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
17
33
  import { ArrowLeft, Bot, AlertCircle } from 'lucide-react'
18
-
34
+ import { PageInstructions } from '../../components/admin/PageInstructions'
35
+ // CIL[END chunk_id="aiagentdetailpage_module_header_1783668265"]
36
+ // CIL[BEGIN chunk_id="aiagentdetailpage_interface_aiagent_1783668265" type="interface" identity="AIAgent" parent="none"]
37
+ // CIL[DOC-MACRO purpose="Define AIAgent data structure"]
38
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for AI agent objects"]
39
+ // CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="types" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
40
+ // CIL[DOC-CONTRACT inputs="none" outputs="AIAgent interface type" errors="none" side_effects="none"]
41
+ // CIL[DOC-MICRO logic_summary="Defines complete AI agent structure with model config and capabilities" 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: types. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
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
  interface AIAgent {
20
51
  id: string
21
52
  name: string
22
53
  description?: string
54
+ app_id?: string
23
55
  agent_type: 'chat' | 'analysis' | 'automation' | 'custom'
24
56
  model_config: { model: string; max_tokens?: number; temperature?: number }
25
57
  system_prompt: string
26
58
  tools: string[]
27
59
  capabilities?: Record<string, any>
28
60
  constraints?: Record<string, any>
61
+ metadata?: Record<string, any>
29
62
  is_active: boolean
30
63
  created_at: string
31
64
  updated_at: string
32
65
  }
33
-
66
+ // CIL[END chunk_id="aiagentdetailpage_interface_aiagent_1783668265"]
67
+ // CIL[BEGIN chunk_id="aiagentdetailpage_constant_agent_types_1783668265" type="constant" identity="AGENT_TYPES" parent="none"]
68
+ // CIL[DOC-MACRO purpose="Define AI agent type options"]
69
+ // CIL[DOC-RESPONSIBILITY responsibility="Configure available agent type choices"]
70
+ // CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="constants" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
71
+ // CIL[DOC-CONTRACT inputs="none" outputs="Agent type options" errors="none" side_effects="none"]
72
+ // CIL[DOC-MICRO logic_summary="Defines chat, analysis, automation, and custom agent types" notable_decisions="[]"]
73
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
74
+ // CIL[DOC-STABILITY stability="stable"]
75
+ // CIL[DOC-VECTOR type="context" content="Layer: constants. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
76
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
77
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
78
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
79
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
80
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
34
81
  const AGENT_TYPES = [
35
82
  { value: 'chat', label: 'Chat' },
36
83
  { value: 'analysis', label: 'Analysis' },
37
84
  { value: 'automation', label: 'Automation' },
38
85
  { value: 'custom', label: 'Custom' }
39
86
  ]
40
-
87
+ // CIL[END chunk_id="aiagentdetailpage_constant_agent_types_1783668265"]
88
+ // CIL[BEGIN chunk_id="aiagentdetailpage_function_aiagentdetailpage_1783668265" type="function" identity="AIAgentDetailPage" parent="none"]
89
+ // CIL[DOC-MACRO purpose="Main AIAgentDetailPage component implementation"]
90
+ // CIL[DOC-RESPONSIBILITY responsibility="Render AI agent detail view with create/edit functionality"]
91
+ // CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
92
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="API failures" side_effects="Navigation, API calls"]
93
+ // CIL[DOC-MICRO logic_summary="Manages CRUD operations for AI agents with form validation and state management" notable_decisions="[]"]
94
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
95
+ // CIL[DOC-STABILITY stability="stable"]
96
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
97
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
98
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
99
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
100
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
101
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
41
102
  export function AIAgentDetailPage() {
42
103
  const { id } = useParams<{ id: string }>()
43
104
  const navigate = useNavigate()
@@ -48,9 +109,9 @@ export function AIAgentDetailPage() {
48
109
  const { data: agent, loading, error } = useApi<AIAgent>(
49
110
  async () => {
50
111
  if (isCreateMode) return {
51
- id: '', name: '', description: '', agent_type: 'chat' as const,
112
+ id: '', name: '', description: '', app_id: '', agent_type: 'chat' as const,
52
113
  model_config: { model: 'gpt-4', max_tokens: 2048, temperature: 0.7 },
53
- system_prompt: '', tools: [], capabilities: {}, constraints: {},
114
+ system_prompt: '', tools: [], capabilities: {}, constraints: {}, metadata: {},
54
115
  is_active: true, created_at: new Date().toISOString(), updated_at: new Date().toISOString()
55
116
  }
56
117
  const response = await apiFetch(`/api/ai-agents?method=GET&id=${id}`)
@@ -64,11 +125,12 @@ export function AIAgentDetailPage() {
64
125
  useEffect(() => {
65
126
  if (agent) {
66
127
  setEditData({
67
- name: agent.name, description: agent.description || '', agent_type: agent.agent_type,
128
+ name: agent.name, description: agent.description || '', app_id: agent.app_id || '', agent_type: agent.agent_type,
68
129
  model_config: agent.model_config || { model: 'gpt-4', max_tokens: 2048, temperature: 0.7 },
69
130
  system_prompt: agent.system_prompt || '', tools: (agent.tools || []).join('\n'),
70
131
  capabilities: JSON.stringify(agent.capabilities || {}, null, 2),
71
132
  constraints: JSON.stringify(agent.constraints || {}, null, 2),
133
+ metadata: JSON.stringify(agent.metadata || {}, null, 2),
72
134
  is_active: agent.is_active
73
135
  })
74
136
  }
@@ -78,9 +140,11 @@ export function AIAgentDetailPage() {
78
140
  try {
79
141
  const payload = {
80
142
  ...editData,
143
+ app_id: editData.app_id || null,
81
144
  tools: editData.tools?.split('\n').filter(Boolean) || [],
82
145
  capabilities: JSON.parse(editData.capabilities || '{}'),
83
- constraints: JSON.parse(editData.constraints || '{}')
146
+ constraints: JSON.parse(editData.constraints || '{}'),
147
+ metadata: JSON.parse(editData.metadata || '{}')
84
148
  }
85
149
  const url = isCreateMode ? '/api/ai-agents' : `/api/ai-agents?id=${id}`
86
150
  const response = await apiFetch(url, {
@@ -115,6 +179,48 @@ export function AIAgentDetailPage() {
115
179
  <h1 className="text-2xl font-bold">{isCreateMode ? 'Create AI Agent' : agent?.name}</h1>
116
180
  </div>
117
181
 
182
+ <PageInstructions
183
+ description="Configure an AI agent with a model, system prompt, and tools."
184
+ sections={[
185
+ { title: 'What this AI agent controls', content: 'An AI agent is a reusable model, prompt, and tool configuration that Spine invokes from pipelines, triggers, and chat interfaces. It defines how an LLM behaves, which tools it can call, and any guardrails.' },
186
+ { title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
187
+ <li><strong>Name</strong> — string. The display name used in lists and callers. Missing or empty prevents the record from being saved.</li>
188
+ <li><strong>Type</strong> — select. Categorizes the agent as chat, analysis, automation, or custom. Used to filter and route agents; a missing value defaults to chat.</li>
189
+ <li><strong>Model</strong> — string. The LLM model name stored in <code>model_config.model</code>. If blank, the API call will fail because no model is targeted.</li>
190
+ <li><strong>Max Tokens</strong> — number. The maximum response length. Invalid or empty parses to an empty value and may cause provider errors.</li>
191
+ <li><strong>Temperature</strong> — number between 0 and 2. Lower is more deterministic, higher is more random. Out of range values may be rejected by the provider.</li>
192
+ <li><strong>Description</strong> — string (optional). Human-readable context for other admins.</li>
193
+ <li><strong>System Prompt</strong> — text. Defines the agent personality, instructions, and constraints. Empty means the model receives no system message.</li>
194
+ <li><strong>App ID</strong> — string. Optional owning app UUID; blank means account-scoped.</li>
195
+ <li><strong>Tools (one per line)</strong> — newline-separated string list. Tool names the agent is allowed to invoke. Unknown or missing tools cause runtime errors.</li>
196
+ <li><strong>Capabilities</strong> — JSON object. Optional flags or settings the agent can use. Must be valid JSON or save fails.</li>
197
+ <li><strong>Constraints</strong> — JSON object. Optional guardrails. Must be valid JSON or save fails.</li>
198
+ <li><strong>Metadata</strong> — JSON object. Optional metadata. Must be valid JSON or save fails.</li>
199
+ <li><strong>Active</strong> — checkbox. Inactive agents are not available for invocation.</li>
200
+ </ul> },
201
+ { title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
202
+ <li><strong>Agent type</strong>: <em>Chat</em> for conversational assistants, <em>Analysis</em> for data reasoning, <em>Automation</em> for pipeline actions, <em>Custom</em> for anything else.</li>
203
+ <li><strong>Active</strong>: enabled means the agent can be called; disabled means it is hidden from callers and will not run.</li>
204
+ </ul> },
205
+ { title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
206
+ <li>Pipelines, triggers, and chat UIs reference agents by ID; deleting or changing the model changes their output.</li>
207
+ <li>Tool names listed here must match registered tool names exactly, otherwise the agent cannot call them.</li>
208
+ <li>Invalid JSON in Capabilities or Constraints will stop the save and leave the previous config in place.</li>
209
+ </ul> },
210
+ { title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
211
+ <li>In create mode, fill every required field, enter at least a model name and system prompt.</li>
212
+ <li>Add tools one per line; supply optional JSON in Capabilities and Constraints.</li>
213
+ <li>Click Create. On existing records, click Edit, change fields, then Save.</li>
214
+ <li>Validation checks JSON syntax, parses Max Tokens and Temperature as numbers, and rejects empty Name/Model.</li>
215
+ </ol> },
216
+ { title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
217
+ <li>Pasting a multiline tools string as a single comma-separated line.</li>
218
+ <li>Using invalid JSON in Capabilities or Constraints.</li>
219
+ <li>Referencing a model name that is not configured in the account, causing calls to fail.</li>
220
+ </ul> },
221
+ ]}
222
+ />
223
+
118
224
  <div className="flex justify-end gap-2">
119
225
  {isEditing ? (
120
226
  <><Button variant="outline" onClick={() => isCreateMode ? navigate(-1) : setIsEditing(false)}>Cancel</Button><Button onClick={handleSave}>{isCreateMode ? 'Create' : 'Save'}</Button></>
@@ -125,6 +231,7 @@ export function AIAgentDetailPage() {
125
231
  <Card><CardContent className="p-6 space-y-4">
126
232
  <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
127
233
  <div className="space-y-2"><Label>Name</Label><Input value={editData.name || ''} onChange={e => setEditData({...editData, name: e.target.value})} /></div>
234
+ <div className="space-y-2"><Label>App ID</Label><Input value={editData.app_id || ''} onChange={e => setEditData({...editData, app_id: e.target.value})} placeholder="Optional app UUID" /></div>
128
235
  <div className="space-y-2"><Label>Type</Label><Select value={editData.agent_type || 'chat'} onValueChange={v => setEditData({...editData, agent_type: v})}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent>{AGENT_TYPES.map(t => <SelectItem key={t.value} value={t.value}>{t.label}</SelectItem>)}</SelectContent></Select></div>
129
236
  <div className="space-y-2"><Label>Model</Label><Input value={editData.model_config?.model || ''} onChange={e => setEditData({...editData, model_config: {...editData.model_config, model: e.target.value}})} /></div>
130
237
  <div className="space-y-2"><Label>Max Tokens</Label><Input type="number" value={editData.model_config?.max_tokens || ''} onChange={e => setEditData({...editData, model_config: {...editData.model_config, max_tokens: parseInt(e.target.value)}})} /></div>
@@ -136,6 +243,7 @@ export function AIAgentDetailPage() {
136
243
  <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
137
244
  <div className="space-y-2"><Label>Capabilities (JSON)</Label><Textarea value={editData.capabilities || '{}'} onChange={e => setEditData({...editData, capabilities: e.target.value})} rows={4} className="font-mono text-sm" /></div>
138
245
  <div className="space-y-2"><Label>Constraints (JSON)</Label><Textarea value={editData.constraints || '{}'} onChange={e => setEditData({...editData, constraints: e.target.value})} rows={4} className="font-mono text-sm" /></div>
246
+ <div className="space-y-2"><Label>Metadata (JSON)</Label><Textarea value={editData.metadata || '{}'} onChange={e => setEditData({...editData, metadata: e.target.value})} rows={4} className="font-mono text-sm" /></div>
139
247
  </div>
140
248
  <div className="flex items-center gap-2"><Checkbox id="active" checked={editData.is_active} onCheckedChange={c => setEditData({...editData, is_active: c === true})} /><Label htmlFor="active">Active</Label></div>
141
249
  </CardContent></Card>
@@ -159,3 +267,4 @@ export function AIAgentDetailPage() {
159
267
  </div>
160
268
  )
161
269
  }
270
+ // CIL[END chunk_id="aiagentdetailpage_function_aiagentdetailpage_1783668265"]