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,21 +1,23 @@
1
- /**
2
- * @module app-manifest
3
- * @audience core-contributor
4
- * @layer shared-util
5
- * @stability evolving
6
- *
7
- * Utility for loading and merging app manifests with database records.
8
- * Enables file-first app configuration with database tracking installations.
9
- *
10
- * **Pattern:**
11
- * 1. Manifest files in custom/apps/{slug}/manifest.json are source of truth
12
- * 2. Database tracks which tenant has which app installed/enabled
13
- * 3. This utility merges both sources for the API response
14
- *
15
- * @seeAlso apps.ts (uses this for manifest-driven responses)
16
- * @seeAlso 015_simplify_apps_table.sql (database structure)
17
- */
18
1
 
2
+
3
+
4
+
5
+
6
+ // CIL[BEGIN chunk_id="app-manifest_moduleheader_1784066609" type="module_header" identity="module_header" parent="none"]
7
+ // CIL[DOC-MACRO purpose="App manifest loading and management"]
8
+ // CIL[DOC-RESPONSIBILITY responsibility="Load and merge app configuration manifests"]
9
+ // CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
10
+ // CIL[DOC-CONTRACT inputs="none" outputs="manifest utilities" errors="none" side_effects="file system access"]
11
+ // CIL[DOC-MICRO logic_summary="Defines AppManifest, NavItem interfaces and manifest cache" notable_decisions="[]"]
12
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
13
+ // CIL[DOC-STABILITY stability="stable"]
14
+ // CIL[DOC-AUDIENCE audience="developer"]
15
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/RolesPage.tsx, \."]
16
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
17
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
18
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
19
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
20
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
19
21
  import { readFileSync } from 'fs'
20
22
  import { resolve } from 'path'
21
23
 
@@ -24,7 +26,7 @@ export interface AppManifest {
24
26
  slug: string
25
27
  description?: string
26
28
  version?: string
27
- required_roles: string[] // Migrated from min_role (string) to array
29
+ required_roles: string[]
28
30
  route_prefix?: string
29
31
  renderer?: 'generic' | 'custom' | 'none'
30
32
  routes: string[]
@@ -46,41 +48,44 @@ export interface NavItem {
46
48
  children?: NavItem[]
47
49
  }
48
50
 
49
- // Cache for manifest content (development mode - no caching in production)
50
51
  const manifestCache = new Map<string, AppManifest>()
51
52
 
52
- /**
53
- * Loads a manifest.json file from the filesystem.
54
- *
55
- * @param manifestPath - Relative path to manifest (e.g., 'custom/apps/cortex/manifest.json')
56
- * @returns Parsed manifest or null if not found
57
- */
53
+ // CIL[END chunk_id="app-manifest_moduleheader_1784066609"]
54
+ // CIL[BEGIN chunk_id="app-manifest_loadmanifest_1784066609" type="function" identity="loadManifest" parent="none"]
55
+ // CIL[DOC-MACRO purpose="Load app manifest from file"]
56
+ // CIL[DOC-RESPONSIBILITY responsibility="Read and parse manifest JSON with caching"]
57
+ // CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
58
+ // CIL[DOC-CONTRACT inputs="none" outputs="AppManifest or null" errors="file system errors" side_effects="file reads"]
59
+ // CIL[DOC-MICRO logic_summary="Loads manifest from disk with validation and caching" notable_decisions="[]"]
60
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
61
+ // CIL[DOC-STABILITY stability="stable"]
62
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
63
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
64
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
65
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
66
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
67
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
58
68
  export function loadManifest(manifestPath: string): AppManifest | null {
59
- // Check cache first (dev only)
60
69
  if (manifestCache.has(manifestPath)) {
61
70
  return manifestCache.get(manifestPath)!
62
71
  }
63
72
 
64
73
  try {
65
- // Resolve from project root (functions are at .assembled/netlify/functions/)
66
74
  const projectRoot = resolve(__dirname, '../../../..')
67
75
  const fullPath = resolve(projectRoot, manifestPath)
68
76
 
69
77
  const content = readFileSync(fullPath, 'utf-8')
70
78
  const manifest: AppManifest = JSON.parse(content)
71
79
 
72
- // Validate required fields
73
80
  if (!manifest.slug || !manifest.name) {
74
81
  console.error(`[app-manifest] Invalid manifest at ${manifestPath}: missing slug or name`)
75
82
  return null
76
83
  }
77
84
 
78
- // Ensure required_roles is array (backward compat)
79
85
  if (!manifest.required_roles) {
80
86
  manifest.required_roles = []
81
87
  }
82
88
 
83
- // Cache for development (dev server restarts clear cache)
84
89
  manifestCache.set(manifestPath, manifest)
85
90
 
86
91
  return manifest
@@ -89,27 +94,43 @@ export function loadManifest(manifestPath: string): AppManifest | null {
89
94
  return null
90
95
  }
91
96
  }
92
-
93
- /**
94
- * Clears the manifest cache. Useful for testing.
95
- */
97
+ // CIL[END chunk_id="app-manifest_loadmanifest_1784066609"]
98
+ // CIL[BEGIN chunk_id="app-manifest_clearmanifestcache_1784066609" type="function" identity="clearManifestCache" parent="none"]
99
+ // CIL[DOC-MACRO purpose="Clear manifest cache"]
100
+ // CIL[DOC-RESPONSIBILITY responsibility="Reset cached manifest data"]
101
+ // CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\"\\\"]"]
102
+ // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="none" side_effects="cache clearing"]
103
+ // CIL[DOC-MICRO logic_summary="Clears all cached manifest entries" notable_decisions="[]"]
104
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
105
+ // CIL[DOC-STABILITY stability="stable"]
106
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: \."]
107
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
108
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
109
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
110
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
111
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
96
112
  export function clearManifestCache(): void {
97
113
  manifestCache.clear()
98
114
  }
99
-
100
- /**
101
- * Merges database app record with manifest data.
102
- * Manifest takes precedence for metadata fields.
103
- *
104
- * @param dbRecord - App record from app_definitions table
105
- * @returns Merged app data for API response
106
- */
115
+ // CIL[END chunk_id="app-manifest_clearmanifestcache_1784066609"]
116
+ // CIL[BEGIN chunk_id="app-manifest_mergewithmanifest_1784066609" type="function" identity="mergeWithManifest" parent="none"]
117
+ // CIL[DOC-MACRO purpose="Merge database record with manifest"]
118
+ // CIL[DOC-RESPONSIBILITY responsibility="Combine DB and manifest configuration"]
119
+ // CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
120
+ // CIL[DOC-CONTRACT inputs="none" outputs="merged record" errors="manifest load errors" side_effects="file reads"]
121
+ // CIL[DOC-MICRO logic_summary="Merges database record with manifest file data" notable_decisions="[]"]
122
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
123
+ // CIL[DOC-STABILITY stability="stable"]
124
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
125
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
126
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
127
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
128
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
129
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
107
130
  export function mergeWithManifest(dbRecord: any): any {
108
131
  if (!dbRecord) return null
109
132
 
110
- // If no manifest path, return DB record as-is (legacy mode)
111
133
  if (!dbRecord.manifest_path || dbRecord.config_source !== 'manifest') {
112
- // Convert legacy min_role to required_roles for frontend compatibility
113
134
  return {
114
135
  ...dbRecord,
115
136
  required_roles: dbRecord.min_role ? [dbRecord.min_role] : [],
@@ -117,7 +138,6 @@ export function mergeWithManifest(dbRecord: any): any {
117
138
  }
118
139
  }
119
140
 
120
- // Load manifest and merge
121
141
  const manifest = loadManifest(dbRecord.manifest_path)
122
142
  if (!manifest) {
123
143
  console.warn(`[app-manifest] Could not load manifest for ${dbRecord.slug}, falling back to DB`)
@@ -128,54 +148,48 @@ export function mergeWithManifest(dbRecord: any): any {
128
148
  }
129
149
  }
130
150
 
131
- // Merge: Manifest metadata + DB state fields
132
151
  return {
133
152
  id: dbRecord.id,
134
153
  slug: manifest.slug,
135
154
  name: manifest.name,
136
155
  description: manifest.description || dbRecord.description,
137
-
138
- // Role-based access (new array format)
139
156
  required_roles: manifest.required_roles,
140
- min_role: manifest.required_roles[0] || null, // Backward compat
141
-
142
- // Navigation and routing
157
+ min_role: manifest.required_roles[0] || null,
143
158
  routes: manifest.routes,
144
159
  nav_items: manifest.nav_items,
145
-
146
- // Features and metadata
147
160
  features: manifest.features || [],
148
161
  dependencies: manifest.dependencies || [],
149
162
  version: manifest.version,
150
-
151
- // Database state fields
152
163
  is_active: dbRecord.is_active,
153
164
  is_system: dbRecord.is_system,
154
165
  is_public: manifest.is_public ?? false,
155
166
  auth_required: manifest.auth_required ?? true,
156
-
157
- // Installation tracking
158
167
  account_id: dbRecord.account_id,
159
168
  pack_id: dbRecord.pack_id,
160
169
  ownership: dbRecord.ownership,
161
-
162
- // Internal
163
170
  _source: 'manifest',
164
171
  _manifest_path: dbRecord.manifest_path
165
172
  }
166
173
  }
167
-
168
- /**
169
- * Lists all available manifests from filesystem.
170
- * Used for initial discovery before database tracking.
171
- *
172
- * @returns Array of discovered app slugs and their paths
173
- */
174
+ // CIL[END chunk_id="app-manifest_mergewithmanifest_1784066609"]
175
+ // CIL[BEGIN chunk_id="app-manifest_discovermanifests_1784066609" type="function" identity="discoverManifests" parent="none"]
176
+ // CIL[DOC-MACRO purpose="Discover available app manifests"]
177
+ // CIL[DOC-RESPONSIBILITY responsibility="Return list of known manifest paths"]
178
+ // CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[]"]
179
+ // CIL[DOC-CONTRACT inputs="none" outputs="manifest list" errors="none" side_effects="none"]
180
+ // CIL[DOC-MICRO logic_summary="Returns hardcoded list of app manifest locations" notable_decisions="[]"]
181
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
182
+ // CIL[DOC-STABILITY stability="stable"]
183
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: none."]
184
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
185
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
186
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
187
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
188
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
174
189
  export function discoverManifests(): Array<{slug: string, path: string}> {
175
- // In production, this would scan the filesystem
176
- // For now, return known manifests based on the plan
177
190
  return [
178
191
  { slug: 'cortex', path: 'custom/apps/cortex/manifest.json' },
179
192
  { slug: 'customer-portal', path: 'custom/apps/customer-portal/manifest.json' }
180
193
  ]
181
194
  }
195
+ // CIL[END chunk_id="app-manifest_discovermanifests_1784066609"]
@@ -1,47 +1,53 @@
1
- /**
2
- * @module audit
3
- * @audience both
4
- * @layer shared-core
5
- * @stability stable
6
- *
7
- * Unified audit logging for all operations in Spine. Every state-changing
8
- * operation should call `emitAudit` to write a structured row to the `logs`
9
- * table with full principal provenance. Audit failures never throw — a failed
10
- * log write must never break the operation that triggered it.
11
- *
12
- * INVARIANT: always call `emitAudit` after a successful write, not before.
13
- * Pass `result: 'failure'` only when the operation itself failed.
14
- * INVARIANT: never pass sensitive secrets (API keys, tokens) in metadata.
15
- *
16
- * @seeAlso principal.ts (formatPrincipalForAudit — shapes the principal field)
17
- * @seeAlso middleware.ts (CoreContext — ctx.requestId ties logs to HTTP requests)
18
- * @seeAlso logs.ts (API handler that queries the logs table)
19
- * @seeAlso permissions.ts (getPrincipalPermissionSummary — used in metadata)
20
- */
21
1
 
2
+
3
+
4
+ // CIL[BEGIN chunk_id="audit_moduleheader_1784068075" type="module_header" identity="module_header" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Audit logging system imports"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Import dependencies for audit functionality"]
7
+ // CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="imports" errors="none" side_effects="module imports"]
9
+ // CIL[DOC-MICRO logic_summary="Imports CoreContext, database, and principal utilities" 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: infrastructure. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.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"]
22
19
  import { CoreContext } from './middleware'
23
20
  import { adminDb } from './db'
24
21
  import { Principal, formatPrincipalForAudit } from './principal'
22
+ import { Span, TraceContext } from './tracing'
23
+ // CIL[END chunk_id="audit_moduleheader_1784068075"]
24
+ // CIL[BEGIN chunk_id="audit_emitaudit_1784068075" type="function" identity="emitAudit" parent="none"]
25
+ // CIL[DOC-MACRO purpose="Emit audit log entries"]
26
+ // CIL[DOC-RESPONSIBILITY responsibility="Write structured audit logs to database"]
27
+ // CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/015_simplify_apps_table.sql\"]"]
28
+ // CIL[DOC-CONTRACT inputs="none" outputs="Promise<void>" errors="database errors" side_effects="database writes"]
29
+ // CIL[DOC-MICRO logic_summary="Inserts audit records with principal context and metadata" notable_decisions="[]"]
30
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
31
+ // CIL[DOC-STABILITY stability="stable"]
32
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/015_simplify_apps_table.sql."]
33
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
34
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
35
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
36
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
37
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
38
+ function traceFields(ctx: CoreContext): Partial<Record<string, any>> {
39
+ const trace = (ctx as any).trace as TraceContext | undefined
40
+ if (!trace) return {}
41
+ return {
42
+ trace_id: trace.traceId,
43
+ span_id: trace.spanId,
44
+ parent_span_id: trace.parentSpanId,
45
+ trace_flags: trace.traceFlags,
46
+ tracestate: trace.traceState,
47
+ sampled: trace.sampled
48
+ }
49
+ }
25
50
 
26
- // ─── PRIMARY AUDIT FUNCTION ───────────────────────────────────────────────────
27
-
28
- // ─── CHUNK_START: SHARED_AUDIT_EMIT ──────────────────────────────────────────────
29
- /**
30
- * @chunk-id SHARED_AUDIT_EMIT_1_0_0
31
- * @version 1.0.0
32
- * @hash d9c3dbc103f5f2f0543dc4c154bbad256e59c885643a20bc20ca07198eabd67c
33
- * @macro Audit Log Emitter
34
- * @micro Writes structured audit logs to logs table with principal provenance
35
- * @inputs ctx: CoreContext — Request context with principal and database
36
- * @inputs action: string — Dot-namespaced action (e.g. 'items.create')
37
- * @inputs target: {type, id?, account_id?} — Resource being acted upon
38
- * @inputs metadata: {changes?, result?, error?, ...} — Optional context
39
- * @outputs void — Always resolves, never rejects
40
- * @depends-on [adminDb, formatPrincipalForAudit]
41
- * @depended-by [All state-changing API functions, pipeline-runner, trigger-engine]
42
- * @side-effects [DB insert to logs table, console.error on failure]
43
- * @tags audit, logging, security, compliance
44
- */
45
51
  export async function emitAudit(
46
52
  ctx: CoreContext,
47
53
  action: string,
@@ -54,13 +60,21 @@ export async function emitAudit(
54
60
  }
55
61
  ): Promise<void> {
56
62
  try {
57
- // Use the RLS-scoped db from context, or fallback to adminDb
58
63
  const logDb = ctx.db || adminDb
59
-
64
+ const result = metadata?.result
65
+ const level = result === 'failure' || result === 'denied' ? 'warning' : 'info'
66
+
60
67
  await logDb.from('logs').insert({
61
- level: metadata?.result === 'failure' || metadata?.result === 'denied' ? 'warning' : 'info',
68
+ level,
62
69
  source: 'audit',
70
+ source_type: 'event',
63
71
  message: `${action} by ${ctx.principal?.type || 'unknown'}:${ctx.principal?.id || 'anonymous'}`,
72
+ span_name: action,
73
+ kind: 'event',
74
+ outcome: result === 'failure' ? 'failure' : result === 'denied' ? 'failure' : result === 'success' ? 'success' : null,
75
+ event_category: result ? 'business_outcome' : 'audit',
76
+ started_at: new Date().toISOString(),
77
+ ...traceFields(ctx),
64
78
  metadata: {
65
79
  principal: ctx.principal ? formatPrincipalForAudit(ctx.principal) : null,
66
80
  action,
@@ -76,31 +90,73 @@ export async function emitAudit(
76
90
  })
77
91
  } catch (err) {
78
92
  console.error('Failed to emit audit log:', err)
79
- // Don't throw - audit failures shouldn't break operations
80
93
  }
81
94
  }
82
- // ─── CHUNK_END: SHARED_AUDIT_EMIT ────────────────────────────────────────────────
83
95
 
84
- // ─── LEGACY EXPORTS ───────────────────────────────────────────────────────────
96
+ export async function emitSpan(
97
+ ctx: CoreContext,
98
+ span: Span,
99
+ options?: {
100
+ action?: string
101
+ target?: { type: string; id?: string; account_id?: string }
102
+ level?: string
103
+ kind?: string
104
+ event_category?: string
105
+ metadata?: Record<string, any>
106
+ }
107
+ ): Promise<void> {
108
+ try {
109
+ const logDb = ctx.db || adminDb
110
+ const level = options?.level || (span.status === 'error' ? 'warning' : 'info')
111
+ const outcome = span.status === 'error' ? 'failure' : span.status === 'ok' ? 'success' : null
85
112
 
86
- // ─── CHUNK_START: SHARED_AUDIT_EMIT_LOG ──────────────────────────────────────────────
87
- /**
88
- * @chunk-id SHARED_AUDIT_EMIT_LOG_1_0_0
89
- * @version 1.0.0
90
- * @hash 148fb1ce7badf1d3df08e2daa38bac4c084c94ba2f262c782c9df092a22890dd
91
- * @macro Legacy Audit Log Wrapper
92
- * @micro Backward compatibility wrapper around emitAudit
93
- * @inputs ctx: CoreContext — Request context
94
- * @inputs eventType: string — Action string (maps to emitAudit's action)
95
- * @inputs target: {type, id} | undefined — Resource target
96
- * @inputs changes: {before?, after?} | undefined — Change data
97
- * @inputs metadata: Record<string, any> — Additional context
98
- * @outputs void — Always resolves
99
- * @depends-on [emitAudit]
100
- * @depended-by [Legacy code, should not be used in new code]
101
- * @side-effects [DB insert via emitAudit, console.error on failure]
102
- * @tags audit, logging, legacy, wrapper, deprecated
103
- */
113
+ await logDb.from('logs').insert({
114
+ level,
115
+ source: 'span',
116
+ source_type: 'span',
117
+ message: `${span.spanName} ${span.status === 'error' ? 'failed' : 'completed'}`,
118
+ trace_id: span.traceId,
119
+ span_id: span.spanId,
120
+ parent_span_id: span.parentSpanId,
121
+ trace_flags: span.traceFlags,
122
+ tracestate: span.traceState,
123
+ span_name: span.spanName,
124
+ started_at: span.startedAt,
125
+ ended_at: span.endedAt,
126
+ duration_ms: span.durationMs,
127
+ sampled: span.sampled,
128
+ kind: options?.kind || 'span',
129
+ outcome,
130
+ event_category: options?.event_category,
131
+ metadata: {
132
+ principal: ctx.principal ? formatPrincipalForAudit(ctx.principal) : null,
133
+ action: options?.action || span.spanName,
134
+ target: options?.target || { type: 'request', account_id: ctx.accountId },
135
+ request_id: ctx.requestId,
136
+ ...span.attributes,
137
+ ...(options?.metadata || {})
138
+ },
139
+ account_id: options?.target?.account_id || ctx.accountId || ctx.principal?.accountId || null
140
+ })
141
+ } catch (err) {
142
+ console.error('Failed to emit span log:', err)
143
+ }
144
+ }
145
+ // CIL[END chunk_id="audit_emitaudit_1784068075"]
146
+ // CIL[BEGIN chunk_id="audit_emitlog_1784068075" type="function" identity="emitLog" parent="none"]
147
+ // CIL[DOC-MACRO purpose="Emit general log entries"]
148
+ // CIL[DOC-RESPONSIBILITY responsibility="Wrapper for audit logging with change tracking"]
149
+ // CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
150
+ // CIL[DOC-CONTRACT inputs="none" outputs="Promise<void>" errors="audit errors" side_effects="database writes"]
151
+ // CIL[DOC-MICRO logic_summary="Delegates to emitAudit with structured change data" notable_decisions="[]"]
152
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
153
+ // CIL[DOC-STABILITY stability="stable"]
154
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/015_simplify_apps_table.sql, \."]
155
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
156
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
157
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
158
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
159
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
104
160
  export async function emitLog(
105
161
  ctx: CoreContext,
106
162
  eventType: string,
@@ -119,27 +175,23 @@ export async function emitLog(
119
175
  })
120
176
  } catch (error) {
121
177
  console.error('Failed to emit log:', error)
122
- // Don't throw - logging failures shouldn't break operations
123
178
  }
124
179
  }
125
- // ─── CHUNK_END: SHARED_AUDIT_EMIT_LOG ────────────────────────────────────────────────
126
-
127
- // ─── CHUNK_START: SHARED_AUDIT_EMIT_ACTIVITY ──────────────────────────────────────────────
128
- /**
129
- * @chunk-id SHARED_AUDIT_EMIT_ACTIVITY_1_0_0
130
- * @version 1.0.0
131
- * @hash 58e532a743fdae480ca24d311be66e82612477309270ec7462fd7dfd695d5282
132
- * @macro Legacy Activity Logger
133
- * @micro Wraps emitLog with activity. prefix for backward compatibility
134
- * @inputs ctx: CoreContext — Request context
135
- * @inputs type: string — Activity type (prefixed with 'activity.')
136
- * @inputs details: Record<string, any> — Metadata context
137
- * @outputs void — Always resolves
138
- * @depends-on [emitLog]
139
- * @depended-by [Legacy code, should not be used in new code]
140
- * @side-effects [DB insert via emitLog → emitAudit, console.error on failure]
141
- * @tags audit, logging, legacy, activity, deprecated
142
- */
180
+ // CIL[END chunk_id="audit_emitlog_1784068075"]
181
+ // CIL[BEGIN chunk_id="audit_emitactivity_1784068075" type="function" identity="emitActivity" parent="none"]
182
+ // CIL[DOC-MACRO purpose="Emit activity log entries"]
183
+ // CIL[DOC-RESPONSIBILITY responsibility="Log user activities with activity prefix"]
184
+ // CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
185
+ // CIL[DOC-CONTRACT inputs="none" outputs="Promise<void>" errors="log errors" side_effects="database writes"]
186
+ // CIL[DOC-MICRO logic_summary="Wraps emitLog with activity. prefix for categorization" notable_decisions="[]"]
187
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
188
+ // CIL[DOC-STABILITY stability="stable"]
189
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/015_simplify_apps_table.sql, \."]
190
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
191
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
192
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
193
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
194
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
143
195
  export async function emitActivity(
144
196
  ctx: CoreContext,
145
197
  type: string,
@@ -147,4 +199,4 @@ export async function emitActivity(
147
199
  ): Promise<void> {
148
200
  await emitLog(ctx, `activity.${type}`, undefined, undefined, details)
149
201
  }
150
- // ─── CHUNK_END: SHARED_AUDIT_EMIT_ACTIVITY ────────────────────────────────────────────────
202
+ // CIL[END chunk_id="audit_emitactivity_1784068075"]