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,239 +1,54 @@
1
- /**
2
- * @module src/pages/admin/EmbeddingsPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Admin list page for embedding model configurations. Fetches all models
8
- * via `/api/embeddings?action=list`, applies client-side search, provider
9
- * filter (`openai` | `anthropic` | `local` | `custom`), and sort. Renders
10
- * inside `AdminListPage`. Row clicks navigate to
11
- * `/spine-framework/admin/configs/embeddings/:id`.
12
- *
13
- * @seeAlso src/pages/admin/EmbeddingDetailPage.tsx
14
- */
15
-
16
1
  import { useState } from 'react'
17
2
  import { useNavigate } from 'react-router-dom'
18
- import { Box, FileText, CheckCircle, BarChart3 } from 'lucide-react';
19
- import { formatDateTime, formatFileSize } from '../../lib/utils'
3
+ import { FileText, CheckCircle, XCircle, AlertCircle } from 'lucide-react'
4
+ import { formatDateTime } from '../../lib/utils'
20
5
  import { AdminListPage } from '../../components/admin/AdminListPage'
21
6
  import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
22
- import { Badge } from '../../components/ui/badge'
23
7
  import { useApi } from '../../hooks/useApi'
24
8
  import { apiFetch } from '../../lib/api'
9
+ import { PageInstructions } from '../../components/admin/PageInstructions'
25
10
 
26
- interface EmbeddingModel {
11
+ interface EmbeddingRecord {
27
12
  id: string
28
- name: string
29
- description?: string
30
- model_name: string
31
- provider: 'openai' | 'anthropic' | 'local' | 'custom'
32
- config: {
33
- dimension: number
34
- chunk_size: number
35
- overlap: number
36
- batch_size: number
37
- }
38
- is_active: boolean
39
- created_at: string
40
- updated_at: string
41
- created_by: string
42
13
  account_id: string
43
- document_count: number
44
- embedding_count: number
45
- storage_size: number
46
- }
47
-
48
- interface EmbeddingDocument {
49
- id: string
50
14
  model_id: string
51
- title: string
52
- content_type: string
53
- status: 'pending' | 'processing' | 'completed' | 'failed'
54
- chunk_count: number
55
- embedding_count: number
15
+ document_id: string
16
+ chunk_index: number
17
+ content: string
18
+ embedding: number[]
19
+ metadata: Record<string, any> | null
20
+ approved_at: string | null
21
+ revoked_at: string | null
22
+ content_hash: string
56
23
  created_at: string
57
24
  updated_at: string
58
- created_by: string
59
- error?: string
60
- }
61
-
62
- interface EmbeddingSearch {
63
- query: string
64
- results: Array<{
65
- document_id: string
66
- document_title: string
67
- chunk_content: string
68
- similarity_score: number
69
- chunk_index: number
70
- }>
71
- search_time: number
72
- total_results: number
73
25
  }
74
26
 
75
27
  export function EmbeddingsPage() {
76
28
  const navigate = useNavigate()
77
29
  const [searchTerm, setSearchTerm] = useState('')
78
- const [selectedProvider, setSelectedProvider] = useState('all')
79
- const [selectedStatus, setSelectedStatus] = useState('all')
80
- const [sortKey, setSortKey] = useState('name')
81
- const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')
30
+ const [sortKey, setSortKey] = useState<string>('created_at')
31
+ const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc')
82
32
 
83
- // Fetch embeddings from API
84
- const { data: embeddings, loading, error, refetch } = useApi<any[]>(
33
+ const { data: records, loading, error, refetch } = useApi<EmbeddingRecord[]>(
85
34
  async () => {
86
- try {
87
- console.log('Fetching embeddings...')
88
- const response = await apiFetch('/api/embeddings?action=list')
89
- console.log('Response status:', response.status)
90
-
91
- if (!response.ok) {
92
- console.error('Response not ok:', response.statusText)
93
- throw new Error(`Failed to fetch embeddings: ${response.statusText}`)
94
- }
95
-
96
- const result = await response.json()
97
- console.log('Raw API result:', result)
98
-
99
- // Handle both nested and direct responses
100
- const embeddings = result.data || result
101
- console.log('Embeddings after processing:', embeddings)
102
-
103
- return embeddings
104
- } catch (error) {
105
- console.error('Error in EmbeddingsPage:', error)
106
- throw error
107
- }
35
+ const response = await apiFetch('/api/embeddings?method=GET&action=list')
36
+ if (!response.ok) throw new Error('Failed to fetch embeddings')
37
+ const result = await response.json()
38
+ return (result.data || result) as EmbeddingRecord[]
108
39
  },
109
40
  { immediate: true }
110
41
  )
111
42
 
112
- const mockDocuments: EmbeddingDocument[] = [
113
- {
114
- id: '1',
115
- model_id: '1',
116
- title: 'User Guide - Getting Started',
117
- content_type: 'pdf',
118
- status: 'completed',
119
- chunk_count: 45,
120
- embedding_count: 45,
121
- created_at: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5).toISOString(),
122
- updated_at: new Date(Date.now() - 1000 * 60 * 60 * 4).toISOString(),
123
- created_by: 'Jane Smith'
124
- },
125
- {
126
- id: '2',
127
- model_id: '1',
128
- title: 'API Documentation',
129
- content_type: 'markdown',
130
- status: 'processing',
131
- chunk_count: 67,
132
- embedding_count: 0,
133
- created_at: new Date(Date.now() - 1000 * 60 * 60 * 2).toISOString(),
134
- updated_at: new Date(Date.now() - 1000 * 60 * 60 * 1).toISOString(),
135
- created_by: 'John Doe'
136
- },
137
- {
138
- id: '3',
139
- model_id: '2',
140
- title: 'React Components Library',
141
- content_type: 'code',
142
- status: 'completed',
143
- chunk_count: 234,
144
- embedding_count: 234,
145
- created_at: new Date(Date.now() - 1000 * 60 * 60 * 24 * 3).toISOString(),
146
- updated_at: new Date(Date.now() - 1000 * 60 * 60 * 2).toISOString(),
147
- created_by: 'Mike Johnson'
148
- },
149
- {
150
- id: '4',
151
- model_id: '1',
152
- title: 'Company Policies',
153
- content_type: 'docx',
154
- status: 'failed',
155
- chunk_count: 0,
156
- embedding_count: 0,
157
- created_at: new Date(Date.now() - 1000 * 60 * 60 * 24).toISOString(),
158
- updated_at: new Date(Date.now() - 1000 * 60 * 60 * 23).toISOString(),
159
- created_by: 'Admin',
160
- error: 'Document format not supported'
161
- }
162
- ]
163
-
164
- const mockSearchResults: EmbeddingSearch = {
165
- query: 'how to reset password',
166
- results: [
167
- {
168
- document_id: '1',
169
- document_title: 'User Guide - Getting Started',
170
- chunk_content: 'To reset your password, go to the settings page and click on "Reset Password"...',
171
- similarity_score: 0.95,
172
- chunk_index: 12
173
- },
174
- {
175
- document_id: '1',
176
- document_title: 'User Guide - Getting Started',
177
- chunk_content: 'Password reset emails are sent to your registered email address...',
178
- similarity_score: 0.87,
179
- chunk_index: 13
180
- },
181
- {
182
- document_id: '3',
183
- document_title: 'React Components Library',
184
- chunk_content: 'The PasswordReset component handles user password reset functionality...',
185
- similarity_score: 0.72,
186
- chunk_index: 45
187
- }
188
- ],
189
- search_time: 0.234,
190
- total_results: 3
191
- }
192
-
193
- const providers = [
194
- { value: 'all', label: 'All Providers' },
195
- { value: 'openai', label: 'OpenAI' },
196
- { value: 'anthropic', label: 'Anthropic' },
197
- { value: 'local', label: 'Local' },
198
- { value: 'custom', label: 'Custom' }
199
- ]
200
-
201
- const statusOptions = [
202
- { value: 'all', label: 'All Statuses' },
203
- { value: 'active', label: 'Active' },
204
- { value: 'inactive', label: 'Inactive' }
205
- ]
206
-
207
- const filteredModels = (embeddings || []).filter(embedding => {
208
- const matchesSearch = embedding.content?.toLowerCase().includes(searchTerm.toLowerCase()) ||
209
- (embedding.metadata?.source && embedding.metadata.source.toLowerCase().includes(searchTerm.toLowerCase()))
210
- const matchesProvider = selectedProvider === 'all' || embedding.metadata?.source === selectedProvider
211
- const matchesStatus = selectedStatus === 'all' ||
212
- (selectedStatus === 'active' && true) || // All embeddings are considered active
213
- (selectedStatus === 'inactive' && false)
214
- return matchesSearch && matchesProvider && matchesStatus
43
+ const filteredRecords = (records || []).filter((record) => {
44
+ const term = searchTerm.toLowerCase()
45
+ return (
46
+ (record.content?.toLowerCase().includes(term) || false) ||
47
+ (record.document_id?.toLowerCase().includes(term) || false) ||
48
+ (record.model_id?.toLowerCase().includes(term) || false)
49
+ )
215
50
  })
216
51
 
217
- // Helper functions
218
- const getProviderBadgeColor = (provider: string) => {
219
- switch (provider) {
220
- case 'openai':
221
- return 'bg-green-100 text-green-800'
222
- case 'anthropic':
223
- return 'bg-blue-100 text-blue-800'
224
- case 'local':
225
- return 'bg-purple-100 text-purple-800'
226
- case 'custom':
227
- return 'bg-orange-100 text-orange-800'
228
- default:
229
- return 'bg-slate-100 text-slate-800'
230
- }
231
- }
232
-
233
- const getStatusBadgeColor = (isActive: boolean) => {
234
- return isActive ? 'bg-green-100 text-green-800' : 'bg-slate-100 text-slate-800'
235
- }
236
-
237
52
  const handleSort = (key: string) => {
238
53
  if (sortKey === key) {
239
54
  setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc')
@@ -243,121 +58,121 @@ export function EmbeddingsPage() {
243
58
  }
244
59
  }
245
60
 
246
- const handleRowClick = (model: EmbeddingModel) => {
247
- navigate(`/spine-framework/admin/configs/embeddings/${model.id}`)
248
- }
61
+ const sortedRecords = [...filteredRecords].sort((a, b) => {
62
+ const aValue: any = a[sortKey as keyof EmbeddingRecord]
63
+ const bValue: any = b[sortKey as keyof EmbeddingRecord]
249
64
 
250
- // Sort models
251
- const sortedModels = [...filteredModels].sort((a, b) => {
252
- let aValue: any = a[sortKey as keyof EmbeddingModel]
253
- let bValue: any = b[sortKey as keyof EmbeddingModel]
254
-
65
+ if (aValue == null || bValue == null) return 0
255
66
  if (typeof aValue === 'string') {
256
- return sortDirection === 'asc'
67
+ return sortDirection === 'asc'
257
68
  ? aValue.localeCompare(bValue)
258
69
  : bValue.localeCompare(aValue)
259
70
  }
260
-
261
71
  if (typeof aValue === 'number') {
262
- return sortDirection === 'asc' ? aValue - bValue : bValue - aValue
72
+ return sortDirection === 'asc'
73
+ ? aValue - bValue
74
+ : bValue - aValue
263
75
  }
264
-
265
76
  return 0
266
77
  })
267
78
 
79
+ const getStatus = (record: EmbeddingRecord) => {
80
+ if (record.revoked_at) return { label: 'Revoked', color: 'bg-red-100 text-red-700' }
81
+ if (record.approved_at) return { label: 'Approved', color: 'bg-green-100 text-green-700' }
82
+ return { label: 'Pending', color: 'bg-slate-100 text-slate-600' }
83
+ }
84
+
268
85
  const statsCards = [
269
86
  {
270
- title: 'Total Embeddings',
271
- value: (embeddings || []).length,
87
+ title: 'Total Records',
88
+ value: (records || []).length,
272
89
  icon: FileText,
273
- iconColor: 'text-blue-500'
90
+ iconColor: 'text-blue-600'
274
91
  },
275
92
  {
276
- title: 'Active',
277
- value: (embeddings || []).filter(m => m.is_active).length,
93
+ title: 'Approved',
94
+ value: (records || []).filter(r => r.approved_at && !r.revoked_at).length,
278
95
  icon: CheckCircle,
279
- iconColor: 'text-green-500'
96
+ iconColor: 'text-green-600'
280
97
  },
281
98
  {
282
- title: 'Documents Processed',
283
- value: (embeddings || []).length, // Simplified count since embeddings table structure is different
284
- icon: BarChart3,
285
- iconColor: 'text-orange-500'
286
- },
287
- {
288
- title: 'Last Updated',
289
- value: (embeddings || []).length > 0 ? 'Just now' : 'Never',
290
- icon: Box,
291
- iconColor: 'text-purple-500'
292
- }
293
- ]
294
-
295
- const filters = [
296
- {
297
- label: 'Provider',
298
- value: selectedProvider,
299
- options: providers,
300
- onChange: setSelectedProvider
301
- },
302
- {
303
- label: 'Status',
304
- value: selectedStatus,
305
- options: statusOptions,
306
- onChange: setSelectedStatus
99
+ title: 'Revoked',
100
+ value: (records || []).filter(r => r.revoked_at).length,
101
+ icon: XCircle,
102
+ iconColor: 'text-red-600'
307
103
  }
308
104
  ]
309
105
 
310
106
  return (
311
107
  <AdminListPage
312
108
  title="Embeddings"
313
- description="Manage embedding models and document indexes"
314
- newButtonText="New Model"
315
- newButtonHref="/spine-framework/admin/configs/embeddings/new"
109
+ description="Inspect runtime vector records from the public.embeddings table"
110
+ noPageInstructions
316
111
  statsCards={statsCards}
317
- searchPlaceholder="Search models..."
112
+ searchPlaceholder="Search by content, document, or model..."
318
113
  searchValue={searchTerm}
319
114
  onSearchChange={setSearchTerm}
320
- filters={filters}
321
- loading={false}
322
- emptyMessage="No embedding models found"
323
- emptyIcon={FileText}
115
+ loading={loading}
116
+ error={error}
117
+ onRetry={refetch}
118
+ emptyMessage="No embedding records found"
119
+ emptyIcon={AlertCircle}
324
120
  >
325
- {sortedModels.length === 0 ? (
121
+ <PageInstructions
122
+ title="About the embeddings table"
123
+ description="These are runtime vector records stored in public.embeddings. Each record is a chunk of content with its embedding, model, document, and lifecycle metadata. This page is read-only."
124
+ sections={[
125
+ {
126
+ title: 'Columns',
127
+ content: 'Model ID, Document ID, chunk index, truncated content, approval status, content hash, and creation time.'
128
+ },
129
+ {
130
+ title: 'Searching',
131
+ content: 'Use the search field to filter by content text, document_id, or model_id.'
132
+ },
133
+ {
134
+ title: 'Drilling down',
135
+ content: 'Click any row to view the full record, including the full content, metadata JSON, and embedding vector.'
136
+ }
137
+ ]}
138
+ />
139
+
140
+ {sortedRecords.length === 0 ? (
326
141
  <div className="p-8 text-center">
327
- <FileText className="mx-auto h-12 w-12 text-slate-400" />
328
- <h3 className="mt-2 text-sm font-medium text-slate-900">No models found</h3>
329
- <p className="mt-1 text-sm text-slate-500">
330
- Try adjusting your search or filters
331
- </p>
142
+ <AlertCircle className="mx-auto h-12 w-12 text-slate-400" />
143
+ <h3 className="mt-2 text-sm font-medium text-slate-900">No embedding records found</h3>
144
+ <p className="mt-1 text-sm text-slate-500">Try adjusting your search</p>
332
145
  </div>
333
146
  ) : (
334
147
  <table className="min-w-full divide-y divide-slate-200">
335
148
  <thead className="bg-slate-50">
336
149
  <tr>
337
150
  <SortableTableHeader
338
- title="Content"
339
- sortKey="content"
151
+ title="Model ID"
152
+ sortKey="model_id"
340
153
  currentSortKey={sortKey}
341
154
  currentSortDirection={sortDirection}
342
155
  onSort={handleSort}
343
156
  />
344
157
  <SortableTableHeader
345
- title="Source/Type"
346
- sortKey="metadata.source"
158
+ title="Document ID"
159
+ sortKey="document_id"
347
160
  currentSortKey={sortKey}
348
161
  currentSortDirection={sortDirection}
349
162
  onSort={handleSort}
350
163
  />
351
164
  <SortableTableHeader
352
- title="Status"
353
- sortKey="status"
165
+ title="Chunk Index"
166
+ sortKey="chunk_index"
354
167
  currentSortKey={sortKey}
355
168
  currentSortDirection={sortDirection}
356
169
  onSort={handleSort}
357
170
  />
171
+ <th className="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-slate-500">Content</th>
172
+ <th className="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-slate-500">Status</th>
358
173
  <SortableTableHeader
359
- title="Dimensions"
360
- sortKey="embedding"
174
+ title="Content Hash"
175
+ sortKey="content_hash"
361
176
  currentSortKey={sortKey}
362
177
  currentSortDirection={sortDirection}
363
178
  onSort={handleSort}
@@ -372,50 +187,32 @@ export function EmbeddingsPage() {
372
187
  </tr>
373
188
  </thead>
374
189
  <tbody className="bg-white divide-y divide-slate-200">
375
- {sortedModels.map((model) => (
376
- <tr
377
- key={model.id}
378
- className="hover:bg-slate-50 cursor-pointer transition-colors"
379
- onClick={() => handleRowClick(model)}
380
- >
381
- <td className="px-6 py-4 whitespace-nowrap">
382
- <div>
383
- <div className="font-medium text-slate-900">
384
- <span className="text-accent-blue hover:text-navy">
385
- {model.content?.substring(0, 60)}...
386
- </span>
387
- </div>
388
- <div className="text-sm text-slate-500">
389
- Chunk {model.chunk_index} • {model.metadata?.type}
390
- </div>
391
- </div>
392
- </td>
393
- <td className="px-6 py-4 whitespace-nowrap">
394
- <div className="space-y-1">
395
- <Badge variant={getProviderBadgeColor(model.metadata?.source) as any}>
396
- {model.metadata?.source}
397
- </Badge>
398
- <div className="text-sm text-slate-900 font-mono">{model.metadata?.language}</div>
399
- </div>
400
- </td>
401
- <td className="px-6 py-4 whitespace-nowrap">
402
- <Badge variant="success">
403
- Active
404
- </Badge>
405
- </td>
406
- <td className="px-6 py-4 whitespace-nowrap">
407
- <div>
408
- <div className="text-sm text-slate-900">1 chunk</div>
409
- <div className="text-xs text-slate-500">
410
- {model.embedding?.length} dimensions
190
+ {sortedRecords.map((record) => {
191
+ const status = getStatus(record)
192
+ return (
193
+ <tr
194
+ key={record.id}
195
+ className="hover:bg-slate-50 cursor-pointer transition-colors"
196
+ onClick={() => navigate(`/spine-framework/admin/kb/embeddings/${record.id}`)}
197
+ >
198
+ <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-900">{record.model_id}</td>
199
+ <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-500">{record.document_id}</td>
200
+ <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-500">{record.chunk_index}</td>
201
+ <td className="px-6 py-4 text-sm text-slate-600 max-w-md">
202
+ <div className="truncate">
203
+ {record.content?.slice(0, 80)}{record.content && record.content.length > 80 ? '...' : ''}
411
204
  </div>
412
- </div>
413
- </td>
414
- <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-500">
415
- {formatDateTime(model.created_at)}
416
- </td>
417
- </tr>
418
- ))}
205
+ </td>
206
+ <td className="px-6 py-4 whitespace-nowrap">
207
+ <span className={`inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium ${status.color}`}>
208
+ {status.label}
209
+ </span>
210
+ </td>
211
+ <td className="px-6 py-4 whitespace-nowrap text-xs text-slate-500 font-mono">{record.content_hash}</td>
212
+ <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-500">{formatDateTime(record.created_at)}</td>
213
+ </tr>
214
+ )
215
+ })}
419
216
  </tbody>
420
217
  </table>
421
218
  )}
@@ -1,12 +1,22 @@
1
- /**
2
- * @module src/pages/admin/ExtendedShadcnTestPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability testing
6
- *
7
- * Extended test page with more shadcn components to identify problematic imports.
8
- */
9
1
 
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="extendedshadcntestpage_module_header_1783668992" type="module_header" identity="module_header" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import dependencies for ExtendedShadcnTestPage component"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React hooks and UI components for testing"]
8
+ // CIL[DOC-CONTEXT module="ExtendedShadcnTestPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.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 and shadcn 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, .framework/src/components/ui/table-primitives.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.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"]
10
20
  import { useState } from 'react'
11
21
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'
12
22
  import { Button } from '../../components/ui/button'
@@ -21,7 +31,21 @@ import {
21
31
  SelectValue,
22
32
  } from '../../components/ui/select'
23
33
  import { Checkbox } from '../../components/ui/checkbox'
24
-
34
+ // CIL[END chunk_id="extendedshadcntestpage_module_header_1783668992"]
35
+ // CIL[BEGIN chunk_id="extendedshadcntestpage_extendedshadcntestpage_1783668992" type="function" identity="ExtendedShadcnTestPage" parent="none"]
36
+ // CIL[DOC-MACRO purpose="Main ExtendedShadcnTestPage component implementation"]
37
+ // CIL[DOC-RESPONSIBILITY responsibility="Render comprehensive shadcn UI component testing interface"]
38
+ // CIL[DOC-CONTEXT module="ExtendedShadcnTestPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
39
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="none" side_effects="State management"]
40
+ // CIL[DOC-MICRO logic_summary="Creates interactive test page for 7 shadcn components with state management" notable_decisions="[]"]
41
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
42
+ // CIL[DOC-STABILITY stability="stable"]
43
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
44
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
45
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
46
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
47
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
48
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
25
49
  export function ExtendedShadcnTestPage() {
26
50
  const [count, setCount] = useState(0)
27
51
  const [text, setText] = useState('')
@@ -174,3 +198,4 @@ export function ExtendedShadcnTestPage() {
174
198
  </div>
175
199
  )
176
200
  }
201
+ // CIL[END chunk_id="extendedshadcntestpage_extendedshadcntestpage_1783668992"]
@@ -1,19 +1,43 @@
1
- /**
2
- * @module src/pages/admin/IncrementalShadcnTestPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability testing
6
- *
7
- * Incremental test page to identify problematic shadcn component imports.
8
- */
9
1
 
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="incrementalshadcntestpage_module_header_1783668992" type="module_header" identity="module_header" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import dependencies for IncrementalShadcnTestPage component"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React hooks and basic UI components for testing"]
8
+ // CIL[DOC-CONTEXT module="IncrementalShadcnTestPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.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 and basic shadcn 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, .framework/src/components/ui/table-primitives.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.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"]
10
20
  import { useState } from 'react'
11
21
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'
12
22
  import { Button } from '../../components/ui/button'
13
23
  import { Badge } from '../../components/ui/badge'
14
24
  import { Input } from '../../components/ui/input'
15
25
  import { Label } from '../../components/ui/label'
16
-
26
+ // CIL[END chunk_id="incrementalshadcntestpage_module_header_1783668992"]
27
+ // CIL[BEGIN chunk_id="incrementalshadcntestpage_incrementalshadcntestpage_1783668992" type="function" identity="IncrementalShadcnTestPage" parent="none"]
28
+ // CIL[DOC-MACRO purpose="Main IncrementalShadcnTestPage component implementation"]
29
+ // CIL[DOC-RESPONSIBILITY responsibility="Render basic shadcn UI component testing interface"]
30
+ // CIL[DOC-CONTEXT module="IncrementalShadcnTestPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
31
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="none" side_effects="State management"]
32
+ // CIL[DOC-MICRO logic_summary="Creates interactive test page for 4 basic shadcn components with state management" 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: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.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"]
17
41
  export function IncrementalShadcnTestPage() {
18
42
  const [count, setCount] = useState(0)
19
43
  const [text, setText] = useState('')
@@ -107,3 +131,4 @@ export function IncrementalShadcnTestPage() {
107
131
  </div>
108
132
  )
109
133
  }
134
+ // CIL[END chunk_id="incrementalshadcntestpage_incrementalshadcntestpage_1783668992"]