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,19 +1,21 @@
1
- /**
2
- * @module src/pages/admin/TypesPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Admin list page for item/account/person types. Fetches all types via
8
- * `/api/types?action=list`, then applies client-side search, category
9
- * filter (`all` | `system` | `custom` | `active`), and sort. Renders
10
- * inside `AdminListPage` with four stat cards and a sortable table.
11
- * Row clicks navigate to `/spine-framework/admin/configs/types/:id`.
12
- *
13
- * @seeAlso src/components/admin/AdminListPage.tsx
14
- * @seeAlso src/pages/admin/TypeDetailPage.tsx
15
- */
16
1
 
2
+
3
+
4
+ // CIL[BEGIN chunk_id="typespage_moduleheader_1783664706" type="module_header" identity="module_header" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import dependencies for TypesPage component"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide all external dependencies and UI components"]
7
+ // CIL[DOC-CONTEXT module="TypesPage" layer="frontend-page" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="React components and utilities" errors="none" side_effects="none"]
9
+ // CIL[DOC-MICRO logic_summary="Imports React hooks, API utilities, icons, and UI 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-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/portal/pages/CoursesPage.tsx, \."]
14
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
15
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
16
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
17
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
18
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
17
19
  import React, { useState } from 'react'
18
20
  import { useApi } from '../../hooks/useApi'
19
21
  import { apiFetch } from '../../lib/api'
@@ -30,7 +32,21 @@ import { Button } from '../../components/ui/button'
30
32
  import { AdminListPage } from '../../components/admin/AdminListPage'
31
33
  import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
32
34
  import { formatDateTime } from '../../lib/utils'
33
-
35
+ // CIL[END chunk_id="typespage_moduleheader_1783664706"]
36
+ // CIL[BEGIN chunk_id="typespage_type_1783664706" type="interface" identity="Type" parent="none"]
37
+ // CIL[DOC-MACRO purpose="Define the Type data structure for type management"]
38
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide type definition for item/account/person types"]
39
+ // CIL[DOC-CONTEXT module="TypesPage" layer="frontend-page" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
40
+ // CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
41
+ // CIL[DOC-MICRO logic_summary="Defines comprehensive type structure with metadata and schema" notable_decisions="[]"]
42
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
43
+ // CIL[DOC-STABILITY stability="stable"]
44
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.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"]
34
50
  interface Type {
35
51
  id: string
36
52
  name: string
@@ -54,14 +70,27 @@ interface Type {
54
70
  app_id?: string | null
55
71
  app?: any
56
72
  }
57
-
73
+ // CIL[END chunk_id="typespage_type_1783664706"]
74
+ // CIL[BEGIN chunk_id="typespage_typespage_1783664706" type="function" identity="TypesPage" parent="none"]
75
+ // CIL[DOC-MACRO purpose="Admin list page for managing item/account/person types"]
76
+ // CIL[DOC-RESPONSIBILITY responsibility="Fetch, filter, sort, and display types with navigation"]
77
+ // CIL[DOC-CONTEXT module="TypesPage" layer="frontend-page" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\"\\\"]"]
78
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component with type list" errors="API failures" side_effects="API calls, navigation"]
79
+ // CIL[DOC-MICRO logic_summary="Client-side filtering, sorting, and stats calculation for types" notable_decisions="[]"]
80
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
81
+ // CIL[DOC-STABILITY stability="stable"]
82
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/CoursesPage.tsx, \."]
83
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
84
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
85
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
86
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
87
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
58
88
  export function TypesPage() {
59
89
  const [searchTerm, setSearchTerm] = useState('')
60
90
  const [selectedCategory, setSelectedCategory] = useState('all')
61
91
  const [sortKey, setSortKey] = useState('name')
62
92
  const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')
63
93
 
64
- // Fetch types from API
65
94
  const { data: types, loading, error, refetch } = useApi<Type[]>(
66
95
  async ({ signal }: { signal?: AbortSignal }) => {
67
96
  const response = await apiFetch('/api/types?action=list', { signal })
@@ -95,7 +124,6 @@ export function TypesPage() {
95
124
  return matchesSearch && matchesCategory
96
125
  })
97
126
 
98
- // Helper functions
99
127
  const getCategoryBadgeColor = (type: Type) => {
100
128
  if (type.ownership === 'system') {
101
129
  return 'bg-purple-50 text-purple-700'
@@ -122,7 +150,6 @@ export function TypesPage() {
122
150
  window.location.href = `/spine-framework/admin/configs/types/${type.id}`
123
151
  }
124
152
 
125
- // Sort types
126
153
  const sortedTypes = [...(filteredTypes || [])].sort((a, b) => {
127
154
  let aValue: any = a[sortKey as keyof Type]
128
155
  let bValue: any = b[sortKey as keyof Type]
@@ -293,3 +320,4 @@ export function TypesPage() {
293
320
  </AdminListPage>
294
321
  )
295
322
  }
323
+ // CIL[END chunk_id="typespage_typespage_1783664706"]
@@ -0,0 +1,465 @@
1
+ // CIL[BEGIN chunk_id="cilagentpage_module_header_1784193942" type="module_header" identity="module_header" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Import dependencies and icons for the CIL agent page"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provides module imports and icon references used by the page"]
4
+ // CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\"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\",\"\\\"]"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Sets up React hooks, router, apiFetch, app path hook, UI components, and lucide icons" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="developer"]
10
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: 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, \."]
11
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
12
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
13
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
14
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
15
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
16
+ import { useState, useRef, useEffect, useCallback } from 'react'
17
+ import { useParams } from 'react-router-dom'
18
+ import { apiFetch } from '@core/lib/api'
19
+ import { Button } from '@core/components/ui/button'
20
+ import { Textarea } from '@core/components/ui/textarea'
21
+ import { Badge } from '@core/components/ui/badge'
22
+ import { Skeleton } from '@core/components/ui/skeleton'
23
+ import {
24
+ Bot,
25
+ User,
26
+ ChevronRight,
27
+ Send,
28
+ RefreshCw,
29
+ Zap,
30
+ Wrench,
31
+ Code2,
32
+ AlertTriangle,
33
+ Plus,
34
+ FileCode2,
35
+ } from 'lucide-react'
36
+
37
+
38
+
39
+ import { PageInstructions } from '../../../components/admin/PageInstructions'
40
+ // CIL[END chunk_id="cilagentpage_module_header_1784193942"]
41
+ // CIL[BEGIN chunk_id="cilagentpage_message_1784193942" type="interface" identity="Message" parent="none"]
42
+ // CIL[DOC-MACRO purpose="Define the shape of a chat message"]
43
+ // CIL[DOC-RESPONSIBILITY responsibility="Declares the TypeScript interface for messages exchanged in the agent chat"]
44
+ // CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\".framework/functions/_shared/principal.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
45
+ // CIL[DOC-CONTRACT inputs="none" outputs="Message type contract" errors="none" side_effects="none"]
46
+ // CIL[DOC-MICRO logic_summary="Describes id, role, content, optional sources, tool_calls_made, and loading flag" notable_decisions="[]"]
47
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
48
+ // CIL[DOC-STABILITY stability="stable"]
49
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/principal.ts, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
50
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
51
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
52
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
53
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
54
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
55
+ interface Message {
56
+ id: string
57
+ role: 'user' | 'assistant' | 'system'
58
+ content: string
59
+ sources?: string[]
60
+ tool_calls_made?: string[]
61
+ loading?: boolean
62
+ }
63
+
64
+
65
+
66
+
67
+ // CIL[END chunk_id="cilagentpage_message_1784193942"]
68
+ // CIL[BEGIN chunk_id="cilagentpage_rendermarkdown_1784193942" type="function" identity="renderMarkdown" parent="none"]
69
+ // CIL[DOC-MACRO purpose="Render assistant message text with code blocks and inline formatting"]
70
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert plain text containing markdown-style formatting into React nodes"]
71
+ // CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
72
+ // CIL[DOC-CONTRACT inputs="none" outputs="React.ReactNode[]" errors="none" side_effects="none"]
73
+ // CIL[DOC-MICRO logic_summary="Splits on triple-backtick blocks, renders pre/code, then applies inline code, bold, and newline processing" notable_decisions="[]"]
74
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
75
+ // CIL[DOC-STABILITY stability="stable"]
76
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
77
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
78
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
79
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
80
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
81
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
82
+ function renderMarkdown(text: string): React.ReactNode[] {
83
+ const parts: React.ReactNode[] = []
84
+ let key = 0
85
+
86
+
87
+ const segments = text.split(/(```[\s\S]*?```)/g)
88
+ for (const seg of segments) {
89
+ if (seg.startsWith('```')) {
90
+ const lines = seg.slice(3, -3).split('\n')
91
+ const lang = lines[0].trim()
92
+ const code = lines.slice(lang ? 1 : 0).join('\n')
93
+ parts.push(
94
+ <pre key={key++} className="bg-slate-900 text-slate-100 rounded-md p-3 my-2 overflow-auto text-xs font-mono whitespace-pre">
95
+ {lang && <div className="text-slate-400 text-xs mb-1">{lang}</div>}
96
+ {code}
97
+ </pre>
98
+ )
99
+ } else {
100
+
101
+ const inline = seg.split(/(`[^`]+`|\*\*[^*]+\*\*|\n)/g).map((chunk, i) => {
102
+ if (chunk.startsWith('`') && chunk.endsWith('`')) {
103
+ return <code key={i} className="bg-muted px-1 py-0.5 rounded text-xs font-mono">{chunk.slice(1, -1)}</code>
104
+ }
105
+ if (chunk.startsWith('**') && chunk.endsWith('**')) {
106
+ return <strong key={i}>{chunk.slice(2, -2)}</strong>
107
+ }
108
+ if (chunk === '\n') return <br key={i} />
109
+ return chunk
110
+ })
111
+ parts.push(<span key={key++}>{inline}</span>)
112
+ }
113
+ }
114
+ return parts
115
+ }
116
+
117
+
118
+
119
+ // CIL[END chunk_id="cilagentpage_rendermarkdown_1784193942"]
120
+ // CIL[BEGIN chunk_id="cilagentpage_messagebubble_1784193942" type="function" identity="MessageBubble" parent="none"]
121
+ // CIL[DOC-MACRO purpose="Render a single chat message bubble with metadata chips"]
122
+ // CIL[DOC-RESPONSIBILITY responsibility="Display a user or assistant message, loading skeleton, and source or tool chips"]
123
+ // CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
124
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="none" side_effects="none"]
125
+ // CIL[DOC-MICRO logic_summary="Determines user vs assistant layout, calls renderMarkdown for assistant content, and links to source chunks" notable_decisions="[]"]
126
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
127
+ // CIL[DOC-STABILITY stability="stable"]
128
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
129
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
130
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
131
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
132
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
133
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
134
+ function MessageBubble({ message, projectId, appPath }: {
135
+ message: Message
136
+ projectId: string
137
+ appPath: (p: string) => string
138
+ }) {
139
+ const isUser = message.role === 'user'
140
+
141
+ if (message.loading) {
142
+ return (
143
+ <div className="flex items-start gap-2.5">
144
+ <div className="h-6 w-6 rounded-full bg-indigo-100 flex items-center justify-center shrink-0 mt-0.5">
145
+ <Bot className="h-3.5 w-3.5 text-indigo-600" />
146
+ </div>
147
+ <div className="flex-1 space-y-1.5 pt-0.5">
148
+ <Skeleton className="h-3 w-48" />
149
+ <Skeleton className="h-3 w-64" />
150
+ <Skeleton className="h-3 w-40" />
151
+ </div>
152
+ </div>
153
+ )
154
+ }
155
+
156
+ return (
157
+ <div className={`flex items-start gap-2.5 ${isUser ? 'flex-row-reverse' : ''}`}>
158
+ <div className={`h-6 w-6 rounded-full flex items-center justify-center shrink-0 mt-0.5 ${isUser ? 'bg-slate-200' : 'bg-indigo-100'}`}>
159
+ {isUser
160
+ ? <User className="h-3.5 w-3.5 text-slate-600" />
161
+ : <Bot className="h-3.5 w-3.5 text-indigo-600" />
162
+ }
163
+ </div>
164
+
165
+ <div className={`flex-1 min-w-0 ${isUser ? 'items-end' : 'items-start'} flex flex-col`}>
166
+ <div className={`rounded-xl px-3.5 py-2.5 max-w-[85%] text-sm leading-relaxed ${
167
+ isUser
168
+ ? 'bg-slate-900 text-white rounded-tr-sm'
169
+ : 'bg-muted rounded-tl-sm'
170
+ }`}>
171
+ {isUser
172
+ ? <span className="whitespace-pre-wrap">{message.content}</span>
173
+ : <div className="prose-sm">{renderMarkdown(message.content)}</div>
174
+ }
175
+ </div>
176
+
177
+ {}
178
+ {!isUser && (message.tool_calls_made?.length || message.sources?.length) ? (
179
+ <div className="flex flex-wrap gap-1.5 mt-1.5 ml-0.5">
180
+ {(message.tool_calls_made || []).map((tc, i) => (
181
+ <span key={`tc-${tc}-${i}`} className="inline-flex items-center gap-1 text-xs bg-amber-50 border border-amber-200 text-amber-700 rounded-full px-2 py-0.5">
182
+ <Wrench className="h-2.5 w-2.5" /> {tc}
183
+ </span>
184
+ ))}
185
+ {(message.sources || []).map((src, i) => (
186
+ <a
187
+ key={`src-${src}-${i}`}
188
+ href={appPath(projectId ? `/cil/${projectId}/chunks/${src}` : `/cil/chunks/${src}`)}
189
+ className="inline-flex items-center gap-1 text-xs bg-indigo-50 border border-indigo-200 text-indigo-700 rounded-full px-2 py-0.5 hover:bg-indigo-100 transition-colors"
190
+ title={`Open chunk: ${src}`}
191
+ >
192
+ <Code2 className="h-2.5 w-2.5" /> {src}
193
+ </a>
194
+ ))}
195
+ </div>
196
+ ) : null}
197
+ </div>
198
+ </div>
199
+ )
200
+ }
201
+
202
+
203
+
204
+ // CIL[END chunk_id="cilagentpage_messagebubble_1784193942"]
205
+ // CIL[BEGIN chunk_id="cilagentpage_suggestions_1784193942" type="constant" identity="SUGGESTIONS" parent="none"]
206
+ // CIL[DOC-MACRO purpose="Provide default example questions for the CIL agent chat"]
207
+ // CIL[DOC-RESPONSIBILITY responsibility="Supplies a constant list of sample user queries for the empty state"]
208
+ // CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
209
+ // CIL[DOC-CONTRACT inputs="none" outputs="readonly string[]" errors="none" side_effects="none"]
210
+ // CIL[DOC-MICRO logic_summary="Array of natural-language questions covering auth, embeddings, refactoring, and undocumented chunks" notable_decisions="[]"]
211
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
212
+ // CIL[DOC-STABILITY stability="stable"]
213
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
214
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
215
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
216
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
217
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
218
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
219
+ const SUGGESTIONS = [
220
+ 'What does the authentication middleware do?',
221
+ 'Which functions write to the embeddings table?',
222
+ 'Is it safe to refactor the createHandler function?',
223
+ 'What are the side effects of the runAgent function?',
224
+ 'Which chunks have no callers (potential dead code)?',
225
+ 'Show me undocumented chunks in this project',
226
+ ]
227
+
228
+
229
+
230
+ // CIL[END chunk_id="cilagentpage_suggestions_1784193942"]
231
+ // CIL[BEGIN chunk_id="cilagentpage_cilagentpage_1784193942" type="component" identity="CILAgentPage" parent="none"]
232
+ // CIL[DOC-MACRO purpose="Render the interactive CIL agent chat page"]
233
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage chat state, send questions to the CIL agent API, and render the conversation UI"]
234
+ // CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[]"]
235
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="Displays API errors as assistant messages" side_effects="Calls /api/cil-agent and /api/cil-project; updates messages and input state"]
236
+ // CIL[DOC-MICRO logic_summary="Loads project title, maintains messages/input/sending refs, sends messages via apiFetch, scrolls to bottom, and renders messages and input area" notable_decisions="[]"]
237
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
238
+ // CIL[DOC-STABILITY stability="stable"]
239
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
240
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
241
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
242
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
243
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
244
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
245
+ export default function CILAgentPage() {
246
+ const { id: projectId } = useParams<{ id: string }>()
247
+ const appPath = (path: string) => '/spine-framework/admin' + (path.startsWith('/') ? path : '/' + path)
248
+ const [messages, setMessages] = useState<Message[]>([])
249
+ const [input, setInput] = useState('')
250
+ const [sending, setSending] = useState(false)
251
+ const [projectTitle, setProjectTitle] = useState('')
252
+ const bottomRef = useRef<HTMLDivElement>(null)
253
+ const textareaRef = useRef<HTMLTextAreaElement>(null)
254
+
255
+
256
+ useEffect(() => {
257
+ if (!projectId) return
258
+ apiFetch(`/api/cil-project?action=get&id=${projectId}`)
259
+ .then(r => r.json())
260
+ .then(data => {
261
+ const p = data?.project || data?.data?.project
262
+ if (p?.title) setProjectTitle(p.title)
263
+ })
264
+ .catch(() => {})
265
+ }, [projectId])
266
+
267
+
268
+ useEffect(() => {
269
+ bottomRef.current?.scrollIntoView({ behavior: 'smooth' })
270
+ }, [messages])
271
+
272
+ const sendMessage = useCallback(async (text: string) => {
273
+ if (!text.trim() || sending) return
274
+
275
+ const userMsg: Message = {
276
+ id: crypto.randomUUID(),
277
+ role: 'user',
278
+ content: text.trim(),
279
+ }
280
+ const loadingMsg: Message = {
281
+ id: crypto.randomUUID(),
282
+ role: 'assistant',
283
+ content: '',
284
+ loading: true,
285
+ }
286
+
287
+ setMessages(prev => [...prev, userMsg, loadingMsg])
288
+ setInput('')
289
+ setSending(true)
290
+
291
+ try {
292
+ const res = await apiFetch('/api/cil-agent?action=ask', {
293
+ method: 'POST',
294
+ headers: { 'Content-Type': 'application/json' },
295
+ body: JSON.stringify({
296
+ question: text.trim(),
297
+ project_id: projectId,
298
+ }),
299
+ })
300
+ const data = await res.json()
301
+ const r = data?.data || data
302
+ const answer = r?.answer || 'Sorry, I could not generate a response.'
303
+
304
+ setMessages(prev => [
305
+ ...prev.slice(0, -1),
306
+ {
307
+ id: crypto.randomUUID(),
308
+ role: 'assistant',
309
+ content: answer,
310
+ sources: r?.sources || [],
311
+ tool_calls_made: r?.tool_calls_made || [],
312
+ },
313
+ ])
314
+ } catch (err) {
315
+ setMessages(prev => [
316
+ ...prev.slice(0, -1),
317
+ {
318
+ id: crypto.randomUUID(),
319
+ role: 'assistant',
320
+ content: `Error: ${err instanceof Error ? err.message : String(err)}`,
321
+ },
322
+ ])
323
+ } finally {
324
+ setSending(false)
325
+ setTimeout(() => textareaRef.current?.focus(), 50)
326
+ }
327
+ }, [projectId, sending])
328
+
329
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
330
+ if (e.key === 'Enter' && !e.shiftKey) {
331
+ e.preventDefault()
332
+ sendMessage(input)
333
+ }
334
+ }
335
+
336
+ const clearConversation = () => {
337
+ setMessages([])
338
+ setInput('')
339
+ textareaRef.current?.focus()
340
+ }
341
+
342
+ const isEmpty = messages.length === 0
343
+
344
+ return (
345
+ <div className="flex flex-col h-[calc(100vh-64px)]">
346
+ {}
347
+ <div className="flex items-center justify-between px-4 py-2.5 border-b bg-background shrink-0">
348
+ <div className="flex items-center gap-2 text-sm text-muted-foreground">
349
+ <a href={appPath('/cil')} className="hover:underline">Code Intelligence</a>
350
+ <ChevronRight className="h-3 w-3" />
351
+ {projectId && (
352
+ <>
353
+ <a href={appPath(`/cil/${projectId}/dashboard`)} className="hover:underline">{projectTitle || 'Project'}</a>
354
+ <ChevronRight className="h-3 w-3" />
355
+ </>
356
+ )}
357
+ <span className="flex items-center gap-1 text-foreground font-medium">
358
+ <Bot className="h-3.5 w-3.5 text-indigo-500" /> CIL Agent
359
+ </span>
360
+ </div>
361
+
362
+ <div className="flex items-center gap-2">
363
+ {projectId && (
364
+ <Badge variant="outline" className="text-xs font-mono">
365
+ <FileCode2 className="h-3 w-3 mr-1" />
366
+ {projectTitle || projectId.slice(0, 8)}
367
+ </Badge>
368
+ )}
369
+ {!isEmpty && (
370
+ <Button size="sm" variant="ghost" onClick={clearConversation} className="h-7 text-xs text-muted-foreground">
371
+ <Plus className="h-3 w-3 mr-1" /> New Chat
372
+ </Button>
373
+ )}
374
+ </div>
375
+ </div>
376
+
377
+ <PageInstructions
378
+ description="Ask the CIL agent questions about the indexed codebase."
379
+ sections={[
380
+ { title: 'What this page is for', content: 'Use this chat to ask natural-language questions about the indexed codebase. The agent searches chunk contracts and the call graph to answer accurately.' },
381
+ { title: 'How to use this page', content: 'Type a question in the input and press Enter or click send. Select a suggested prompt to start quickly. The agent returns citations from chunks and may call tools.' },
382
+ { title: 'How to interpret results', content: 'Assistant messages include source chunk references. Click a reference to open the chunk detail. No project ID means the search spans all indexed chunks.' },
383
+ { title: 'Important notes', content: 'The agent only knows what has been ingested and embedded. Run the CIL ingestion pipeline first for fresh or missing code.' },
384
+ ]}
385
+ />
386
+
387
+ {}
388
+ <div className="flex-1 overflow-y-auto px-4 py-4 space-y-4">
389
+ {isEmpty && (
390
+ <div className="flex flex-col items-center justify-center h-full space-y-6 text-center">
391
+ <div className="h-16 w-16 rounded-full bg-indigo-100 flex items-center justify-center">
392
+ <Bot className="h-8 w-8 text-indigo-600" />
393
+ </div>
394
+ <div className="space-y-1">
395
+ <h2 className="text-lg font-semibold">CIL Codebase Assistant</h2>
396
+ <p className="text-sm text-muted-foreground max-w-sm">
397
+ Ask me anything about this codebase. I'll search the indexed chunk contracts and call graph to answer accurately.
398
+ </p>
399
+ </div>
400
+ <div className="flex flex-wrap gap-2 justify-center max-w-lg">
401
+ {SUGGESTIONS.map(s => (
402
+ <button
403
+ key={s}
404
+ className="text-xs px-3 py-1.5 rounded-full border hover:bg-muted transition-colors text-muted-foreground hover:text-foreground text-left"
405
+ onClick={() => sendMessage(s)}
406
+ >
407
+ {s}
408
+ </button>
409
+ ))}
410
+ </div>
411
+ {!projectId && (
412
+ <div className="flex items-center gap-1.5 text-xs text-amber-600 bg-amber-50 border border-amber-200 rounded-lg px-3 py-2">
413
+ <AlertTriangle className="h-3.5 w-3.5 shrink-0" />
414
+ No project scope — searching across all indexed chunks
415
+ </div>
416
+ )}
417
+ </div>
418
+ )}
419
+
420
+ {messages.map(msg => (
421
+ <MessageBubble
422
+ key={msg.id}
423
+ message={msg}
424
+ projectId={projectId || ''}
425
+ appPath={appPath}
426
+ />
427
+ ))}
428
+
429
+ <div ref={bottomRef} />
430
+ </div>
431
+
432
+ {}
433
+ <div className="border-t bg-background px-4 py-3 shrink-0">
434
+ <div className="flex items-end gap-2 max-w-4xl mx-auto">
435
+ <Textarea
436
+ ref={textareaRef}
437
+ value={input}
438
+ onChange={e => setInput(e.target.value)}
439
+ onKeyDown={handleKeyDown}
440
+ placeholder="Ask about a function, safe refactoring, callers, or blast radius…"
441
+ className="min-h-[44px] max-h-[200px] resize-none text-sm"
442
+ rows={1}
443
+ disabled={sending}
444
+ />
445
+ <Button
446
+ onClick={() => sendMessage(input)}
447
+ disabled={!input.trim() || sending}
448
+ className="h-11 w-11 p-0 shrink-0"
449
+ >
450
+ {sending
451
+ ? <RefreshCw className="h-4 w-4 animate-spin" />
452
+ : <Send className="h-4 w-4" />
453
+ }
454
+ </Button>
455
+ </div>
456
+ <p className="text-xs text-center text-muted-foreground mt-1.5">
457
+ <Zap className="h-3 w-3 inline mr-1" />
458
+ Grounded in CIL chunk contracts · Press Shift+Enter for a new line
459
+ </p>
460
+ </div>
461
+ </div>
462
+ )
463
+ }
464
+
465
+ // CIL[END chunk_id="cilagentpage_cilagentpage_1784193942"]