spine-framework 0.3.145 → 0.4.0

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 (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,34 +1,74 @@
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/shared/InviteManager.tsx"]
2
+ // CIL[DOC-MACRO purpose="Provide shared InviteManager React component and related type definitions"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, utility API client, and declare exported types for invite management"]
4
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/lib/api.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="InviteManager component, InviteScope, AllowedRole, InviteManagerProps, InviteRow, and helper functions" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Import React hooks and apiFetch, then define types and the InviteManager component" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="framework-developers,ui-developers"]
1
10
 
2
11
 
12
+ import React, { useState, useEffect, useCallback, useMemo } from 'react'
13
+ import { apiFetch } from '../../lib/api'
14
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide shared InviteManager React component and related type definitions'; No verified external callers; imports: .framework/src/lib/api.ts"]
15
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
16
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
17
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
18
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
20
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
3
21
 
4
22
 
5
-
6
-
7
-
8
- // CIL[BEGIN chunk_id="InviteManager_module_header_1783927912" type="module_header" identity="module_header" parent="none"]
9
- // CIL[DOC-MACRO purpose="Import dependencies and define invite management component interfaces"]
10
- // CIL[DOC-RESPONSIBILITY responsibility="Manage React imports and invite component prop types"]
11
- // CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
12
- // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and interfaces" errors="none" side_effects="none"]
13
- // CIL[DOC-MICRO logic_summary="Imports React hooks and API, defines invite-related types and interfaces" notable_decisions="[]"]
14
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
23
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:invitescope:type" type="type" identity="invitescope" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
24
+ // CIL[DOC-MACRO purpose="Define the possible scopes for an invite"]
25
+ // CIL[DOC-RESPONSIBILITY responsibility="Constrain invite scope to account or system"]
26
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
27
+ // CIL[DOC-CONTRACT inputs="none" outputs="InviteScope union type" errors="none" side_effects="none"]
28
+ // CIL[DOC-MICRO logic_summary="Export a string-literal union for invite scope values" notable_decisions="[]"]
29
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
15
30
  // CIL[DOC-STABILITY stability="stable"]
16
- // CIL[DOC-AUDIENCE audience="developer"]
17
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
18
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
19
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
20
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
31
+
32
+ export type InviteScope = 'account' | 'system'
33
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the possible scopes for an invite'; No verified external callers; imports: .framework/src/lib/api.ts"]
34
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
35
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
36
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
21
37
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
22
38
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
23
- import React, { useState, useEffect, useCallback, useMemo } from 'react'
24
- import { apiFetch } from '../../lib/api'
39
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:invitescope:type"]
25
40
 
26
- export type InviteScope = 'account' | 'system'
41
+
42
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:allowedrole:interface" type="interface" identity="allowedrole" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
43
+ // CIL[DOC-MACRO purpose="Describe an allowed role selection entry"]
44
+ // CIL[DOC-RESPONSIBILITY responsibility="Define the slug and display name of a role that can be assigned in an invite"]
45
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
46
+ // CIL[DOC-CONTRACT inputs="none" outputs="AllowedRole interface" errors="none" side_effects="none"]
47
+ // CIL[DOC-MICRO logic_summary="Declare an object with role slug and human-readable name" notable_decisions="[]"]
48
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
49
+ // CIL[DOC-STABILITY stability="stable"]
27
50
 
28
51
  export interface AllowedRole {
29
52
  slug: string
30
53
  name: string
31
54
  }
55
+ // CIL[DOC-VECTOR type="context" content="purpose='Describe an allowed role selection entry'; No verified external callers; imports: .framework/src/lib/api.ts"]
56
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
57
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
58
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
59
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
60
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
61
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:allowedrole:interface"]
62
+
63
+
64
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManagerProps:interface" type="interface" identity="InviteManagerProps" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
65
+ // CIL[DOC-MACRO purpose="Define props consumed by the InviteManager component"]
66
+ // CIL[DOC-RESPONSIBILITY responsibility="Type check the account id, allowed roles, optional role filter, and scope passed to InviteManager"]
67
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
68
+ // CIL[DOC-CONTRACT inputs="props object" outputs="InviteManagerProps interface" errors="none" side_effects="none"]
69
+ // CIL[DOC-MICRO logic_summary="Declare optional accountId, allowedRoles array, optional roleSlugsFilter, and scope" notable_decisions="[]"]
70
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
71
+ // CIL[DOC-STABILITY stability="stable"]
32
72
 
33
73
  export interface InviteManagerProps {
34
74
  accountId?: string
@@ -36,6 +76,23 @@ export interface InviteManagerProps {
36
76
  roleSlugsFilter?: string
37
77
  scope: InviteScope
38
78
  }
79
+ // CIL[DOC-VECTOR type="context" content="purpose='Define props consumed by the InviteManager component'; No verified external callers; imports: .framework/src/lib/api.ts"]
80
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
81
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
82
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
83
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
84
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
85
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManagerProps:interface"]
86
+
87
+
88
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteRow:interface" type="interface" identity="InviteRow" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
89
+ // CIL[DOC-MACRO purpose="Describe the shape of an invite or access request record"]
90
+ // CIL[DOC-RESPONSIBILITY responsibility="Define the fields returned from the invites API including status, expiration, blocking, and related account and role"]
91
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
92
+ // CIL[DOC-CONTRACT inputs="none" outputs="InviteRow interface" errors="none" side_effects="none"]
93
+ // CIL[DOC-MICRO logic_summary="Declare all fields for a single invite row with their statuses and timestamps" notable_decisions="[]"]
94
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
95
+ // CIL[DOC-STABILITY stability="stable"]
39
96
 
40
97
  interface InviteRow {
41
98
  id: string
@@ -49,21 +106,23 @@ interface InviteRow {
49
106
  account: { id: string; slug: string; display_name: string } | null
50
107
  role: { id: string; slug: string; name: string } | null
51
108
  }
52
- // CIL[END chunk_id="InviteManager_module_header_1783927912"]
53
- // CIL[BEGIN chunk_id="InviteManager_callinvitesapi_1783927912" type="function" identity="callInvitesApi" parent="none"]
54
- // CIL[DOC-MACRO purpose="Make API calls to invites endpoint with proper method handling"]
55
- // CIL[DOC-RESPONSIBILITY responsibility="Handle GET/POST requests to invites API functions"]
56
- // CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
57
- // CIL[DOC-CONTRACT inputs="none" outputs="API response JSON" errors="API errors" side_effects="Network requests"]
58
- // CIL[DOC-MICRO logic_summary="Builds query strings for GET, sends JSON for POST to invites endpoint" notable_decisions="[]"]
59
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
60
- // CIL[DOC-STABILITY stability="stable"]
61
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 1. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
62
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
63
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
64
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
109
+ // CIL[DOC-VECTOR type="context" content="purpose='Describe the shape of an invite or access request record'; No verified external callers; imports: .framework/src/lib/api.ts"]
110
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
111
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
112
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
65
113
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
66
114
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
115
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteRow:interface"]
116
+
117
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:callInvitesApi:function" type="function" identity="callInvitesApi" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
118
+ // CIL[DOC-MACRO purpose="Call the Netlify invites function endpoint"]
119
+ // CIL[DOC-RESPONSIBILITY responsibility="Build GET or POST requests to the /.netlify/functions/invites endpoint and return JSON"]
120
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
121
+ // CIL[DOC-CONTRACT inputs="action: string, params: Record<string, any>, method: GET | POST" outputs="JSON response body from apiFetch" errors="throws if fetch fails" side_effects="makes HTTP request to invites function"]
122
+ // CIL[DOC-MICRO logic_summary="Serialize parameters to query string for GET or JSON body for POST and await apiFetch" notable_decisions="[]"]
123
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
124
+ // CIL[DOC-STABILITY stability="stable"]
125
+
67
126
  async function callInvitesApi(action: string, params: Record<string, any> = {}, method: 'GET' | 'POST' = 'GET') {
68
127
  const base = '/.netlify/functions/invites'
69
128
  if (method === 'GET') {
@@ -78,21 +137,23 @@ async function callInvitesApi(action: string, params: Record<string, any> = {},
78
137
  })
79
138
  return res.json()
80
139
  }
81
- // CIL[END chunk_id="InviteManager_callinvitesapi_1783927912"]
82
- // CIL[BEGIN chunk_id="InviteManager_derivedisplaystatus_1783927912" type="function" identity="deriveDisplayStatus" parent="none"]
83
- // CIL[DOC-MACRO purpose="Convert invite status to human-readable display text"]
84
- // CIL[DOC-RESPONSIBILITY responsibility="Map internal status codes to user-friendly labels"]
85
- // CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
86
- // CIL[DOC-CONTRACT inputs="none" outputs="Display status string" errors="none" side_effects="none"]
87
- // CIL[DOC-MICRO logic_summary="Handles special cases like expiration, blocking, and invite vs access request" notable_decisions="[]"]
88
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
89
- // CIL[DOC-STABILITY stability="stable"]
90
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
91
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
92
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
93
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
140
+ // CIL[DOC-VECTOR type="context" content="purpose='Call the Netlify invites function endpoint'; No verified external callers; imports: .framework/src/lib/api.ts"]
141
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
142
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
143
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
94
144
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
95
145
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
146
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:callInvitesApi:function"]
147
+
148
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:deriveDisplayStatus:function" type="function" identity="deriveDisplayStatus" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
149
+ // CIL[DOC-MACRO purpose="Map an InviteRow status to a human-readable display status"]
150
+ // CIL[DOC-RESPONSIBILITY responsibility="Interpret blocked, inactive, active, pending, and invited states to produce a UI label"]
151
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
152
+ // CIL[DOC-CONTRACT inputs="row: InviteRow" outputs="human-readable status string" errors="none" side_effects="none"]
153
+ // CIL[DOC-MICRO logic_summary="Check blocked_at first, then status and kind, then expiration for invited rows" notable_decisions="[]"]
154
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
155
+ // CIL[DOC-STABILITY stability="stable"]
156
+
96
157
  function deriveDisplayStatus(row: InviteRow): string {
97
158
  if (row.blocked_at) return 'blocked'
98
159
  if (row.status === 'inactive') return 'revoked'
@@ -105,21 +166,24 @@ function deriveDisplayStatus(row: InviteRow): string {
105
166
  }
106
167
  return row.status
107
168
  }
108
- // CIL[END chunk_id="InviteManager_derivedisplaystatus_1783927912"]
109
- // CIL[BEGIN chunk_id="InviteManager_statusclasses_1783927912" type="constant" identity="STATUS_CLASSES" parent="none"]
110
- // CIL[DOC-MACRO purpose="Define CSS classes for different invite status colors"]
111
- // CIL[DOC-RESPONSIBILITY responsibility="Provide styling mappings for status badge components"]
112
- // CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
113
- // CIL[DOC-CONTRACT inputs="none" outputs="CSS class mapping object" errors="none" side_effects="none"]
114
- // CIL[DOC-MICRO logic_summary="Maps status strings to Tailwind color classes for consistent styling" notable_decisions="[]"]
115
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
116
- // CIL[DOC-STABILITY stability="stable"]
117
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
118
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
119
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
120
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
169
+ // CIL[DOC-VECTOR type="context" content="purpose='Map an InviteRow status to a human-readable display status'; No verified external callers; imports: .framework/src/lib/api.ts"]
170
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
171
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
172
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
121
173
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
122
174
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
175
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:deriveDisplayStatus:function"]
176
+
177
+
178
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:status_classes:constant" type="constant" identity="status_classes" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
179
+ // CIL[DOC-MACRO purpose="Provide Tailwind color classes for display status badges"]
180
+ // CIL[DOC-RESPONSIBILITY responsibility="Map each display status label to a background and text color class string"]
181
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
182
+ // CIL[DOC-CONTRACT inputs="none" outputs="STATUS_CLASSES record" errors="none" side_effects="none"]
183
+ // CIL[DOC-MICRO logic_summary="Define a Record from display status strings to Tailwind utility classes" notable_decisions="[]"]
184
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
185
+ // CIL[DOC-STABILITY stability="stable"]
186
+
123
187
  const STATUS_CLASSES: Record<string, string> = {
124
188
  pending: 'bg-yellow-100 text-yellow-800',
125
189
  'pending approval': 'bg-blue-100 text-blue-800',
@@ -129,21 +193,25 @@ const STATUS_CLASSES: Record<string, string> = {
129
193
  blocked: 'bg-red-100 text-red-800',
130
194
  revoked: 'bg-slate-100 text-slate-500',
131
195
  }
132
- // CIL[END chunk_id="InviteManager_statusclasses_1783927912"]
133
- // CIL[BEGIN chunk_id="InviteManager_timeuntil_1783927912" type="function" identity="timeUntil" parent="none"]
134
- // CIL[DOC-MACRO purpose="Calculate human-readable time until expiration from ISO date"]
135
- // CIL[DOC-RESPONSIBILITY responsibility="Format time remaining as days or hours until expiry"]
136
- // CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
137
- // CIL[DOC-CONTRACT inputs="none" outputs="Time remaining string" errors="none" side_effects="none"]
138
- // CIL[DOC-MICRO logic_summary="Computes time difference, returns days/hours or 'expired' if past" notable_decisions="[]"]
139
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
140
- // CIL[DOC-STABILITY stability="stable"]
141
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 1. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, \."]
142
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
143
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
144
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
196
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide Tailwind color classes for display status badges'; No verified external callers; imports: .framework/src/lib/api.ts"]
197
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
198
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
199
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
145
200
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
146
201
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
202
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:status_classes:constant"]
203
+
204
+
205
+
206
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:timeUntil:function" type="function" identity="timeUntil" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
207
+ // CIL[DOC-MACRO purpose="Format the remaining time until an ISO expiration"]
208
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert an ISO timestamp into days or hours remaining, or a dash if missing"]
209
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
210
+ // CIL[DOC-CONTRACT inputs="iso: string | null" outputs="formatted remaining time string" errors="none" side_effects="none"]
211
+ // CIL[DOC-MICRO logic_summary="Compute difference between target and now, returning days, hours, expired, or em dash" notable_decisions="[]"]
212
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
213
+ // CIL[DOC-STABILITY stability="stable"]
214
+
147
215
  function timeUntil(iso: string | null): string {
148
216
  if (!iso) return '—'
149
217
  const diff = new Date(iso).getTime() - Date.now()
@@ -153,21 +221,23 @@ function timeUntil(iso: string | null): string {
153
221
  if (days > 0) return `${days}d`
154
222
  return `${hours}h`
155
223
  }
156
- // CIL[END chunk_id="InviteManager_timeuntil_1783927912"]
157
- // CIL[BEGIN chunk_id="InviteManager_invitemanager_1783927912" type="function" identity="InviteManager" parent="none"]
158
- // CIL[DOC-MACRO purpose="Manage invite creation, listing, and actions with searchable table UI"]
159
- // CIL[DOC-RESPONSIBILITY responsibility="Provide complete invite management interface with form and table"]
160
- // CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[]"]
161
- // CIL[DOC-CONTRACT inputs="none" outputs="Invite management UI" errors="API errors" side_effects="Renders UI, API calls"]
162
- // CIL[DOC-MICRO logic_summary="Handles invite generation, listing, searching, sorting, and bulk actions" notable_decisions="[]"]
163
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
164
- // CIL[DOC-STABILITY stability="stable"]
165
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: none."]
166
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
167
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
168
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
224
+ // CIL[DOC-VECTOR type="context" content="purpose='Format the remaining time until an ISO expiration'; No verified external callers; imports: .framework/src/lib/api.ts"]
225
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
226
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
227
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
169
228
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
170
229
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
230
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:timeUntil:function"]
231
+
232
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManager:component" type="component" identity="InviteManager" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
233
+ // CIL[DOC-MACRO purpose="Render an invite management UI for generating and administering invites"]
234
+ // CIL[DOC-RESPONSIBILITY responsibility="Load, search, sort, generate, reinvite, and approve or deny invites in account or system scope"]
235
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
236
+ // CIL[DOC-CONTRACT inputs="accountId, allowedRoles, roleSlugsFilter, scope" outputs="JSX invite list and generation form" errors="sets error state on API failures" side_effects="calls invites API, reads clipboard, updates local state and reloads list"]
237
+ // CIL[DOC-MICRO logic_summary="Maintain invite list, form state, search and sort, handle create, reinvite, approve and deny actions, and render a table of rows with status badges and action buttons" notable_decisions="[]"]
238
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
239
+ // CIL[DOC-STABILITY stability="stable"]
240
+
171
241
  export function InviteManager({ accountId, allowedRoles, roleSlugsFilter, scope }: InviteManagerProps) {
172
242
  const [invites, setInvites] = useState<InviteRow[]>([])
173
243
  const [loading, setLoading] = useState(true)
@@ -428,15 +498,39 @@ export function InviteManager({ accountId, allowedRoles, roleSlugsFilter, scope
428
498
  </thead>
429
499
  <tbody className="divide-y divide-slate-100">
430
500
  {filteredInvites.map(row => {
501
+
502
+
431
503
  const displayStatus = deriveDisplayStatus(row)
504
+
505
+
506
+
432
507
  const isPending = row.status === 'invited' && !row.blocked_at && !(row.expires_at && new Date(row.expires_at) < new Date())
508
+
509
+
510
+
433
511
  const isExpired = displayStatus === 'expired'
512
+
513
+
514
+
434
515
  const isBlocked = displayStatus === 'blocked'
516
+
517
+
518
+
435
519
  const isRevoked = displayStatus === 'revoked'
520
+
521
+
522
+
436
523
  const isClaimed = displayStatus === 'claimed'
524
+
525
+
526
+
437
527
  const isApproved = displayStatus === 'approved'
528
+
529
+
530
+
438
531
  const isAccessReq = row.status === 'pending' && row.kind === 'access_request'
439
532
 
533
+
440
534
  return (
441
535
  <tr key={row.id} className="hover:bg-slate-50">
442
536
  <td className="px-4 py-3 text-sm text-slate-900">{row.full_name || '—'}</td>
@@ -556,21 +650,31 @@ export function InviteManager({ accountId, allowedRoles, roleSlugsFilter, scope
556
650
  </div>
557
651
  )
558
652
  }
559
- // CIL[END chunk_id="InviteManager_invitemanager_1783927912"]
560
- // CIL[BEGIN chunk_id="InviteManager_sortth_1783927912" type="function" identity="SortTh" parent="none"]
561
- // CIL[DOC-MACRO purpose="Render sortable table header with sort direction indicator"]
562
- // CIL[DOC-RESPONSIBILITY responsibility="Create clickable table header with visual sort state"]
563
- // CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[]"]
564
- // CIL[DOC-CONTRACT inputs="none" outputs="Table header element" errors="none" side_effects="Renders UI, calls onSort"]
565
- // CIL[DOC-MICRO logic_summary="Shows sort arrows and handles click events for column sorting" notable_decisions="[]"]
566
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
567
- // CIL[DOC-STABILITY stability="stable"]
568
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: none."]
569
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
570
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
571
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
653
+ // CIL[DOC-VECTOR type="context" content="purpose='Render an invite management UI for generating and administering invites'; No verified external callers; imports: .framework/src/lib/api.ts"]
654
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
655
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
656
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
572
657
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
573
658
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
659
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManager:component"]
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:SortTh:component" type="component" identity="SortTh" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
670
+ // CIL[DOC-MACRO purpose="Render a clickable table header for sorting"]
671
+ // CIL[DOC-RESPONSIBILITY responsibility="Display a column label with ascending, descending, or both indicator and trigger sort callback on click"]
672
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
673
+ // CIL[DOC-CONTRACT inputs="label, col, current, dir, onSort" outputs="th element with sort arrow" errors="none" side_effects="calls onSort with the selected column"]
674
+ // CIL[DOC-MICRO logic_summary="Show an up, down, or bidirectional arrow based on active state and direction" notable_decisions="[]"]
675
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
676
+ // CIL[DOC-STABILITY stability="stable"]
677
+
574
678
  function SortTh({
575
679
  label, col, current, dir, onSort
576
680
  }: {
@@ -591,4 +695,10 @@ function SortTh({
591
695
  </th>
592
696
  )
593
697
  }
594
- // CIL[END chunk_id="InviteManager_sortth_1783927912"]
698
+ // CIL[DOC-VECTOR type="context" content="purpose='Render a clickable table header for sorting'; No verified external callers; imports: .framework/src/lib/api.ts"]
699
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
700
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
701
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
702
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
703
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
704
+ // CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:SortTh:component"]
@@ -1,11 +1,53 @@
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/shared/MemberList.tsx"]
2
+ // CIL[DOC-MACRO purpose="MemberList shared component module"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Imports React hooks and the shared apiFetch client for the MemberList component."]
4
+ // CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/lib/api.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Sets up the MemberList module by importing React hooks and the shared apiFetch utility." notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="shared-ui"]
10
+
1
11
  import React, { useState, useEffect, useCallback, useMemo } from 'react'
2
12
  import { apiFetch } from '../../lib/api'
3
13
 
14
+ // CIL[DOC-VECTOR type="context" content="purpose='MemberList shared component module'; No verified external callers; imports: .framework/src/lib/api.ts"]
15
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
16
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
17
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
18
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
20
+ // CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:module_header:module_header"]
21
+
22
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:allowedrole:interface" type="interface" identity="allowedrole" parent="~/.framework/src/components/shared/MemberList.tsx"]
23
+ // CIL[DOC-MACRO purpose="AllowedRole interface definition"]
24
+ // CIL[DOC-RESPONSIBILITY responsibility="Defines the shape of a selectable role for members."]
25
+ // CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
26
+ // CIL[DOC-CONTRACT inputs="none" outputs="AllowedRole object" errors="none" side_effects="none"]
27
+ // CIL[DOC-MICRO logic_summary="Declares slug and name properties for an allowed role." notable_decisions="[]"]
28
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
29
+ // CIL[DOC-STABILITY stability="stable"]
4
30
  export interface AllowedRole {
5
31
  slug: string
6
32
  name: string
7
33
  }
34
+ // CIL[DOC-VECTOR type="context" content="purpose='AllowedRole interface definition'; No verified external callers; imports: .framework/src/lib/api.ts"]
35
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
36
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
37
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
38
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
39
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
40
+ // CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:allowedrole:interface"]
41
+
8
42
 
43
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:member:interface" type="interface" identity="member" parent="~/.framework/src/components/shared/MemberList.tsx"]
44
+ // CIL[DOC-MACRO purpose="Member interface definition"]
45
+ // CIL[DOC-RESPONSIBILITY responsibility="Defines the shape of a member row returned by the invites API."]
46
+ // CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
47
+ // CIL[DOC-CONTRACT inputs="none" outputs="Member object" errors="none" side_effects="none"]
48
+ // CIL[DOC-MICRO logic_summary="Declares id, full_name, email, status, nested role, and is_active fields for a member." notable_decisions="[]"]
49
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
50
+ // CIL[DOC-STABILITY stability="stable"]
9
51
  interface Member {
10
52
  id: string
11
53
  full_name: string | null
@@ -14,7 +56,23 @@ interface Member {
14
56
  role: { id: string; slug: string; name: string } | null
15
57
  is_active: boolean
16
58
  }
59
+ // CIL[DOC-VECTOR type="context" content="purpose='Member interface definition'; No verified external callers; imports: .framework/src/lib/api.ts"]
60
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
61
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
62
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
63
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
64
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
65
+ // CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:member:interface"]
17
66
 
67
+
68
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:callinvitesapi:function" type="function" identity="callinvitesapi" parent="~/.framework/src/components/shared/MemberList.tsx"]
69
+ // CIL[DOC-MACRO purpose="Call invites API helper"]
70
+ // CIL[DOC-RESPONSIBILITY responsibility="Sends GET or POST requests to the Netlify invites function endpoint."]
71
+ // CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
72
+ // CIL[DOC-CONTRACT inputs="action: string, params: Record<string, any>, method: 'GET' | 'POST'" outputs="JSON response" errors="throws on network or invalid response" side_effects="none"]
73
+ // CIL[DOC-MICRO logic_summary="Builds a query string for GET requests and a JSON body for POST requests, then fetches via apiFetch." notable_decisions="[]"]
74
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
75
+ // CIL[DOC-STABILITY stability="stable"]
18
76
  async function callInvitesApi(action: string, params: Record<string, any> = {}, method: 'GET' | 'POST' = 'GET') {
19
77
  const base = '/.netlify/functions/invites'
20
78
  if (method === 'GET') {
@@ -29,12 +87,44 @@ async function callInvitesApi(action: string, params: Record<string, any> = {},
29
87
  })
30
88
  return res.json()
31
89
  }
90
+ // CIL[DOC-VECTOR type="context" content="purpose='Call invites API helper'; No verified external callers; imports: .framework/src/lib/api.ts"]
91
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
92
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
93
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
94
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
95
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
96
+ // CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:callinvitesapi:function"]
97
+
32
98
 
99
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlistprops:interface" type="interface" identity="memberlistprops" parent="~/.framework/src/components/shared/MemberList.tsx"]
100
+ // CIL[DOC-MACRO purpose="MemberListProps interface definition"]
101
+ // CIL[DOC-RESPONSIBILITY responsibility="Defines the props accepted by the MemberList component."]
102
+ // CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
103
+ // CIL[DOC-CONTRACT inputs="none" outputs="MemberListProps object" errors="none" side_effects="none"]
104
+ // CIL[DOC-MICRO logic_summary="Declares optional accountId and required allowedRoles props for MemberList." notable_decisions="[]"]
105
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
106
+ // CIL[DOC-STABILITY stability="stable"]
33
107
  export interface MemberListProps {
34
108
  accountId?: string
35
109
  allowedRoles: AllowedRole[]
36
110
  }
111
+ // CIL[DOC-VECTOR type="context" content="purpose='MemberListProps interface definition'; No verified external callers; imports: .framework/src/lib/api.ts"]
112
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
113
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
114
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
115
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
116
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
117
+ // CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlistprops:interface"]
118
+
37
119
 
120
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlist:function" type="function" identity="memberlist" parent="~/.framework/src/components/shared/MemberList.tsx"]
121
+ // CIL[DOC-MACRO purpose="MemberList React component"]
122
+ // CIL[DOC-RESPONSIBILITY responsibility="Renders a searchable, role-editable table of active account members."]
123
+ // CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
124
+ // CIL[DOC-CONTRACT inputs="accountId: string | undefined, allowedRoles: AllowedRole[]" outputs="JSX table of active members" errors="displays API errors inline" side_effects="calls invites API on load and role/deactivate actions"]
125
+ // CIL[DOC-MICRO logic_summary="Loads active members, filters by search string, renders role selects and action buttons, and supports updating or deactivating members." notable_decisions="[]"]
126
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
127
+ // CIL[DOC-STABILITY stability="stable"]
38
128
  export function MemberList({ accountId, allowedRoles }: MemberListProps) {
39
129
  const [members, setMembers] = useState<Member[]>([])
40
130
  const [loading, setLoading] = useState(true)
@@ -180,3 +270,10 @@ export function MemberList({ accountId, allowedRoles }: MemberListProps) {
180
270
  </div>
181
271
  )
182
272
  }
273
+ // CIL[DOC-VECTOR type="context" content="purpose='MemberList React component'; No verified external callers; imports: .framework/src/lib/api.ts"]
274
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
275
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
276
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
277
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
278
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
279
+ // CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlist:function"]