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,13 +1,20 @@
1
- /**
2
- * @module src/pages/admin/IntegratedDashboard
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability testing
6
- *
7
- * A dashboard page that properly integrates with the Spine admin layout.
8
- * Uses the existing sidebar and content structure.
9
- */
10
1
 
2
+
3
+ // CIL[BEGIN chunk_id="integrateddashboard_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
4
+ // CIL[DOC-MACRO purpose="Import dependencies for IntegratedDashboard component"]
5
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React hooks and comprehensive UI components"]
6
+ // CIL[DOC-CONTEXT module="IntegratedDashboard" 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\",\"\\\"]"]
7
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
8
+ // CIL[DOC-MICRO logic_summary="Imports React state management and extensive UI component library" notable_decisions="[]"]
9
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
10
+ // CIL[DOC-STABILITY stability="stable"]
11
+ // CIL[DOC-AUDIENCE audience="developer"]
12
+ // CIL[DOC-VECTOR type="context" content="Layer: 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, \."]
13
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
14
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
15
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
16
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
17
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
11
18
  import { useState } from 'react'
12
19
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'
13
20
  import { Button } from '../../components/ui/button'
@@ -60,7 +67,21 @@ import {
60
67
  Calendar,
61
68
  Clock
62
69
  } from 'lucide-react'
63
-
70
+ // CIL[END chunk_id="integrateddashboard_module_header_1783668265"]
71
+ // CIL[BEGIN chunk_id="integrateddashboard_function_integrateddashboard_1783668265" type="function" identity="IntegratedDashboard" parent="none"]
72
+ // CIL[DOC-MACRO purpose="Main IntegratedDashboard component implementation"]
73
+ // CIL[DOC-RESPONSIBILITY responsibility="Render comprehensive admin dashboard with stats, activity, and settings"]
74
+ // CIL[DOC-CONTEXT module="IntegratedDashboard" 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\",\"\\\"]"]
75
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="none" side_effects="State management"]
76
+ // CIL[DOC-MICRO logic_summary="Creates full-featured dashboard with metrics cards, activity feed, and tabbed content" notable_decisions="[]"]
77
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
78
+ // CIL[DOC-STABILITY stability="stable"]
79
+ // 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, \."]
80
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
81
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
82
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
83
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
84
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
64
85
  export function IntegratedDashboard() {
65
86
  const [selectedTab, setSelectedTab] = useState('overview')
66
87
  const [searchQuery, setSearchQuery] = useState('')
@@ -68,7 +89,6 @@ export function IntegratedDashboard() {
68
89
 
69
90
  return (
70
91
  <div className="flex-1 space-y-6">
71
- {/* Page Header */}
72
92
  <div className="flex items-center justify-between">
73
93
  <div>
74
94
  <h2 className="text-3xl font-bold tracking-tight">Dashboard</h2>
@@ -88,7 +108,6 @@ export function IntegratedDashboard() {
88
108
  </div>
89
109
  </div>
90
110
 
91
- {/* Search and Filter Bar */}
92
111
  <Card>
93
112
  <CardContent className="pt-6">
94
113
  <div className="flex flex-col gap-4 sm:flex-row sm:items-center">
@@ -115,7 +134,6 @@ export function IntegratedDashboard() {
115
134
  </CardContent>
116
135
  </Card>
117
136
 
118
- {/* Stats Cards */}
119
137
  <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
120
138
  <Card className="relative overflow-hidden">
121
139
  <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
@@ -178,7 +196,6 @@ export function IntegratedDashboard() {
178
196
  </Card>
179
197
  </div>
180
198
 
181
- {/* Main Content Tabs */}
182
199
  <Tabs value={selectedTab} onValueChange={setSelectedTab} className="space-y-4">
183
200
  <TabsList className="grid w-full grid-cols-4">
184
201
  <TabsTrigger value="overview">Overview</TabsTrigger>
@@ -189,7 +206,6 @@ export function IntegratedDashboard() {
189
206
 
190
207
  <TabsContent value="overview" className="space-y-4">
191
208
  <div className="grid gap-6 lg:grid-cols-3">
192
- {/* Recent Activity */}
193
209
  <Card className="lg:col-span-2">
194
210
  <CardHeader>
195
211
  <CardTitle>Recent Activity</CardTitle>
@@ -235,7 +251,6 @@ export function IntegratedDashboard() {
235
251
  </CardContent>
236
252
  </Card>
237
253
 
238
- {/* Quick Actions */}
239
254
  <Card>
240
255
  <CardHeader>
241
256
  <CardTitle>Quick Actions</CardTitle>
@@ -400,3 +415,4 @@ export function IntegratedDashboard() {
400
415
  </div>
401
416
  )
402
417
  }
418
+ // CIL[END chunk_id="integrateddashboard_function_integrateddashboard_1783668265"]
@@ -1,6 +1,22 @@
1
- /**
2
- * @module src/pages/admin/IntegrationDetailPage
3
- */
1
+
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="integrationdetailpage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import dependencies for IntegrationDetailPage component"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, routing, API hooks, and UI components"]
8
+ // CIL[DOC-CONTEXT module="IntegrationDetailPage" 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, routing, API hooks, UI components" notable_decisions="[]"]
11
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
12
+ // CIL[DOC-STABILITY stability="stable"]
13
+ // CIL[DOC-AUDIENCE audience="developer"]
14
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .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"]
4
20
  import { useState, useEffect } from 'react'
5
21
  import { useParams, useNavigate } from 'react-router-dom'
6
22
  import { apiFetch } from '../../lib/api'
@@ -15,26 +31,55 @@ import { Skeleton } from '../../components/ui/skeleton'
15
31
  import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
16
32
  import { Modal } from '../../components/ui/Modal'
17
33
  import { Badge } from '../../components/ui/badge'
18
- import { ArrowLeft, Pencil, Trash2, CheckCircle, XCircle, AlertTriangle, AlertCircle } from 'lucide-react'
19
- import { formatDateTime } from '../../lib/utils'
34
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../../components/ui/collapsible'
35
+ import { ArrowLeft, Pencil, Trash2, CheckCircle, XCircle, AlertTriangle, AlertCircle, ChevronDown } from 'lucide-react'
20
36
 
37
+ // CIL[END chunk_id="integrationdetailpage_module_header_1783668265"]
38
+ // CIL[BEGIN chunk_id="integrationdetailpage_interface_integration_1783668265" type="interface" identity="Integration" parent="none"]
39
+ // CIL[DOC-MACRO purpose="Define Integration data structure"]
40
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for integration objects"]
41
+ // CIL[DOC-CONTEXT module="IntegrationDetailPage" layer="types" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
42
+ // CIL[DOC-CONTRACT inputs="none" outputs="Integration interface type" errors="none" side_effects="none"]
43
+ // CIL[DOC-MICRO logic_summary="Defines complete integration structure with config and sync status" notable_decisions="[]"]
44
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
45
+ // CIL[DOC-STABILITY stability="stable"]
46
+ // CIL[DOC-VECTOR type="context" content="Layer: types. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
47
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
48
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
49
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
50
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
51
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
21
52
  interface Integration {
22
53
  id: string
23
54
  name: string
24
55
  provider: string
56
+ version?: string
25
57
  integration_type: 'webhook' | 'api' | 'database' | 'file' | 'custom'
26
58
  description?: string
27
59
  config: Record<string, any>
60
+ credentials?: Record<string, any>
28
61
  is_active: boolean
29
62
  is_system?: boolean
63
+ is_configured?: boolean
30
64
  created_at: string
31
65
  updated_at: string
32
- account_id: string
33
- last_sync?: string
34
- sync_status?: 'success' | 'failed' | 'pending'
35
- error_message?: string
66
+ account_id: string | null
36
67
  }
37
-
68
+ // CIL[END chunk_id="integrationdetailpage_interface_integration_1783668265"]
69
+ // CIL[BEGIN chunk_id="integrationdetailpage_constant_integration_types_1783668265" type="constant" identity="INTEGRATION_TYPES" parent="none"]
70
+ // CIL[DOC-MACRO purpose="Define integration type options"]
71
+ // CIL[DOC-RESPONSIBILITY responsibility="Configure available integration type choices"]
72
+ // CIL[DOC-CONTEXT module="IntegrationDetailPage" layer="constants" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
73
+ // CIL[DOC-CONTRACT inputs="none" outputs="Integration type options" errors="none" side_effects="none"]
74
+ // CIL[DOC-MICRO logic_summary="Defines webhook, API, database, file, and custom integration types" notable_decisions="[]"]
75
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
76
+ // CIL[DOC-STABILITY stability="stable"]
77
+ // CIL[DOC-VECTOR type="context" content="Layer: constants. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, \."]
78
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
79
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
80
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
81
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
82
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
38
83
  const INTEGRATION_TYPES = [
39
84
  { value: 'webhook', label: 'Webhook' },
40
85
  { value: 'api', label: 'API' },
@@ -42,7 +87,21 @@ const INTEGRATION_TYPES = [
42
87
  { value: 'file', label: 'File' },
43
88
  { value: 'custom', label: 'Custom' }
44
89
  ]
45
-
90
+ // CIL[END chunk_id="integrationdetailpage_constant_integration_types_1783668265"]
91
+ // CIL[BEGIN chunk_id="integrationdetailpage_function_integrationdetailpage_1783668265" type="function" identity="IntegrationDetailPage" parent="none"]
92
+ // CIL[DOC-MACRO purpose="Main IntegrationDetailPage component implementation"]
93
+ // CIL[DOC-RESPONSIBILITY responsibility="Render integration detail view with create/edit/delete functionality"]
94
+ // CIL[DOC-CONTEXT module="IntegrationDetailPage" 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\",\"\\\"]"]
95
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="API failures" side_effects="Navigation, API calls"]
96
+ // CIL[DOC-MICRO logic_summary="Manages CRUD operations for integrations with form validation and state management" notable_decisions="[]"]
97
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
98
+ // CIL[DOC-STABILITY stability="stable"]
99
+ // 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, \."]
100
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
101
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
102
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
103
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
104
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
46
105
  export function IntegrationDetailPage() {
47
106
  const { id } = useParams<{ id: string }>()
48
107
  const navigate = useNavigate()
@@ -53,7 +112,7 @@ export function IntegrationDetailPage() {
53
112
  const [isEditing, setIsEditing] = useState(isCreateMode)
54
113
  const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false)
55
114
  const [formData, setFormData] = useState({
56
- name: '', provider: '', integration_type: 'api' as const, description: '', config: '{}', is_active: true
115
+ name: '', provider: '', version: '', integration_type: 'api' as const, description: '', config: '{}', credentials: '{}', is_active: true
57
116
  })
58
117
 
59
118
  useEffect(() => {
@@ -72,8 +131,11 @@ export function IntegrationDetailPage() {
72
131
  const data = result.data
73
132
  setIntegration(data)
74
133
  setFormData({
75
- name: data.name, provider: data.provider, integration_type: data.integration_type,
76
- description: data.description || '', config: JSON.stringify(data.config, null, 2), is_active: data.is_active
134
+ name: data.name, provider: data.provider, version: data.version || '', integration_type: data.integration_type,
135
+ description: data.description || '',
136
+ config: JSON.stringify(data.config || {}, null, 2),
137
+ credentials: JSON.stringify(data.credentials || {}, null, 2),
138
+ is_active: data.is_active
77
139
  })
78
140
  } catch (err) {
79
141
  setError(err instanceof Error ? err.message : 'Failed to load integration')
@@ -88,9 +150,12 @@ export function IntegrationDetailPage() {
88
150
  try {
89
151
  let parsedConfig = {}
90
152
  try { parsedConfig = JSON.parse(formData.config) } catch { throw new Error('Invalid JSON in config') }
153
+ let parsedCredentials = {}
154
+ try { parsedCredentials = JSON.parse(formData.credentials) } catch { throw new Error('Invalid JSON in credentials') }
91
155
  const url = isCreateMode ? '/api/integrations?action=create' : `/api/integrations?action=update&id=${id}`
92
156
  const method = isCreateMode ? 'POST' : 'PATCH'
93
- const response = await apiFetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...formData, config: parsedConfig }) })
157
+ const body = { ...formData, config: parsedConfig, credentials: parsedCredentials }
158
+ const response = await apiFetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) })
94
159
  if (!response.ok) throw new Error('Failed to save integration')
95
160
  if (isCreateMode) {
96
161
  const result = await response.json()
@@ -126,13 +191,68 @@ export function IntegrationDetailPage() {
126
191
  <Alert variant="destructive"><AlertCircle className="h-4 w-4" /><AlertTitle>Error</AlertTitle><AlertDescription>{error}</AlertDescription></Alert>
127
192
  )
128
193
 
129
- const getStatusIcon = (status?: string) => {
130
- switch (status) {
131
- case 'success': return <CheckCircle className="h-4 w-4 text-green-500" />
132
- case 'failed': return <XCircle className="h-4 w-4 text-red-500" />
133
- case 'pending': return <AlertTriangle className="h-4 w-4 text-yellow-500" />
134
- default: return null
194
+ const typeInstructions = [
195
+ {
196
+ type: 'api',
197
+ title: 'API integration',
198
+ description: 'For outbound REST calls such as OpenAI, custom LLM providers, or generic HTTP endpoints. Set config.outbound_adapter and credentials.api_token.',
199
+ config: {
200
+ outbound_adapter: 'adapters/openai-outbound',
201
+ base_url: 'https://api.openai.com/v1',
202
+ models: { chat: 'gpt-4o-mini', embedding: 'text-embedding-3-small' }
203
+ },
204
+ credentials: { api_token: { source: 'env_var', value: 'OPENAI_API_KEY' } }
205
+ },
206
+ {
207
+ type: 'webhook',
208
+ title: 'Webhook integration',
209
+ description: 'For inbound HTTP events. Define the adapter that will handle the webhook and any events it listens to. Credentials usually hold a signing secret or API key.',
210
+ config: {
211
+ inbound_adapter: 'adapters/generic-webhook-inbound',
212
+ events: ['my.event']
213
+ },
214
+ credentials: { signing_secret: { source: 'env_var', value: 'WEBHOOK_SECRET' } }
215
+ },
216
+ {
217
+ type: 'database',
218
+ title: 'Database integration',
219
+ description: 'For external database reads/writes. Use env_var sources for host, port, database, and a credentials field for the password.',
220
+ config: {
221
+ adapter: 'adapters/postgres-outbound',
222
+ host_env_var: 'DB_HOST',
223
+ port_env_var: 'DB_PORT',
224
+ database_env_var: 'DB_NAME'
225
+ },
226
+ credentials: { password: { source: 'env_var', value: 'DB_PASSWORD' } }
227
+ },
228
+ {
229
+ type: 'file',
230
+ title: 'File / storage integration',
231
+ description: 'For S3, GCS, or other object storage. Provide bucket and region in config and access keys in credentials.',
232
+ config: {
233
+ adapter: 'adapters/s3-outbound',
234
+ bucket: 'my-bucket',
235
+ region: 'us-east-1'
236
+ },
237
+ credentials: {
238
+ access_key_id: { source: 'env_var', value: 'AWS_ACCESS_KEY_ID' },
239
+ secret_access_key: { source: 'env_var', value: 'AWS_SECRET_ACCESS_KEY' }
240
+ }
241
+ },
242
+ {
243
+ type: 'custom',
244
+ title: 'Custom integration',
245
+ description: 'For any integration not covered above. Point config.outbound_adapter or config.inbound_adapter to a custom function path and define the credentials fields your adapter expects.',
246
+ config: {
247
+ outbound_adapter: 'custom/apps/myapp/functions/my-adapter'
248
+ },
249
+ credentials: { api_token: { source: 'env_var', value: 'MY_CUSTOM_TOKEN' } }
135
250
  }
251
+ ]
252
+
253
+ const getStatusIcon = (configured?: boolean) => {
254
+ if (configured) return <CheckCircle className="h-4 w-4 text-green-500" />
255
+ return <AlertTriangle className="h-4 w-4 text-yellow-500" />
136
256
  }
137
257
 
138
258
  return (
@@ -156,27 +276,63 @@ export function IntegrationDetailPage() {
156
276
  )}
157
277
  </div>
158
278
 
279
+ <Card>
280
+ <CardContent className="p-4">
281
+ <Collapsible>
282
+ <CollapsibleTrigger className="group flex w-full items-center justify-between text-sm font-medium text-slate-700">
283
+ <span>Integration setup instructions</span>
284
+ <ChevronDown className="h-4 w-4 transition-transform group-data-[state=open]:rotate-180" />
285
+ </CollapsibleTrigger>
286
+ <CollapsibleContent className="space-y-4 pt-4">
287
+ <p className="text-sm text-slate-600">
288
+ Integrations connect Spine to external services. <code>Configuration (JSON)</code> defines the adapter and runtime settings. <code>Credentials (JSON)</code> stores secrets as either <code>env_var</code> (an environment variable name) or <code>value</code> (the literal secret). Fill in the fields for your integration type, save, and the broker will use them on the next call.
289
+ </p>
290
+ <div className="space-y-2">
291
+ {typeInstructions.map((t) => (
292
+ <Collapsible key={t.type}>
293
+ <CollapsibleTrigger className="group flex w-full items-center justify-between border-b py-2 text-sm font-medium text-slate-700">
294
+ <span>{t.title}</span>
295
+ <ChevronDown className="h-4 w-4 transition-transform group-data-[state=open]:rotate-180" />
296
+ </CollapsibleTrigger>
297
+ <CollapsibleContent className="space-y-2 pt-2">
298
+ <p className="text-sm text-slate-600">{t.description}</p>
299
+ <div className="space-y-1">
300
+ <div className="text-xs font-medium text-slate-500">Config template</div>
301
+ <pre className="text-xs bg-muted p-2 rounded overflow-auto font-mono">{JSON.stringify(t.config, null, 2)}</pre>
302
+ </div>
303
+ <div className="space-y-1">
304
+ <div className="text-xs font-medium text-slate-500">Credentials template</div>
305
+ <pre className="text-xs bg-muted p-2 rounded overflow-auto font-mono">{JSON.stringify(t.credentials, null, 2)}</pre>
306
+ </div>
307
+ </CollapsibleContent>
308
+ </Collapsible>
309
+ ))}
310
+ </div>
311
+ </CollapsibleContent>
312
+ </Collapsible>
313
+ </CardContent>
314
+ </Card>
315
+
159
316
  <Card><CardContent className="p-6">
160
317
  <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
161
318
  <div className="space-y-4">
162
319
  <h3 className="text-sm font-medium text-muted-foreground">Basic Info</h3>
163
320
  <div className="space-y-2"><Label>Name</Label>{isEditing ? <Input value={formData.name} onChange={e => setFormData({...formData, name: e.target.value})} /> : <div className="text-sm">{integration?.name}</div>}</div>
164
321
  <div className="space-y-2"><Label>Provider</Label>{isEditing ? <Input value={formData.provider} onChange={e => setFormData({...formData, provider: e.target.value})} /> : <div className="text-sm">{integration?.provider}</div>}</div>
322
+ <div className="space-y-2"><Label>Version</Label>{isEditing ? <Input value={formData.version} onChange={e => setFormData({...formData, version: e.target.value})} /> : <div className="text-sm">{integration?.version || '—'}</div>}</div>
165
323
  <div className="space-y-2"><Label>Type</Label>{isEditing ? <Select value={formData.integration_type} onValueChange={v => setFormData({...formData, integration_type: v as any})}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent>{INTEGRATION_TYPES.map(t => <SelectItem key={t.value} value={t.value}>{t.label}</SelectItem>)}</SelectContent></Select> : <Badge>{integration?.integration_type}</Badge>}</div>
166
324
  <div className="space-y-2"><Label>Active</Label>{isEditing ? <div className="flex items-center gap-2"><Checkbox id="active" checked={formData.is_active} onCheckedChange={c => setFormData({...formData, is_active: c === true})} /><Label htmlFor="active">Enabled</Label></div> : <div className="text-sm">{integration?.is_active ? 'Yes' : 'No'}</div>}</div>
167
325
  </div>
168
326
  <div className="space-y-4">
169
- <h3 className="text-sm font-medium text-muted-foreground">Sync Status</h3>
327
+ <h3 className="text-sm font-medium text-muted-foreground">Status</h3>
170
328
  {!isCreateMode && (
171
- <>
172
- <div className="flex justify-between items-center"><span className="text-sm text-muted-foreground">Status</span><div className="flex items-center gap-2">{getStatusIcon(integration?.sync_status)}<span className="text-sm capitalize">{integration?.sync_status || '—'}</span></div></div>
173
- <div className="flex justify-between items-center"><span className="text-sm text-muted-foreground">Last Sync</span><span className="text-sm">{integration?.last_sync ? formatDateTime(integration.last_sync) : '—'}</span></div>
174
- </>
329
+ <div className="flex justify-between items-center"><span className="text-sm text-muted-foreground">Configured</span><div className="flex items-center gap-2">{getStatusIcon(integration?.is_configured)}<span className="text-sm capitalize">{integration?.is_configured ? 'Configured' : 'Pending'}</span></div></div>
175
330
  )}
176
331
  <div className="space-y-2"><Label>Description</Label>{isEditing ? <Textarea value={formData.description} onChange={e => setFormData({...formData, description: e.target.value})} rows={3} /> : <div className="text-sm">{integration?.description || '—'}</div>}</div>
177
332
  </div>
178
333
  </div>
179
334
  <div className="mt-6 space-y-2"><Label>Configuration (JSON)</Label>{isEditing ? <Textarea value={formData.config} onChange={e => setFormData({...formData, config: e.target.value})} rows={8} className="font-mono text-sm" /> : <pre className="text-sm bg-muted p-3 rounded overflow-auto">{JSON.stringify(integration?.config || {}, null, 2)}</pre>}</div>
335
+ <div className="mt-6 space-y-2"><Label>Credentials (JSON)</Label>{isEditing ? <Textarea value={formData.credentials} onChange={e => setFormData({...formData, credentials: e.target.value})} rows={8} className="font-mono text-sm" /> : <pre className="text-sm bg-muted p-3 rounded overflow-auto">{JSON.stringify(integration?.credentials || {}, null, 2)}</pre>}</div>
180
336
  </CardContent></Card>
181
337
 
182
338
  <Modal isOpen={isDeleteModalOpen} onClose={() => setIsDeleteModalOpen(false)} title="Delete Integration" description="Are you sure you want to delete this integration?" size="sm">
@@ -185,3 +341,4 @@ export function IntegrationDetailPage() {
185
341
  </div>
186
342
  )
187
343
  }
344
+ // CIL[END chunk_id="integrationdetailpage_function_integrationdetailpage_1783668265"]
@@ -1,18 +1,21 @@
1
- /**
2
- * @module src/pages/admin/IntegrationsPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * Admin list page for third-party integrations (integration instances).
8
- * Fetches all integration instances via `/api/integrations?action=list`,
9
- * applies client-side search, status filter, and sort. Renders inside
10
- * `AdminListPage`. Row clicks navigate to
11
- * `/spine-framework/admin/configs/integrations/:id`.
12
- *
13
- * @seeAlso src/pages/admin/IntegrationDetailPage.tsx
14
- */
15
1
 
2
+
3
+
4
+ // CIL[BEGIN chunk_id="integrationspage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import dependencies for IntegrationsPage component"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, UI components, and utilities"]
7
+ // CIL[DOC-CONTEXT module="IntegrationsPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
9
+ // CIL[DOC-MICRO logic_summary="Imports React state management, UI components, API hooks, icons" notable_decisions="[]"]
10
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
11
+ // CIL[DOC-STABILITY stability="stable"]
12
+ // CIL[DOC-AUDIENCE audience="developer"]
13
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
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"]
16
19
  import { useState } from 'react'
17
20
  import { Link, CheckCircle, AlertTriangle, Settings, Cog } from 'lucide-react';
18
21
  import { formatDateTime } from '../../lib/utils'
@@ -20,7 +23,21 @@ import { apiFetch } from '../../lib/api'
20
23
  import { AdminListPage } from '../../components/admin/AdminListPage'
21
24
  import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
22
25
  import { useApi } from '../../hooks/useApi'
23
-
26
+ // CIL[END chunk_id="integrationspage_module_header_1783668265"]
27
+ // CIL[BEGIN chunk_id="integrationspage_interface_integration_1783668265" type="interface" identity="Integration" parent="none"]
28
+ // CIL[DOC-MACRO purpose="Define Integration data structure"]
29
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for integration objects"]
30
+ // CIL[DOC-CONTEXT module="IntegrationsPage" layer="types" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
31
+ // CIL[DOC-CONTRACT inputs="none" outputs="Integration interface type" errors="none" side_effects="none"]
32
+ // CIL[DOC-MICRO logic_summary="Defines complete integration structure with sync status and metadata" 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: types. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
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"]
24
41
  interface Integration {
25
42
  id: string
26
43
  name: string
@@ -46,7 +63,21 @@ interface Integration {
46
63
  email: string
47
64
  }
48
65
  }
49
-
66
+ // CIL[END chunk_id="integrationspage_interface_integration_1783668265"]
67
+ // CIL[BEGIN chunk_id="integrationspage_function_integrationspage_1783668265" type="function" identity="IntegrationsPage" parent="none"]
68
+ // CIL[DOC-MACRO purpose="Main IntegrationsPage component implementation"]
69
+ // CIL[DOC-RESPONSIBILITY responsibility="Render integrations management interface with filtering, sorting, and stats"]
70
+ // CIL[DOC-CONTEXT module="IntegrationsPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
71
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="API failures" side_effects="Navigation, API calls"]
72
+ // CIL[DOC-MICRO logic_summary="Manages state, fetches integrations, handles filtering/sorting, renders table" notable_decisions="[]"]
73
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
74
+ // CIL[DOC-STABILITY stability="stable"]
75
+ // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
76
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
77
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
78
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
79
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
80
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
50
81
  export function IntegrationsPage() {
51
82
  const [searchTerm, setSearchTerm] = useState('')
52
83
  const [selectedStatus, setSelectedStatus] = useState('all')
@@ -54,7 +85,6 @@ export function IntegrationsPage() {
54
85
  const [sortKey, setSortKey] = useState('name')
55
86
  const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')
56
87
 
57
- // Fetch integrations from API
58
88
  const { data: integrations, loading, error } = useApi<Integration[]>(
59
89
  async ({ signal }: { signal?: AbortSignal }) => {
60
90
  const response = await apiFetch('/api/integrations?action=list', { signal })
@@ -78,7 +108,6 @@ export function IntegrationsPage() {
78
108
 
79
109
  const types = Array.from(new Set((integrations || []).map(i => i.integration_type)))
80
110
 
81
- // Helper functions
82
111
  const getStatusBadge = (integration: Integration) => {
83
112
  if (!integration.is_active) {
84
113
  return <span className="inline-flex px-2 py-1 text-xs font-semibold rounded-full bg-slate-100 text-slate-800">Inactive</span>
@@ -105,7 +134,6 @@ export function IntegrationsPage() {
105
134
  window.location.href = `/spine-framework/admin/configs/integrations/${integration.id}`
106
135
  }
107
136
 
108
- // Sort integrations
109
137
  const sortedIntegrations = [...(filteredIntegrations || [])].sort((a, b) => {
110
138
  let aValue: any = a[sortKey as keyof Integration]
111
139
  let bValue: any = b[sortKey as keyof Integration]
@@ -299,3 +327,4 @@ export function IntegrationsPage() {
299
327
  </AdminListPage>
300
328
  )
301
329
  }
330
+ // CIL[END chunk_id="integrationspage_function_integrationspage_1783668265"]
@@ -1,26 +1,59 @@
1
- /**
2
- * @module src/pages/admin/InvitesPage
3
- * @audience installer
4
- * @layer frontend-page
5
- * @stability stable
6
- *
7
- * System-level invite management page for system_admin.
8
- * Shows invites for the spine-system account scoped to system_admin role only.
9
- * Rendered at /spine-framework/admin/access/invites
10
- *
11
- * @seeAlso src/components/shared/InviteManager.tsx
12
- */
13
1
 
2
+
3
+
4
+ // CIL[BEGIN chunk_id="invitespage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import dependencies for InvitesPage component"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React and shared components"]
7
+ // CIL[DOC-CONTEXT module="InvitesPage" layer="presentation" 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\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
9
+ // CIL[DOC-MICRO logic_summary="Imports React, InviteManager component, and auth context" 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: presentation. 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, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
14
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
15
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
16
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
17
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
18
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
14
19
  import React from 'react'
15
20
  import { InviteManager } from '../../components/shared/InviteManager'
16
21
  import { useAuth } from '../../contexts/AuthContext'
17
-
22
+ // CIL[END chunk_id="invitespage_module_header_1783668265"]
23
+ // CIL[BEGIN chunk_id="invitespage_constant_framework_roles_1783668265" type="constant" identity="FRAMEWORK_ROLES" parent="none"]
24
+ // CIL[DOC-MACRO purpose="Define framework admin roles"]
25
+ // CIL[DOC-RESPONSIBILITY responsibility="Configure available system admin roles"]
26
+ // CIL[DOC-CONTEXT module="InvitesPage" layer="constants" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
27
+ // CIL[DOC-CONTRACT inputs="none" outputs="Role constants" errors="none" side_effects="none"]
28
+ // CIL[DOC-MICRO logic_summary="Defines system admin role with slug and name" notable_decisions="[]"]
29
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
30
+ // CIL[DOC-STABILITY stability="stable"]
31
+ // CIL[DOC-VECTOR type="context" content="Layer: constants. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
32
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
33
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
34
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
35
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
36
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
18
37
  const FRAMEWORK_ROLES = [
19
38
  { slug: 'system_admin', name: 'System Admin' },
20
39
  ]
21
40
 
22
41
  const FRAMEWORK_ROLE_SLUGS = FRAMEWORK_ROLES.map(r => r.slug).join(',')
23
-
42
+ // CIL[END chunk_id="invitespage_constant_framework_roles_1783668265"]
43
+ // CIL[BEGIN chunk_id="invitespage_function_invitespage_1783668265" type="function" identity="InvitesPage" parent="none"]
44
+ // CIL[DOC-MACRO purpose="Main InvitesPage component implementation"]
45
+ // CIL[DOC-RESPONSIBILITY responsibility="Render invite management interface for system admins"]
46
+ // CIL[DOC-CONTEXT module="InvitesPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
47
+ // CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="Auth context errors" side_effects="none"]
48
+ // CIL[DOC-MICRO logic_summary="Renders page header and InviteManager with framework roles" notable_decisions="[]"]
49
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
50
+ // CIL[DOC-STABILITY stability="stable"]
51
+ // 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/layout/Sidebar.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
52
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
53
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
54
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
55
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
56
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
24
57
  export function InvitesPage() {
25
58
  const { user } = useAuth()
26
59
 
@@ -42,3 +75,4 @@ export function InvitesPage() {
42
75
  </div>
43
76
  )
44
77
  }
78
+ // CIL[END chunk_id="invitespage_function_invitespage_1783668265"]